$PDO_db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=UTF-8' , DB_USER, DB_PWD);
$sth = $PDO_db->prepare($insert);
$arrPar = array(':nome' => $nome);
$r = $sth->execute($arrPar);
var_dump($arrPar);
print_r($PDO_db->errorInfo());
var_dump($r);
exit();
假设 $insert statemet 包含 SQL 错误,使用上面的代码我注意到以下内容:
代码A
print_r($PDO_db->errorInfo());
无论如何都会输出:
Array ( [0] => 00000 [1] => [2] => )
但是 var_dump($s) 是假的
如果在插入语句中我有一些
placemark
例如:名称
"Insert into mytable (name) VALUE(:name);"
然后在
$arrPar = array(':name' => $value)
中使用$value=NULL
print_r($PDO_db->errorInfo());
会再次输出:
Array ( [0] => 00000 [1] => [2] => )
但是 var_dump($s) 是假的
所以我想知道,如果方法 errorInfo 应该给我一个错误描述,却默默地消除了错误,那么使用 PDO 调试 MySQL 语句的正确方法是什么?
PDO::errorInfo()
返回错误信息数组”
最佳答案
奇怪...您确定没有插入任何内容吗? MySQL 的成功返回代码是 0,errorInfo
确实返回了。但就像@Jack 说的那样:
try
{
$PDO_db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=UTF-8' , DB_USER, DB_PWD);
$PDO_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sth = $PDO_db->prepare($insert);
echo 'Insert prepared<br/>';
$arrPar = array(':nome' => $nome);//shouldn't this be :name?
$r = $sth->execute($arrPar);
echo 'Insert executed<br/>';
var_dump($r);
}
catch(PDOException $pdoE)
{
echo $pdoE->getMessage().'<br/>';
var_dump($pdoE);
}
exit();//?
这应该会为您提供更多关于正在发生的事情的线索。此外,您声明(两次)$s
的 var_dump
为假,但您将执行调用的返回值分配给 $r
...我假设这是一个错字,但你永远不知道,因此对 ':nome'
的评论。
同时牢记@Clarence 的建议,并设置你的 php .ini 错误报告给 E_ALL | E_STRICT
,一开始您可能讨厌它发出的大量警告,但它避免了您在另一台机器上部署代码或升级 PHP 版本时可能(并且可能会)遇到的任何问题。无论如何:它不像 PHP 是一种严格的语言,E_STRICT
会花费您 huuuge 大量的时间来修复警告...
关于php - 如何使用 PDO (mysql) 正确调试 Insert 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12643547/