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

时间:2016-05-04 12:22:43

标签: php mysql pdo phpmyadmin prepare

我有一个功能,

返回给我的

总是一个错误,即使在phpmyadmin中,当我通过查询时也会有结果。

我猜我的查询有问题,但我不知道是什么。我曾经做过我的代码做mysql_real_escape_string,然后我转向PDO,他们告诉我我应该为逃避GET变量做准备,所以我试着去做。

以下是我的查询

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转储返回给我预期的(来自网址)

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

我在我的localhost phpmyadmin中通过查询,它返回给我的预期但不是在使用PDO时。

我猜小事情是错的,我不知道是什么。

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

一样

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

非常感谢Anykind的帮助

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

4 个答案:

答案 0 :(得分:2)

需要纠正参数绑定。

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

更正后的代码:

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

答案 1 :(得分:2)

只在代码中发出忘记在获取数据之前执行查询它将是

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

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

希望有所帮助:)