29

任何人都可以解释为什么

$sql->execute($params);

返回FALSE,而

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

两者都返回SQLSTATE 00000,这意味着根据文档成功?它是一个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());
4

5 回答 5

20

这是因为$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()则文档中没有明确说明 的行为。如果我从我的经验中没记错的话,执行返回true,即使 MySQL 返回错误,false如果没有执行任何操作也会返回。由于文档不是特定的,它可能是特定于数据库驱动程序的。

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

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

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
于 2012-09-15T15:32:47.500 回答
1

从 php 手册:

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

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

于 2012-10-24T23:45:01.957 回答
1

我遇到了类似的问题,

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

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

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

希望这会有所帮助:)

于 2012-09-27T16:34:20.723 回答
0

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

于 2012-10-04T04:01:39.950 回答
-1

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

于 2012-10-18T10:14:27.090 回答