Код PHP PDO подключается к базе данных, но не выполняет запросы и не возвращает ошибки

Я пытаюсь создать систему регистрации и входа пользователей. Мой код подключается к базе данных, а форма передает данные, но операторы не выполняются. Сообщений об ошибках тоже нет.

public function reg_user($username, $email, $address, $pwd){
    $pass = password_hash($pwd, PASSWORD_BCRYPT);
    $check = $this->db->prepare('SELECT * FROM bakery_users WHERE u_mail = :u_mail');
    $check->bindParam(':u_mail', $email, PDO::PARAM_STR);
    $check->execute();
    $count = $check->rowCount();

    if ($count < 0){
        $reg = $db->prepare('INSERT INTO bakery_users (u_name, u_mail, u_add u_pass) VALUES (:u_name, :u_mail, :u_add, :u_pass)');
        $reg->bindParam(':u_mail', $username,PDO::PARAM_STR);
        $reg->bindParam(':u_mail', $email,PDO::PARAM_STR);
        $reg->bindParam(':u_add', $address,PDO::PARAM_STR); 
        $reg->bindParam(':u_pass', $pass,PDO::PARAM_STR);
        $reg->execute();
        return true;
    }else{
        $db = null;
        return false;
    }
}  

Скорее всего, count возвращает 0 или больше 0... не меньше 0

Tanatos 27.02.2019 08:55

Вам не хватает запятой в операторе вставки. Между u_add и u_pass.

yivi 27.02.2019 09:31

Как вы ожидаете, что $count будет меньше, чем ноль?

yivi 27.02.2019 09:34

Если вы модифицируете свой вопрос каждый раз, когда кто-то дает вам ответ, это делает ответы неправильными !!! Поэтому, пожалуйста, не делайте этого. Если вы хотите сказать, что вы что-то изменили, но это все еще не работает, повторно вставьте измененный код под заголовком ОБНОВЛЕНИЕ, если необходимо.

RiggsFolly 27.02.2019 12:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
4
60
2

Ответы 2

Основная проблема, я считаю, заключается в операторе sql - в нем отсутствует запятая между u_add и u_pass

$reg = $db->prepare('INSERT INTO bakery_users (u_name, u_mail, u_add, u_pass) VALUES (:u_name, :u_mail, :u_add, :u_pass)');

Если вы проверите возвращаемое значение prepare, вы можете разветвить логику в зависимости от ее успеха/неудачи.

        if ( $reg ){
            $reg->bindParam(':u_mail', $username,PDO::PARAM_STR);
            $reg->bindParam(':u_mail', $email,PDO::PARAM_STR);
            $reg->bindParam(':u_add', $address,PDO::PARAM_STR);
            $reg->bindParam(':u_pass', $pass,PDO::PARAM_STR);
            $reg->execute();
            return true;            
        } else {
            exit('error');
        }

У вас также есть параметр с неправильным названием в первом операторе привязки.

$reg->bindParam(':u_mail', $username,PDO::PARAM_STR);

должно быть

$reg->bindParam(':u_name', $username,PDO::PARAM_STR);

Вы можете использовать блок try/catch, чтобы попытаться выявить проблемы конструктивным образом, как показано ниже.

public function reg_user($username, $email, $address, $pwd){
    try{
        $pass = password_hash($pwd, PASSWORD_BCRYPT);
        $check = $this->db->prepare('SELECT * FROM `bakery_users` WHERE `u_mail` = :u_mail');
        if ( !$check )throw new Exception('Failed to prepare SELECT query');

        $check->bindParam(':u_mail', $email, PDO::PARAM_STR);
        $check->execute();
        $count = $check->rowCount();

        if ( $count < 0 ){

            $reg = $db->prepare('INSERT INTO `bakery_users` (`u_name`, `u_mail`, `u_add`, `u_pass` ) VALUES ( :u_name, :u_mail, :u_add, :u_pass )');

            if ( $reg ){
                $reg->bindParam(':u_name', $username,PDO::PARAM_STR);
                $reg->bindParam(':u_mail', $email,PDO::PARAM_STR);
                $reg->bindParam(':u_add', $address,PDO::PARAM_STR);
                $reg->bindParam(':u_pass', $pass,PDO::PARAM_STR);
                $reg->execute();

                return true;            
            } else {
                throw new Exception('Failed to prepare INSERT query')
            }
        } else{
           $db = null;
           return false;
        }
    }catch( Exception $e ){
        exit( sprintf('An error "%s" on line %d of "%s"',$e->getMessage(),$e->getLine(),__METHOD__ ) );
    }
}

Я должен был раньше заметить использование if ( $count < 0 ) ~ это должно быть if ( $count==0 )

public function reg_user( $username=false, $email=false, $address=false, $pwd=false ){
    try{
        if ( !( $username & $email & $address & $pwd ) ) throw new Exception('bad foo');

        $sql='SELECT * FROM `bakery_users` WHERE `u_mail` = :u_mail';
        $stmt = $this->db->prepare( $sql );

        if ( !$stmt ) throw new Exception('Failed to prepare SELECT query');

        $args=array( ':u_mail' => $email );
        $stmt->execute( $args );
        $count = $stmt->rowCount();

        if ( $count == 0 ){
            $sql='INSERT INTO `bakery_users` ( `u_name`, `u_mail`, `u_add`, `u_pass` ) VALUES ( :u_name, :u_mail, :u_add, :u_pass )';
            $stmt = $db->prepare( $sql );
            if ( $stmt ){
                $args=array(
                    ':u_name'   =>  $username,
                    ':u_mail'   =>  $email,
                    ':u_add'    =>  $address,
                    ':u_pass'   =>  password_hash( $pwd, PASSWORD_BCRYPT )
                );
                return $stmt->execute( $args );       
            } else {
                throw new Exception('Failed to prepare INSERT query')
            }
        } else{
           $db = null;
           return false;
        }
    }catch( Exception $e ){
        exit( sprintf( 'An error "%s" on line %d of "%s"', $e->getMessage(), $e->getLine(), __METHOD__ ) );
    }
}

There are no error messages either

потому что вы используете неправильный режим ошибки PDO, вы используете режим по умолчанию, который, iirc, называется PDO::ERRMODE_SILENT

это НАШИ правильный способ создания объекта PDO:

$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4', 'username', 'password', 
array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

и когда вы создали свой, вы забыли PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION-часть.

Спасибо @hanshenrik! Но до сих пор нет ошибок. вот полный код подключения class BakeryModel { public $db; function __construct(){ try{ $this->db = new PDO('mysql:host=localhost;dbname=bakerydb;charset=utf8mb4', 'root', '', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); } catch (PDOEXCEPTION $e){ echo "connection failed:" .$e->getMessage(); } } .

Zeekstem 27.02.2019 12:18

@Zeekstem о, тогда это, вероятно, PHP White screen of death, у вас есть неперехваченное исключение, и у вас есть display_errors = Off в php.ini, журнал ошибок должен ждать вас в журнале ошибок php :) (ps, в большинстве конфигураций php журнал ошибок перенаправляется в журнал ошибок веб-сервера, поэтому чаще всего это журнал ошибок apache или журнал ошибок nginx)

hanshenrik 27.02.2019 13:54

Другие вопросы по теме