这是我的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代码会产生类似于Call to a member function execute()或类似的错误.或者,即使没有任何错误,但查询也无法正常工作.这意味着您的查询无法执行.

每次查询失败时,MySQL都会显示一条错误消息,显示explains the reason.不幸的是,默认情况下,这些错误不会被传输到PHP,您所拥有的只是一个静默或上面提到的一条神秘的错误消息.因此,配置PHP和PDO来报告MySQL错误是非常重要的.一旦你收到错误信息,解决这个问题就不需要动脑筋了.

为了获得有关问题的详细信息,请在连接后立即在代码中输入以下行

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

(其中$dbh是您的PDO实例变量的名称)或者-更好-将此参数添加为connection option.之后,所有数据库错误都将被转换为PDO异常,如果不考虑这些异常,它们将与常规PHP错误一样起作用.

收到错误信息后,您必须阅读并理解它.这听起来太明显了,但学习者往往忽略了错误信息的meaning%.然而,大多数情况下,它很直截了当地解释了这个问题:

  • 比如说,如果它说某个特定的表格不存在,你必须判断拼写、打字错误、字母大小写.此外,还必须确保PHP脚本连接到正确的数据库
  • 或者,如果它说SQL语法中有错误,那么您必须判断SQL.问题就在错误消息中引用的查询部分的右边.

您还必须输入错误消息.如果它说令牌的数量与绑定变量的数量不匹配,那么它就是这样.不存在的表或列也是如此.如果有选择,无论是你自己的错误还是错误信息是错误的,都要坚持前者.同样,这听起来是居高临下,但这个网站上的数百个问题证明了这个建议非常有用.


请注意,为了查看PDO错误,您必须能够看到PHP错误.为此,必须根据站点环境配置PHP:

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

      error_reporting(E_ALL);
      ini_set('display_errors',1);
    
  • live站点上,所有错误对客户端来说都必须是logged, but never shown.为此,请通过以下方式配置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,只需要设置一个custom error handler.简而言之,您不必将PDO错误视为特殊的东西,而是将它们视为代码中的任何其他错误.

P.S.
Sometimes there is no error but no results either. Then it means, there is no data to match your criteria. So you have to admit this fact, even if you can swear the data and the criteria are all right. They are not. You have to check them again. I've short answer that would help you to pinpoint the matching issue, Having issue with matching rows in the database using PDO. Just follow this instruction, and the linked tutorial step by step and either have your problem solved or have an answerable question for Stack Overflow.

Mysql相关问答推荐

更新和替换未加引号的 JSON 字符串

如何在任何连续范围内获得最大值

了解 SQL 中的元组语法

进行 MySQL COUNT 查询

在 MySQL 中使用三个表进行计算

估计行数 SQL

MySQL - 计算行重复的最大计数

MySQL查询根据同一表中其他字段的值更新表中的字段

如何过滤表格,以便它显示最新的数据?

无法在两个 mysql 表上执行内部联接

MySQL 视图

#1030 - 从存储引擎 Aria 收到错误 176“读取错误校验和的页面”

如何在 MySQL 8.0.11 中重置 root 密码?

MySQL 8.0 上的 phpMyAdmin

表 'DBNAME.hibernate_sequence' 不存在

您的密码不符合当前政策要求

使用 mysql 处理非常大的数据

加入与子查询

服务器时区值“AEST”无法识别或代表多个时区

错误 1067 (42000):“created_at”的默认值无效