2012-09-28 26 views
2
$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(); 

Supppose了$插入statemet包含SQL错误,上面我已经注意到下面的代码:如何使用PDO(mysql)正确调试Insert语句?

  1. 代码A

    print_r($PDO_db->errorInfo()); 
    

    将输出反正:

    Array (
        [0] => 00000 
        [1] => 
        [2] => 
    ) 
    

    但var_dump($ s)为假

  2. 如果在插入声明中我有一些placemark例如:name

    "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)为假

所以我“M想知道如果方法errorInfo,这应该给我一个错误说明,静静地静默错误什么是正确的方式来调试与PDO的MySQL语句?

PDO::errorInfo()返回的错误信息”的阵列

+0

您需要将您的PDO声明与变量绑定。 – hjpotter92

+4

我会添加'$ PDO_db-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION);'。这应该会让事情更加明显。 –

+1

向我们展示'$ insert'是什么。 – Stegrex

回答

1

奇怪......你肯定什么都没有iserted成功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大量的时间来修复警告...

+0

$ arrPar = array(':nome'=> $ nome); //不应该是:name? 这是我在帖子中的错误,代码是正确的那一点 – kante

+0

是的,它应该是var_dump($ r); //不是$ s – kante

+0

@kante:既然你接受了这个答案,我怀疑/希望你找出问题所在,关心分享问题是什么或者引发了什么异常以帮助你解决这个问题? –