php - 为什么这个 PDO 语句会默默地失败?

标签 php pdo

这是我的 PHP SQL 语句,它在 var 转储时返回 false

$sql = $dbh->prepare('INSERT INTO users(full_name, e_mail, username, password) VALUES (:fullname, :email, :username, :password)');
$result = $sql->execute(array(
                    ':fullname' => $_GET['fullname'], 
                    ':email' => $_GET['email'], 
                    ':username' => $_GET['username'],
                    ':password' => $password_hash));

最佳答案

有时您的 PDO 代码会产生类似 Call to a member function execute() 的错误。或类似的。或者甚至没有任何错误,但查询并不完全一样。这意味着您的查询无法执行。
每次查询失败时,MySQL 都会有一条错误消息 解释原因 .不幸的是,默认情况下,此类错误不会传输到 PHP,您所拥有的只是上面提到的沉默或神秘的错误消息。因此,配置 PHP 和 PDO 以报告 MySQL 错误非常重要。一旦您收到错误消息,解决问题将是轻而易举的事。
为了获得有关问题的详细信息,请在连接后立即将以下行放入您的代码中

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
(其中 $dbh 是您的 PDO 实例变量的名称)或 - 更好 - 将此参数添加为 connection option .之后,所有数据库错误都将被转换为 PDO 异常,如果不理会这些异常,它将像常规 PHP 错误一样起作用。
收到错误消息后,您必须阅读并理解它。这听起来太明显了,但学习者经常忽略错误信息的含义。然而,大多数时候它非常简单地解释了这个问题:
  • 比如说,如果它说某个特定的表不存在,你必须检查拼写、错别字、字母大小写。您还必须确保您的 PHP 脚本连接到正确的数据库
  • 或者,如果它说 SQL 语法有错误,那么您必须检查您的 SQL。而且问题点对之前 错误消息中引用的查询部分。

  • 您还必须相信错误消息。如果它说 token 的数量与绑定(bind)变量的数量不匹配,那么就是这样。缺席的表或列也是如此。如果可以选择,无论是您自己的错误还是错误信息的错误,请始终坚持前者。再一次听起来有点居高临下,但是这个网站上的数百个问题证明这个建议非常有用。

    请注意,为了查看 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,而只需设置 custom error handler .简而言之,您不必将 PDO 错误视为特殊的东西,而是将它们视为代码中的任何其他错误。
    附言
    有时没有错误但也没有结果。那么这意味着,没有数据符合您的标准。所以你必须承认这个事实,即使你可以发誓数据和标准都是对的。他们不是。您必须再次检查它们。我有一个简短的回答,可以帮助您查明匹配问题,Having issue with matching rows in the database using PDO .只需按照此说明和链接的教程一步一步地解决您的问题或对 Stack Overflow 有一个可回答的问题。

    关于php - 为什么这个 PDO 语句会默默地失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58362526/

    相关文章:

    java - 如何解释引用命名空间 java : on a non-java client? 的 WSDL

    php - shell_exec 不为 inkscape 命令执行 sh 文件

    PHP PDO 准备语句缓存

    php - 如何避免此 PDO 异常 : Cannot execute queries while other unbuffered queries are active

    php - wampserver drupal phpinfo 始终显示

    php - Laravel 5 函数名必须是字符串错误

    php - 动态菜单权限不起作用

    php - 无法正确显示 FOREACH 循环的结果

    PHP PDO 事务自动回滚

    Php MySQL 仅当 ip 是新时才更新列 id