PDO SQL状态"00000"但仍然出错?

Chr*_*ris 24 php mysql sql database pdo

任何人都可以解释原因

$sql->execute($params);
Run Code Online (Sandbox Code Playgroud)

返回FALSE,而

print $pdo->errorCode();
print_r($pdo->errorInfo());
Run Code Online (Sandbox Code Playgroud)

两者都归还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());
Run Code Online (Sandbox Code Playgroud)

use*_*069 16

这是因为$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如果没有进行任何操作则返回.由于文档不是特定的,因此可能是特定于db驱动程序的.

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

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

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
Run Code Online (Sandbox Code Playgroud)

  • 你的第一句话没有意义.$ pdo-> errorInfo()不引用上次执行的SUCCESSFULLY语句.很简单,因为它是一个错误信息.它确实引用了php文档中给出的数据库handle_上的_last操作. (3认同)