PDO 准备和执行查询总是返回错误

Posted

技术标签:

【中文标题】PDO 准备和执行查询总是返回错误【英文标题】:PDO prepare and execution of query returns always error 【发布时间】:2016-08-29 21:22:14 【问题描述】:

我有一个函数,

这总是返回给我一个错误,即使在我过去查询时在 phpmyadmin 中有一个结果。

我想我的查询有问题,但我不知道是什么。我以前做我的代码做mysql_real_escape_string,然后我转向PDO,他们告诉我应该为转义GET vars做准备,所以我试着去做。

以下是我的查询

public static function getDetailService($param) 
    global $bdd;
    $detail = $bdd->prepare('SELECT
            spb_services.spb_services__name,
            spb_services.spb_services__description,
            spb_services.spb_services__banner,
            spb_services.spb_services__tabs,
            spb_services.spb_services__category
        FROM spb_services
        WHERE spb_services.spb_services__name LIKE :service');

    $detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR);
    $resultat = $detail->fetchAll(PDO::FETCH_ASSOC);

    //var_dump($_GET[$param]);

    $detail->debugDumpParams();
    $lignes = $detail->fetchColumn();

    //var_dump($lignes);
    $detail = $detail->fetchAll(PDO::FETCH_ASSOC);
    $retour = ($lignes > 0) ? array('status' => 'ok') : array('status' => 'error');
    var_dump($retour);

当我调用函数时:$service = nosServices::getDetailService('service');

var_dump($_GET[$param]) 的 Var 转储返回给我预期的内容(来自 url)

然后我做了$detail->debugDumpParams();

我在我的本地主机 phpmyadmin 中通过了查询,它返回给我预期的结果,但在使用 PDO 时没有。

我猜有些小问题是错的,但我不知道是什么。

这不会返回错误,但总是错误,好像没有num_rows_result

总结一下麻烦,GET返回了预期的结果,但是当我们去查询时,它没有返回任何结果(除了在我的phpmyadmin复制并粘贴查询)

我们将不胜感激任何帮助

编辑:其他用户按预期完成的修改

【问题讨论】:

":service" 去掉这里的双引号。在bindValue 中,在service 之前添加: 我还有一个错误 你错过了$detail->execute()。您需要在 fetchAll 之前执行查询 人们对绑定中的冒号有误解,它只在值中是必需的。自己阅读***.com/q/9778887 @StanislasPiotrowski 您需要在此处检查错误。所以使用php.net/manual/en/function.error-reporting.php 和php.net/manual/en/pdo.error-handling.php 看看是否有任何结果,除了你没有执行查询。 【参考方案1】:

参数绑定需要修正。

您在为参数提供值时缺少:

更正的代码:

...
WHERE spb_services.spb_services__name LIKE  :service');
        $detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR);
...

【讨论】:

感谢您的帮助,我这样做了,但仍然没有结果 首先,OP 必须删除一些引号。 我这样做是为了删除引号 冒号不是问题,驱动程序自动附加它。 ***.com/questions/9778887/…(跟随源代码链接)占位符不会被引用。【参考方案2】:

只有代码中的问题忘记在获取数据之前执行查询它会是

 $detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR);
 $detail->execute();// execute it first
 $resultat = $detail->fetchAll(PDO::FETCH_ASSOC);
 print_r($resultat);

【讨论】:

我做了所有的修改,但它仍然不起作用,我想我在其他地方错了 我做了$detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR); $detail->execute(); // execute it first $lignes = $detail->fetchColumn(); $resultat = $detail->fetchAll(PDO::FETCH_ASSOC); //var_dump($_GET[$param]); // $detail->debugDumpParams(); //var_dump($lignes); $retour = ($lignes > 0) ? array('status' => 'ok') : array('status' => 'error'); var_dump($retour); 我有一个错误 在绑定中不需要冒号,只需要值,这里是***.com/q/9778887 @StanislasPiotrowski 仍然没有在获取数据之前执行查询 我试过这个`$detail->bindValue('service', $_GET[$param], PDO::PARAM_STR); $详细信息->执行(); // 先执行 $lignes = $detail->fetchColumn(); $resultat = $detail->fetchAll(PDO::FETCH_ASSOC);` 但我仍然有错误【参考方案3】:

您的代码中发生了许多奇怪的事情。

我已经评论了我认为需要改变的地方

public static function getDetailService($param) 
    global $bdd;    // bad practice, see later suggestion
    $detail = $bdd->prepare('SELECT
                     spb_services.spb_services__name,
                     spb_services.spb_services__description,
                     spb_services.spb_services__banner,
                     spb_services.spb_services__tabs,
                     spb_services.spb_services__category
                FROM spb_services
                WHERE spb_services.spb_services__name LIKE :service');

    // $GET? I assume you want to use the `$param you pass as a param to this function
    //$detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR);

    // a LIKE normally requires a string like '%something%'
    // or 'something%'
    // DO we assume you passed $param with the wildcards already applied?
    $detail->bindValue(':service', $param, PDO::PARAM_STR);

    // now the prepared query must be executed
    $detail->execute();

    // fetchAll returns ALL the result set into an array
    $resultat = $detail->fetchAll(PDO::FETCH_ASSOC);

    // as you are using a LIKE we have to assume there will be more 
    // than one row returned. 

    // fetchColumn makes no sense here
    //$lignes = $detail->fetchColumn();

    // You already did a fetchAll so this makes no sence
    //$detail = $detail->fetchAll(PDO::FETCH_ASSOC);

    // as all you appear to be doing is testing if one or more rows are returned
    // then all you need to do is coumt the occurances in the $resultat array

    $retour = (count($resultat) > 0) ? array('status' => 'ok') : array('status' => 'error');

    // Now you need to return something
    return $retour;


在类方法中使用global 也是不好的做法,因为它会破坏封装,最好将类似的东西作为参数传递。

EG这个

public static function getDetailService($param) 
    global $bdd;

变成这样

public static function getDetailService($bdd, $param) 
    // global $bdd;   <-- no longer needed

或者,如果整个班级都需要它,则将其设为班级属性!

如果我是对的,并且您想从这种方法中知道的只是是否存在某些东西,SELECT COUNT(id) as cnt 将是一种更有效的方法,但让我们再等一天,因为它也会改变您的获取方式结果并编写此代码的其余部分

最后注意:在任何可能出错的 PDO 语句之后,您都没有进行错误检查。几乎所有这些 PDO 语句都返回一个状态,如果为 false,您应该向自己显示 PDO 生成的错误消息,请参阅ErrorInfo

【讨论】:

您真的很有帮助,感谢您的所有建议,并感谢大家接受提示来回答我。我必须检查所有答案是否满意,但这个答案是最完整的,并且解决了问题。【参考方案4】:

你忘了做 $detail->execute();处理 SQL 请求

$detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR);
if( ! $detail->execute()) 
   die('Invalid Mysql Query!');

$resultat = $detail->fetchAll(PDO::FETCH_ASSOC);

希望有帮助:)

【讨论】:

派对晚了,伙计

以上是关于PDO 准备和执行查询总是返回错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 PDO 准备好的语句 MySQL 错误

PDO 语句错误 #1064

pdo 中的 errorinfo 函数总是在 medoo lib 中返回 0000

MySQL 全文连字符和大括号返回错误(最初:PDO 准备好的语句没有做它的工作?)

将空字符串绑定到 pdo 准备好的查询时 HY104 Sql server 错误

pdo 在字符串连接中准备