这是我的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代码会产生类似调用成员函数execute()
或类似的错误。 或者甚至没有任何错误,但查询的工作方式并不完全相同。 这意味着您的查询无法执行。
每次查询失败时,MySQL都会有一条错误消息说明原因。 不幸的是,默认情况下这样的错误不会传输到PHP,您所拥有的只是一个沉默或者上面提到的一个隐秘的错误消息。 因此,配置PHP和PDO来报告MySQL错误是非常重要的。 并且一旦您收到错误消息,就可以毫不费力地修复该问题。
为了获得有关该问题的详细信息,可以在代码中的connect后面插入以下行
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
(其中$dbh
是PDO实例变量的名称)或者更好地添加此参数作为连接选项。 之后,所有数据库错误都将被转换为PDO异常,如果不处理这些异常,就会像常规的PHP错误一样起作用。
在某些特定错误的情况下,不引发异常的可能性非常小。 如果您的query()
/prepare()
或execute()
调用返回false
但没有异常,请检查PDO::ErrorInfo()
,
trigger_error("PDO errorInfo: ".$dbh->errorInfo());
在得到错误信息之后,你要阅读和理解它。 这听起来太明显了,但学习者往往忽略了错误信息的含义。 但大多数情况下,它非常直截了当地解释了问题:
您还必须信任错误消息。 如果它说标记的数量与绑定变量的数量不匹配,那么它就是这样。 对于不存在的表或列也是如此。 如果有选择,不管是你自己的错误还是错误信息是错误的,总是坚持前者。 这听起来又是一种居高临下的态度,但是这个网站上的数百个问题证明了这个建议是非常有用的。
注意,为了看到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
。
还要注意,尽管存在常见的错觉,但不需要使用try-catch进行错误报告。 PHP已经会报告PDO错误,并且以一种更好的形式。 一个未捕获的异常对于开发非常好,但是如果您想要显示一个自定义的错误页面,仍然不要使用try catch,而只需设置自定义错误处理程序。 简单地说,您不必将PDO错误视为某种特殊的东西,而是将它们视为代码中的任何其他错误。
P.S.
有时没有错误,但也没有结果。 那么就意味着,没有数据与你的标准相匹配。 所以你不得不承认这个事实,即使你可以发誓数据,标准都是对的。 他们不是。 你得再检查一遍。 我有一篇文章可以帮助这件事,如何调试数据库交互与PDO。 只需按照此指导一步一步地进行,或者解决您的问题,或者有一个堆栈溢出的可回答的问题。