【问题标题】:PHP PDO code connecting to database but not executing queries and not returning errors [closed]PHP PDO代码连接到数据库但不执行查询并且不返回错误[关闭]
【发布时间】:2019-02-27 07:52:17
【问题描述】:

我正在尝试创建一个用户注册和登录系统。我的代码正在连接到数据库并且表单正在提供数据,但语句没有执行。也没有错误消息。

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
  • 您的插入语句中缺少逗号。在u_addu_pass 之间。
  • 您如何期望$count 小于小于零?
  • 如果每次有人给你答案时你都会修改你的问题,这会让答案看起来不对!!!所以请不要那样做。如果您想说您已经更改了一些内容但仍然无法正常工作,那么如果必须,请在 UPDATE 标题下重新粘贴修改后的代码。

标签: php oop pdo


【解决方案1】:

我认为主要问题在于 sql 语句 - 它在 u_addu_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 &lt; 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__ ) );
    }
}

【讨论】:

    【解决方案2】:

    也没有错误信息

    因为您使用了错误的 PDO 错误模式,所以您使用的是默认模式,即 iirc,称为 PDO::ERRMODE_SILENT

    这是 THE 创建 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 =&gt; PDO::ERRMODE_EXCEPTION-part。

    【讨论】:

    • 谢谢@hanshenrik!但仍然没有错误。这是完整的连接代码class BakeryModel { public $db; function __construct(){ try{ $this-&gt;db = new PDO('mysql:host=localhost;dbname=bakerydb;charset=utf8mb4', 'root', '', array(PDO::ATTR_EMULATE_PREPARES =&gt; false, PDO::ATTR_ERRMODE =&gt; PDO::ERRMODE_EXCEPTION)); } catch (PDOEXCEPTION $e){ echo "connection failed:" .$e-&gt;getMessage(); } }
    • @Zeekstem 哦,那可能是 PHP White screen of death,你有一个未捕获的异常,你在 php.ini 中有 display_errors = Off,错误日志应该在 php 错误处等你log :) (ps,在大多数配置中,php 错误日志被重定向到 webserver 的错误日志,所以最常见的是 apache 的错误日志或 nginx 的错误日志)
    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 2023-04-08
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多