Php 如何使用PDO(mysql)正确调试Insert语句?
支持$insert statemet包含SQL错误,使用上面的代码,我注意到以下几点:Php 如何使用PDO(mysql)正确调试Insert语句?,php,mysql,debugging,pdo,Php,Mysql,Debugging,Pdo,支持$insert statemet包含SQL错误,使用上面的代码,我注意到以下几点: 代码A $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->exec
$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();
将以任何方式输出:
print_r($PDO_db->errorInfo());
但var_dump($s)是错误的placemark
,例如:name
Array (
[0] => 00000
[1] =>
[2] =>
)
然后在$arrPar=array(':name'=>$value)
中使用$value=NULL
"Insert into mytable (name) VALUE(:name);"
将再次输出:
print_r($PDO_db->errorInfo());
但var_dump($s)是错误的PDO::errorInfo()
返回一个错误信息数组“奇怪……你确定没有任何内容被iserted吗?MySQL在成功时的返回码是0,而errorInfo
确实返回了该值。但是就像@Jack说的:
Array
(
[0] => 00000
[1] =>
[2] =>
)
试试看
{
$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_异常);
$sth=$PDO_db->prepare($insert);
echo“准备插入
”;
$arrPar=array(':nome'=>$nome);//这不应该是:name吗?
$r=$sth->execute($arrPar);
回显“插入已执行
”;
var_dump($r);
}
捕获(PDO异常$pdoE)
{
echo$pdoE->getMessage()。
;
var_dump($pdoE);
}
退出();/?
这应该会给你更多的线索,让你知道发生了什么。此外,你陈述(两次)
$s
的var\u dump
是错误的,但是您正在将execute调用的返回值赋给$r
…我假设这是一个输入错误,但您永远不知道,因此对':nome'
的评论也会牢记@Clarence的建议,并将您的php.ini错误报告设置为
E|E|u ALL | E\u STRICT
,您将一开始它会发出大量的警告,但它避免了任何你可能(也可能会)遇到的问题在另一台机器上部署代码或升级PHP版本时遇到的问题。无论如何:E_strict
不会花费大量时间来修复警告…您需要将PDO语句与变量绑定。我会添加$PDO_db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
。这应该会让事情变得更加明显。@GiantofaLannister不,他没有,他的语法是正确的,就像他从中显示的一样,添加了一个错误报告(E_ALL);
和ini集('display_errors',true)上面的
可能会给你更好的提示。$arrPar=array(':nome'=>$nome);//这不应该是:name吗?这是我在帖子中的错误,代码在那一点上是正确的,应该是var_dump($r);//不是$s@kante:既然你接受了这个答案,我怀疑/希望你知道问题是什么,是否愿意分享问题是什么,或者引发了什么异常来帮助你解决这个问题?我接受了这个答案,因为直到现在,这是我看到的用PDO捕获最终SQL错误的最好方法。另一方面,我认为PDO类可能是更为“面向错误捕获”,同时考虑到无法打印出用于调试目的的准备好的查询,带有placemark替换(不能不实现自己的方法来执行任务)
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();//?