我的pdo语句不起作用

lxkprmvk  于 2021-10-10  发布在  Java
关注(0)|答案(1)|浏览(294)

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

fnatzsnv1#

有时您的pdo代码会产生如下错误 Call to a member function 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_reporting 应设置为 E_ALL 总是
还要注意的是,尽管存在常见的错觉,但错误报告不必使用try-catch。php将以更好的形式向您报告pdo错误。一个未捕获的异常对于开发来说是非常好的,但是如果您想显示一个定制的错误页面,仍然不需要使用try-catch,只需要设置一个定制的错误处理程序。简而言之,您不必将pdo错误视为特殊的错误,而是将它们视为代码中的任何其他错误。
附笔
有时没有错误,但也没有结果。这就意味着,没有数据符合您的标准。所以你必须承认这个事实,即使你可以发誓数据和标准都是正确的。事实并非如此。你必须再检查一遍。我有一个简短的答案,可以帮助您找出匹配问题,即使用pdo在数据库中匹配行时遇到的问题。只需按照此说明和链接的教程一步一步地进行操作,就可以解决您的问题,或者对堆栈溢出有一个可回答的问题。

相关问题