Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用PDO(mysql)正确调试Insert语句?_Php_Mysql_Debugging_Pdo - Fatal编程技术网

Php 如何使用PDO(mysql)正确调试Insert语句?

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

支持$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->execute($arrPar);    
    var_dump($arrPar);
    print_r($PDO_db->errorInfo());
    var_dump($r);
    exit();
    
    将以任何方式输出:

    print_r($PDO_db->errorInfo());
    
    但var_dump($s)是错误的

  • 如果在insert语句中我有一些
    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)是错误的

  • 因此,我想知道,如果方法errorInfo(应该给我一个错误描述)能够安静地消除错误,那么用PDO调试MySQL语句的正确方法是什么


    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();//?