3
$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 错误,上面的代码我注意到以下内容:

  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)with$value=NULL

    print_r($PDO_db->errorInfo());
    

    将再次输出:

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

    但 var_dump($s) 是假的

所以我想知道使用 PDO 调试 MySQL 语句的正确方法什么?

PDO::errorInfo()返回错误信息数组"

4

1 回答 1

1

奇怪……你确定什么都没有被插入吗?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();//?

这应该会给你更多关于发生了什么的线索。此外,您声明(两次) a var_dumpof$s为假,但您将执行调用的返回值分配给$r... 我假设这是一个错字,但您永远不知道,因此对':nome'.
还要牢记@Clarence 的建议,并将您的 php.ini 错误报告设置E_ALL | E_STRICT为另一台机器,或者你升级你的 PHP 版本。无论如何:它不像 PHP 那样严格的语言E_STRICT会花费你大量的时间来修复警告......

于 2012-09-28T16:27:35.887 回答