提问者:小点点

我的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']));

共1个答案

匿名用户

有时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());

在得到错误信息之后,你要阅读和理解它。 这听起来太明显了,但学习者往往忽略了错误信息的含义。 但大多数情况下,它非常直截了当地解释了问题:

  • 比如说,如果它说一个特定的表不存在,你必须检查拼写,错别字,字母大小写。 此外,您还必须确保PHP脚本连接到正确的数据库
  • 或者,如果它说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

    还要注意,尽管存在常见的错觉,但不需要使用try-catch进行错误报告。 PHP已经会报告PDO错误,并且以一种更好的形式。 一个未捕获的异常对于开发非常好,但是如果您想要显示一个自定义的错误页面,仍然不要使用try catch,而只需设置自定义错误处理程序。 简单地说,您不必将PDO错误视为某种特殊的东西,而是将它们视为代码中的任何其他错误。

    P.S.
    有时没有错误,但也没有结果。 那么就意味着,没有数据与你的标准相匹配。 所以你不得不承认这个事实,即使你可以发誓数据,标准都是对的。 他们不是。 你得再检查一遍。 我有一篇文章可以帮助这件事,如何调试数据库交互与PDO。 只需按照此指导一步一步地进行,或者解决您的问题,或者有一个堆栈溢出的可回答的问题。