【问题标题】:PDO SQL-state "00000" but still error? [duplicate]PDO SQL 状态“00000”但仍然错误? [复制]
【发布时间】:2012-07-16 05:23:54
【问题描述】:

谁能解释一下原因

$sql->execute($params);

返回FALSE,而

print $pdo->errorCode();
print_r($pdo->errorInfo());

都返回SQLSTATE00000,这意味着根据文档成功?它是一个INSERT,实际上并没有向数据库中插入任何内容……那么,为什么我会收到来自SQLSTATE 的成功消息?


如果有帮助,这就是代码...

$sql = $pdo->prepare("
        INSERT INTO user (
            username, fname, pass, salt, email,
            loc_id_home, country_id_home, region_id_home,
            cont_id_home, timestamp_reg, timestamp_upd, timestamp_lastonline, 
            online_status, gender, birthdate
            )
        VALUES (
            :username,:fname,:pass,:random_salt,:email,
            :loc_id_home,:country_id_home,:region_id_home,
            :cont_id_home,'".time()."','".time()."','".time()."',
            1,:gender,:birthdate)
        ");

$params=array(
    ':username'=>$username,
    ':fname'=>$fname,
    ':pass'=>$pass,
    ':random_salt'=>$random_salt,
    ':email'=>$email,
    ':loc_id_home'=>$loc_id_home,
    ':country_id_home'=>$country,
    ':region_id_home'=>$region,
    ':cont_id_home'=>$continent,
    ':gender'=>$gender,
    ':birthdate'=>$birthdate
);  

$sql->execute($params);

print $pdo->errorCode();
print_r($pdo->errorInfo());

【问题讨论】:

  • 你在 $params 中存储了什么?请粘贴它..
  • 有一个bug。也许这是一个原因。
  • @JalpeshPatel:谢谢,我已经发布了代码...
  • 创建prepared statement后还需要勾选PDOStatement::errorCode意思$sql->errorCode()
  • 我知道它很旧,但我建议使用 $sql->errorInfo();而不是 $pdo->errorInfo();

标签: php mysql sql database pdo


【解决方案1】:

这是因为$pdo->errorInfo()指的是最后一条成功执行的语句。由于$sql->execute() 返回 false,因此它不能引用该语句(无论是什么都没有或之前的查询)。

至于$sql->execute()为什么返回false,我不知道……要么是你的$params数组有问题,要么是你的数据库连接有问题。

PDO::errorCode — 获取与数据库句柄上的最后一个操作关联的 SQLSTATE

注意:PHP 手册 (http://php.net/manual/en/pdo.errorinfo.php) 并未准确定义“对数据库句柄的最后一次操作”的含义,但如果绑定参数存在问题,则该错误将在 PDO 内部发生,并且与数据库。可以肯定地说,如果$pdo->execute() 返回true,那么$pdo->errorInfo() 是有效的。如果$pdo->execute() 返回false,则文档中没有明确说明$pdo->errorInfo() 的行为。如果我从我的经验中没记错的话,execute 会返回true,即使 MySQL 返回错误,如果没有执行任何操作,也会返回false。由于文档不是特定的,它可能是特定于数据库驱动程序的。

此答案反映了截至 2012 年 9 月编写时的实际经验。正如用户所指出的,文档并未明确重申这种解释。它也可能只反映特定的数据库驱动程序实现,但如果$pdo->execute() 返回true,则$pdo->errorInfo() 是有效的。

您可能还想在连接序列中设置 PDO::ERRMODE_EXCEPTION。异常处理使检查和查询错误变得不必要。

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

【讨论】:

  • 你的第一句话没有意义。 $pdo->errorInfo() 不引用最后一个成功执行的语句。很简单,因为它是一个错误信息。它确实引用了 php 文档中给出的 对数据库句柄的最后一次操作
  • "此数据库句柄执行的最后一个操作" == "最后一个成功执行的语句"。已执行意味着已完成且未执行失败的语句。自己尝试一下,并注意答案上的复选标记。
  • 文档没有说它是“执行操作”。它只是“对数据库的最后一次操作”——即使它没有执行并且 execute() 返回 false——你仍然可以使用 errorInfo()。你可以自己试试。拼错列名,执行查询(它将返回 false)并调用 errorInfo()。非常重要的是您检查的内容。如果您检查整体连接($pdo),它可能不会返回错误,但您使用的查询连接($sql)会这样做。如果你使用 $sql->errorInfo() 你会得到错误。
  • @Seb 文档确实说操作。如果参数数组无效,则不会对数据库句柄进行任何操作,也不会产生错误。这种边缘情况应该在文档中正确提及,或者主动清除。自 12 年以来,这种行为也完全有可能发生了变化,或者有一天会发生变化。
  • 不适用于列出的这个特定查询,但有时问题来自查询本身。当我在列出值后忘记关闭插入查询中的括号时,就会发生此错误。前任。 "INSERT INTO TABLE (Column1, Column2, Column3) VALUES (...,...,..."
【解决方案2】:

我遇到了类似的问题,

这主要是由于查询错误,尝试在 php-myadmin 或任何其他查询运行器中运行您的查询并确认您的查询工作正常。
即使我们的查询语法正确,其他简单的错误(例如保留 null 或未提及在表结构中设置为非 null 的列)也会导致此错误。(这是我犯的错误)

正如 user1122069 解释 $pdo->errorInfo() 的原因所说的没有错误可能是由于

$pdo->errorInfo() 指的是最后一条成功的语句 执行。
由于$sql->execute()返回false,所以不能引用 该语句(对任何内容或之前的查询)

希望这会有所帮助:)

【讨论】:

  • 当执行返回 false 时没有错误代码没有多大意义,因为人们想知道它为什么返回 false。这种行为是设计使然,只会使情况变得更糟。 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);可能会让你知道发生了什么,因为它会抛出一些东西
【解决方案3】:

来自 php 手册:

PDO::ERR_NONE(字符串) 对应于 SQLSTATE '00000',表示 SQL 语句已成功发出,没有错误或警告。在检查 PDO::errorCode() 或 PDOStatement::errorCode() 以确定是否发生错误时,此常量是为了方便您。您通常可以通过检查引发错误条件的方法的返回码来知道是否是这种情况。

所以听起来它确实插入了记录。检查表中的最后一条记录 id...也许您只是错过了它?

【讨论】:

    【解决方案4】:

    我曾一度收到此错误。对于所有故障,我只在一台服务器上安装了它。对于相同的错误,不同的服务器会正​​确报告错误。这让我相信这是一个 MySQL 客户端配置错误。我从未解决具体错误,但请检查您的配置。

    【讨论】:

      【解决方案5】:

      尝试通过 print_r() 检查 $sql 并复制您的查询,然后在 phpMyadmin 中尝试结果查询。希望能找到原因。会有不相关价值的机会。

      【讨论】:

        猜你喜欢
        • 2016-11-08
        • 2020-03-12
        • 2013-08-14
        • 2020-11-10
        • 1970-01-01
        • 1970-01-01
        • 2020-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多