我的pdo语句不起作用

iugsix8n  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(296)

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

n3schb8v1#

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

相关问题