我的PDO声明不起作用

这是我的PHP sql语句,并且在var转储时返回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'])); 

如果PDO语句返回FALSE ,则表示查询失败。 您必须在正确的错误报告模式下设置PDO以了解错误。

连接后,将此行放入代码中

 $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 

得到错误信息后,你必须阅读和理解它。 这听起来太明显了,但是学习者往往忽略了错误信息的极大帮助。 然而大部分时间都是非常简单的解释这个问题。 说,如果说特定的表不存在,你必须检查拼写,拼写错误,字母大小写,凭证等。 或者,如果它说在SQL语法中有错误,那么你必须检查你的SQL。 问题点就在错误信息中引用的查询部分之前

你也必须相信错误信息。 如果它表示令牌的数量不匹配绑定variables的数量,那么它这样的。 缺less表格或列也是如此。 给出select,不pipe是自己的错误还是错误信息都是错误的,始终坚持前者。 再次,它听起来居高临下,但在这个网站上的数百个问题certificate这个build议非常有用。


请注意,为了查看PDO错误,您必须能够看到一般PHP错误。 要做到这一点,你必须configurationPHP取决于网站的环境:

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

     error_reporting(E_ALL); ini_set('display_errors',1); 
  • 而在现场,所有的错误都必须logging下来,但从不向客户显示。 为此,这样configurationPHP:

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

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

另外请注意,尽pipe常见的错觉, 错误报告不得使用try-catch 。 PHP会向你报告PDO错误,并以一种更好的方式。 一个未捕获的exception对于开发非常有用,但是如果你想显示一个自定义的错误页面,还是不要使用try catch,而是设置自定义error handling器 。 简而言之,您不必将PDO错误视为特殊情况,而是将其视为代码中的其他错误。