Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我的PDO声明没有';行不通_Php_Mysql_Pdo - Fatal编程技术网

Php 我的PDO声明没有';行不通

Php 我的PDO声明没有';行不通,php,mysql,pdo,Php,Mysql,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

这是我的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错误是非常重要的。一旦您收到错误消息,就可以毫不费力地解决问题

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

$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\u reporting
应始终设置为
E\u ALL

还要注意的是,尽管存在常见的错觉,错误报告必须使用无重试捕获。PHP将以更好的形式向您报告PDO错误。一个未捕获的异常对于开发来说是非常好的,但是如果您想显示一个定制的错误页面,仍然不需要使用try-catch,只需要设置一个。简而言之,您不必将PDO错误视为特殊的错误,而是将它们视为代码中的任何其他错误

p.S.

有时没有错误,但也没有结果。这就意味着,没有数据符合您的标准。所以你必须承认这个事实,即使你可以发誓数据和标准都是正确的。事实并非如此。你必须再检查一遍。我有一个简短的答案,可以帮助你找出匹配的问题。只需按照此说明和链接教程一步一步地进行操作,要么解决问题,要么就堆栈溢出提出一个可回答的问题。

这是如何回答OPs问题的?@NaijaProgrammer id没有,但它可能会引导他/她根据“您的常识”建议的错误报告找到答案…这并不像@NaijaProgrammer说的那样有帮助,但我发现了我的问题。我只是不得不删除并重新创建数据库表,以便它出于任何原因再次工作。@你的常识:我有一个新的,同样的问题。根本原因是在创建PDO对象时在选项中设置了
ATTR\u EMULATE\u
选项。生产中断(PHP7.2.8),在开发中工作(PHP7.2.34)!!!在某些情况下,是选项的设置(而不是设置的选项的值)导致了随机失败。请不要使用您自己的密码哈希。PHP提供并请使用它们。如果您使用的是5.5之前的PHP版本,这里有一些