После регистрации пользователь в базу таблицы users не попадает..В чем проблема?

Помогите пожалуйста найти ошибку. Голову уже сломал. Я только начал изучать php и sql запросы. После заполнения всех полей и нажатия кнопки регистрации пользователь в базу не попадает. Соединение с базой успешно. Таблица users создана. Проблема как раз в коде. вот где именно в упор не вижу.
action.php
<?php

 session_start();

 require_once 'auth.php';
 $user = new Auth();

 if(isset($_POST['action']) && $_POST['action'] == 'register'){
   $name = $user->test_input($_POST['name']);
   $email = $user->test_input($_POST['email']);
   $pass = $user->test_input($_POST['password']);

   $hpass = password_hash($pass, PASSWORD_DEFAULT);

   if($user->user_exist($email)){
    echo $user->showMessage('warning','This E-Mail is already registered!');
   }
   else{
    if($user->register($name,$email,$hpass)){
        echo 'register';
        $_SESSION['user'] = $email;
    }
    else{
        echo $user->showMessage('danger','Something went wrong! try again later!');
    }
   }
 }

?>

config.php
<?php

class Database{

    private $dsn = "mysql:host=localhost;dbname=db_user_system";
    private $dbuser = "programer";
    private $dbpass = "programer";

    public $conn;

    public function __construct(){
        try {
            $this->conn = new PDO($this->dsn,$this->dbuser,$this->dbpass);

        }catch (PDOException $e){
            echo 'Error : '.$e->getMessage();
        }

        return $this->conn;
    }

    //Check Input 
    public function test_input($data){
        $data = trim($data);
        $data = stripslashes($data);
        $data = htmlspecialchars($data);
        return $data;
    }

    //Error Success Message Alert
    public function showMessage($type, $message){
        return '<div class="alert alert-'.$type.' alert-dismissible">
                  <button type="button" class="close" data-dismiss="alert">&times;</button>
                  <strong class="text-center">'.$message.'</strong>
                </div>';
    }

}

?>

auth.php
<?php

    require_once 'config.php';

    class Auth extends Database{

        // Register New User
        public function register($name, $email, $password){
            $sql = "INSERT INTO users (name, email, password) VALUES (:name, :email, :pass)";
            $stmt = $this->conn->prepare($sql);
            $stmt->execute(['name'=>$name, 'email'=>$email, 'pass'=>$password]);
            return true;
        }

        //Check if user already registered
        public function user_exist($email){
            $sql = "SELECT email FROM users WHERE email = :email";
            $stmt = $this->conn->prepare($sql);
            $stmt->execute(['email'=>$email]);
            $result = $stmt->fetch(PDO::FETCH_ASSOC);

            return $result;
        }

    }

?>
  • Вопрос задан
  • 452 просмотра
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Как правильно написал Антон, пора знакомиться с таким понятием, как отладка.
Но дополним его ответ более практическими рекомендациями.

Во-первых, при создании соединения с БД, надо сказать ПДО, чтобы он сообщал об ошибках.
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Во-вторых, временно, на период разработки, включить отображение ошибок РНР. Чтобы тупо увидеть, если произошла какая-то ошибка.
ini_set('display_errors', 1);

И в-третьих, начать собственно отладку.
Для начала убедившись, что РНР код в принципе запускается, и проблема в нем, а не в форме.
Для этого в самом начале action.php пишем большими буквами
die("пхп хотя бы запустился");
И если после нажатия на кнопку мы этот текст не увидели, то начинаем тупить в свою форму - а с чего она вообще должна что-то посылать в файл action.php (и попутно задаваться вопросом - а какое отношение наш вопрос имеет к php и sql?)?
Если форма отправляется аяксом, то смотрим ответ пхп в инструментах разработчика, вкладка Сеть.

Если обработку формы мы начали, то заезжаем внутрь условия
die("начали обработку формы");

И так далее, отслеживаем работу своего кода, выполняется ли он вообще, и содержат ли переменные нужные значения.

А в целом, конечно, код очень жестокий.
Вот прямо хочется спросить -
зачем здесь функция test_input?
зачем здесь try {}catch (){echo 'Error : '.$e-getMessage();}?
зачем class Auth extends Database?
почему showMessage - это часть класса Database? Ну вот серьёзно, каким местом вывод сообщения в браузер в виде HTML хоть как-то относится к работе с базой данных?

Чтобы сделать этот код минимально осмысленным, надо
выкинуть класс Database
в класс Auth добавить
public function __construct($pdo){
            $this->conn = $pdo;
    }

и выкинуть из него require_once 'config.php';

В config.php оставить только соединение с PDO
в action написать
require 'config.php';
$user = new Auth($pdo);

и выкинуть условие при регистрации, оставив только
$user->register($name,$email,$hpass);
$_SESSION['user'] = $email;

И тогда этот код станет минимально осмысленным
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@iljaGolubev
Явно включите
class Database{
...
    public function __construct(){
        try {
            $this->conn = new PDO($this->dsn,$this->dbuser,$this->dbpass);
             $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


Отключите на время отладки js обработчик формы.
- добейтесь работы стандартным .

Убедитесь, что вообще в нужный кусок кода попадает
if(isset($_POST['action']) && $_POST['action'] == 'register'){
   die('POST WORK');
Ответ написан
Комментировать
sHinE
@sHinE
веб-разработчик, php/js/mysql и сопутствующее
Добро пожаловать в увлекательный мир отладки. Есть два стула пути:
1. Поставить и настроить отладчик и пошагово пройти скрипт, увидев в какой строке проблема.
2. Применить способ debug-print. В разных частях кода добавить вывод на экран какой-либо строки (типа echo "point 1"; и/или переменной (var_dump($name)). По выводу уже и определить, где ошибка.
Как-то так.
Ответ написан
Комментировать
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
А что, $stmt->errno/$stmt->error уже запретили?
Ответ написан
Anastasia2306
@Anastasia2306
PHP-разработчик.
Ошибка может быть связана с неправильным использованием fetch в методе user_exist класса Auth. fetch возвращает массив, который содержит все столбцы из следующей строки результирующего набора. Если тебе надо проверить, существует ли пользователь с определенным адресом электронной почты, то нужно проверить, что $result не пустой.

Также, в методе register класса Auth, ты не проверяешь, успешно ли выполнен запрос. Добавь проверку, чтобы убедиться, что запрос был успешно выполнен.

Типа того:
public function user_exist($email){
    $sql = "SELECT email FROM users WHERE email = :email";
    $stmt = $this->conn->prepare($sql);
    $stmt->execute(['email'=>$email]);
    $result = $stmt->fetch(PDO::FETCH_ASSOC);

    return $result ? true : false;
}

// Новый юзер
public function register($name, $email, $password){
    $sql = "INSERT INTO users (name, email, password) VALUES (:name, :email, :pass)";
    $stmt = $this->conn->prepare($sql);
    $stmt->execute(['name'=>$name, 'email'=>$email, 'pass'=>$password]);
    return $stmt->rowCount() > 0;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы