一尘不染

PDO SQL状态为“ 00000”,但仍然出错?

mysql

谁能解释为什么

$sql->execute($params);

返回FALSE,而

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

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

阅读 460

收藏
2020-05-17

共1个答案

一尘不染

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

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

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

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

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

您可能还需要在连接顺序中设置 PDO :: ERRMODE_EXCEPTION 。异常处理无需检查和查询错误。

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