当前位置: 首页 > 面试题库 >

我的PDO声明无效

微生智刚
2023-03-14
问题内容

这是我的PHP sql语句,在var dump时返回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都会显示一条错误消息, 说明原因
。不幸的是,默认情况下,此类错误不会转移到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错误视为特殊错误,而是将它们视为代码中的任何其他错误。

PS
有时没有错误,但也没有结果。那就意味着, 没有符合您条件的数据
。因此,即使您可以保证数据和标准都正确,您也必须承认这一事实。他们不是。您必须再次检查它们。我有一篇文章,《如何调试与PDO的数据库交互》,可以对此提供帮助。只需按照此说明逐步进行操作,即可解决您的问题或对堆栈溢出有一个可解答的问题。



 类似资料:
  • 问题内容: 注意 :我已经搜索了很多,例如UITableViewDataSource方法的无效重新声明?不适用于我的情况。因为我的代码中没有重复的文件或类。 我的项目中只有一个AppDelegate.swift文件,文件中只有一个类。但是我有 我在AppDelegate.swift文件中也有以下代码。我得到以下错误。 注意 ,我在项目中使用了重复的类或变量声明,并且代码中只有一次声明。 问题答案:

  • 问题内容: 我正在尝试实现UITableViewDataSource的必需方法,但出现一个奇怪的错误: “无效的’tableview(_:cellForRowAtIndexPath :)重新声明’” 但是我不确定是什么问题。这是相关的两行代码,即类的声明和符合协议/超类的代码: 以及触发错误的函数声明: 问题答案: 您在课堂上有两次此功能。搜索它并删除其中之一。

  • 我正在使用typescript,无法使用其他文件中声明的接口 我的看起来像这样。 下面是tsconfig.json 目录结构如下所示 在< code>common.ts文件中使用它

  • 问题内容: 所以这很奇怪,我知道代码本身是没有用的,但是我想知道为什么会收到错误: 我正在写一些代码,我已经写了这个: 当时没有考虑可变范围,显然这是没有用的,因为无论如何我都无法使用过去。我没有得到的是为什么我得到了我的错误: 现在,如果我将其修改为: 它将编译正常。我给人的印象是,如果大括号下有1行是可选的……显然,还有其他考虑,或者两者都会编译或失败。 有人可以向我解释一下,还是可以指向一个

  • 我知道有很多问题与类似的问题,但我一直在寻找答案,仍然无法找到我的问题。我已经尝试了几种方法来解决这个问题,但我找不到任何解决方案。。。 我代码的一部分:(我不会在其他任何地方使用这个函数) 我得到以下信息: 致命错误:无法在第20行的C:\wamp64\www\myProject-dev\Public\cajas\reposiciones\controller3.php:20中重新声明Valid

  • 2.2. 声明 声明语句定义了程序的各种实体对象以及部分或全部的属性。Go语言主要有四种类型的声明语句:var、const、type和func,分别对应变量、常量、类型和函数实体对象的声明。这一章我们重点讨论变量和类型的声明,第三章将讨论常量的声明,第五章将讨论函数的声明。 一个Go语言编写的程序对应一个或多个以.go为文件后缀名的源文件中。每个源文件以包的声明语句开始,说明该源文件是属于哪个包。