当前位置: 首页 > 面试题库 >

PDO SQL状态为“ 00000”,但仍然出错?[重复]

谢高峯
2023-03-14
问题内容

这个问题已经在这里有了答案

我的PDO声明无效 (1个答案)

2年前关闭。

谁能解释为什么

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

问题答案:

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


 类似资料:
  • 我在我的Angluar8应用程序中有一个CORS错误的问题。 我从服务器收到状态为200和有效JWT令牌的响应,我认为这意味着服务器配置正确,但控制台中仍然出现错误: 现在配置为: 谢谢大家的提示。

  • 我有一个angular 2应用程序,它使用firebase进行身份验证。我想使用谷歌作为我的身份验证提供者,并有一切设置,以便它应该工作。 如果我尝试用signinWithPopup进行身份验证(如文档中提到的),它可以工作: 但是,如果使用重定向尝试相同的代码,则会出现错误: 有人知道为什么弹出式方法有效而重定向方法无效吗?

  • 问题内容: Redux发出警告: 减速器的唯一操作是以下操作: 如果我使用[… spread],如何改变状态? 问题答案: 在这里类似。它创建一个新的数组,但对象 的 数组与共享。如果要对其进行突变,则需要制作每个项目的副本。 您可以使用进行此操作,类似于您对返回值所做的操作: 或者(如您在自己的答案中所建议),您可以使用对象扩展表示法:

  • SQS消息由lambda成功处理。下面是处理并执行回调的代码: 我看到cloudwatch打印“OK DONE”消息。然而,SQS将消息“飞行”(并且它将永远飞行)。我的理解是,一旦成功发送响应,该消息将自动删除。我的能见度计时器=10分钟

  • 问题内容: 在此代码中。 我们向函数传递值。可以正常编译,但是在运行时提供了一个我没想到的。为什么它引发异常,而不是评估条件并显示“字符串为空”? 假设传递给实际参数的值是从某个进程生成的。假定该进程错误地返回了一个值并将其馈送到testFun。如果是这种情况,如何验证传递给函数的值是否为null? 一种(奇怪的)解决方案可能是将形式参数分配给函数内部的某个变量,然后对其进行测试。但是,如果有许多

  • 我的命令提示符出错了。我从Jupyter尝试了,但出现了一些错误。我感谢任何查看或回答的人,感谢您的时间!