Php PDO SQL状态“;00000“;但还是有错误吗?

Php PDO SQL状态“;00000“;但还是有错误吗?,php,mysql,sql,database,pdo,Php,Mysql,Sql,Database,Pdo,有人能解释为什么吗 $sql->execute($params); 返回FALSE,而 print $pdo->errorCode(); print_r($pdo->errorInfo()); 两者都返回SQLSTATE00000,这意味着根据文档成功吗?这是一个插入,实际上没有任何内容插入到数据库中。。。那么,为什么我会从SQLSTATE收到一条成功消息呢 如果有帮助,这是代码 $sql = $pdo->prepare(" INSERT INTO

有人能解释为什么吗

$sql->execute($params);
返回
FALSE
,而

print $pdo->errorCode();
print_r($pdo->errorInfo());
两者都返回
SQLSTATE
00000
,这意味着根据文档成功吗?这是一个
插入
,实际上没有任何内容插入到数据库中。。。那么,为什么我会从
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());

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

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

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

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

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

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

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

我面临着类似的问题,

这主要是由于查询中的错误造成的,尝试在php myadmin或任何其他查询运行程序中运行您的查询,并确认查询正常运行。
即使我们的查询语法正确,其他简单错误(如在表结构中保留null或not MENTIOA列设置为NOTNULL)也会导致此错误。(这是我犯的错误)

正如user1122069解释的那样,$pdo->errorInfo()表示没有任何错误可能是由于

$pdo->errorInfo()引用最后一条成功执行的语句 已执行。
因为$sql->execute()返回false,所以它不能引用 该语句(要么为nothing,要么为之前的查询)


希望这有帮助:)

我曾经遇到过这个错误。我只在一台服务器上获得了所有故障。对于相同的错误,其他服务器将正确报告错误。这让我相信这是一个MySQL客户端配置错误。我从未解决过特定错误,但检查了您的配置。

尝试通过print\r()检查$sql并复制查询,然后在phpMyadmin中尝试结果查询。希望会得到理由。可能会有不相关的价值

来自php手册:

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


听起来好像它确实插入了唱片。检查表中的最后一个记录id。。。也许你只是错过了它?

你在$params中存储了什么??请把它贴上,有一个。也许这是一个原因。@JalpeshPatel:谢谢,我已经发布了代码…您还需要在创建准备好的语句后检查
PDOStatement::errorCode
意思是
$sql->errorCode()
。我知道它很旧,但我建议使用$sql->errorInfo();而不是$pdo->errorInfo();当execute返回false时,没有错误代码没有多大意义,因为人们想知道它返回false的原因。这种行为是故意的,只会让事情变得更糟$pdo->setAttribute(pdo::ATTR_ERRMODE,pdo::ERRMODE_异常);可能会让你知道发生了什么,因为这会让你觉得你的第一句话毫无意义$pdo->errorInfo()未引用上次成功执行的station。很简单,因为这是一个错误信息。它确实引用了php文档中给出的数据库句柄上的最后一个操作。“此数据库句柄执行的最后一个操作”==“成功执行的最后一个语句”。已执行表示已完成,未执行失败的语句。你自己试试看,并记下答案上的复选标记。文档中没有说这是一个“已执行的操作”。这只是“数据库上的最后一个操作”-即使它不执行并且execute()返回false-您仍然可以使用errorInfo()。你可以自己试试。拼写错误列名,执行查询(它将返回false)并调用errorInfo()。非常重要的是你检查什么。如果您检查整个连接($pdo),它可能不会返回任何错误,但是您使用的查询连接($sql)会返回错误。如果使用$sql->errorInfo(),则会出现错误。@Seb文档中没有说明操作。如果参数数组无效,则不会对数据库句柄运行任何操作,也不会生成错误。该边缘情况应在文档或项目中正确提及