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

时间:2012-07-17 09:47:06

标签: php mysql sql database pdo

任何人都可以解释原因吗

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

5 个答案:

答案 0 :(得分:15)

这是因为$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 );

答案 1 :(得分:1)

我面对类似的问题,

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

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

  

$ pdo-> errorInfo()是指成功的最后一个语句   执行。
由于$ sql-> execute()返回false,因此无法引用   该声明(无论是之前还是之前的查询)

希望这会有所帮助:)

答案 2 :(得分:1)

从php手册:

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

尝试通过print_r()检查$ sql并复制您的查询,然后在phpMyadmin中尝试生成查询。希望能得到理由。可能存在无关的价值。