PDO SQL 状态“00000”但仍然错误?

2022-08-30 15:20:52

任何人都可以解释为什么

$sql->execute($params);

返回 ,而FALSE

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

两者都返回,这意味着根据文档成功?它是一个,实际上没有任何东西入到数据库中...那么,为什么我从 中收到成功消息?SQLSTATE00000INSERTSQLSTATE


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

$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());

答案 1

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

至于为什么返回 false,我不知道...阵列或数据库连接有问题。$sql->execute()$params

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

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

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

您可能还希望在连接序列中设置 PDO::ERRMODE_EXCEPTION。异常处理使得无需检查和查询错误。

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

答案 2

我遇到了类似的问题,

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

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

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

希望这有助于:)


推荐