我的PDO声明不起作用

时间:2015-09-18 09:20:28

标签: php mysql pdo

这是我的PHP sql语句,它在var dumping

时返回false
$password_md5 = md5($_GET['password']);
$sql = $dbh->prepare('INSERT INTO users(full_name, e_mail, username, password, password_plain) VALUES (:fullname, :email, :username, :password, :password_plain)');
$result = $sql->execute(array(
                    ':fullname' => $_GET['fullname'], 
                    ':email' => $_GET['email'], 
                    ':username' => $_GET['username'],
                    ':password' => $password_md5,
                    ':password_plain' => $_GET['password']));

1 个答案:

答案 0 :(得分:34)

如果PDO语句返回FALSE,则表示查询失败。您必须将PDO设置为正确的错误报告模式才能发现错误。

在连接

后立即将此行放入代码中
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

收到错误消息后,您必须阅读并理解它。这听起来太明显了,但学习者经常忽略错误信息的极端有用性。但大多数时候它解释这个问题非常简单。比如说,如果它说特定的表格不存在,你必须检查拼写,拼写错误,字母大小写,凭证等。或者,如果它说SQL语法中存在错误,那么您必须检查SQL。问题点在之前错误消息中引用的查询部分正确。

您还必须信任错误消息。如果它表示令牌的数量与绑定变量的数量不匹配,那么。缺席的表或列也是如此。鉴于选择,无论是你自己的错误还是错误信息是错误的,总是坚持前者。它再次听起来居高临下,但在这个网站上的数百个问题证明这个建议非常有用。

请注意,为了查看PDO错误,您必须能够查看PHP错误。为此,您必须配置PHP取决于站点环境:

    开发服务器上
  • ,在屏幕上出现错误非常方便,因为必须打开显示错误:

    error_reporting(E_ALL);
    ini_set('display_errors',1);
    
  • 实时网站上,所有错误必须记录,但从未显示到客户端。为此,请以这种方式配置PHP:

    error_reporting(E_ALL);
    ini_set('display_errors', 0);
    ini_set('log_errors', 1);
    

请注意,error_reporting应始终设置为E_ALL

另请注意,尽管存在共同的错觉,no try-catch have to be used for the error reporting。 PHP将以一种更好的形式向您报告PDO错误。未被捕获的异常非常适合开发,但如果您想显示自定义错误页面,仍然不要使用try catch,而只是set custom error handler。简而言之,您不必将PDO错误视为特殊内容,而是将其视为代码中的任何其他错误。