2016-05-04 93 views
0

我有一个函数,PDO准备和执行查询总是返回错误

总是返回给我一个错误,即使在phpMyAdmin的时候我过去询问有结果。

我猜在我的查询中有些问题,但我不知道是什么。我曾经做我的代码做mysql_real_escape_string,然后我转向PDO,他们告诉我,我应该做一个逃避GET VAR的准备,所以我试着做。

下面是我的查询

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])回报对我有什么期望(从URL)

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

我通过我的本地主机phpmyadmin中的查询,它返回给我什么预期,但不是当使用PDO。

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

这将返回没有错误,但总是错误,因为如果没有num_rows_result

总结起来麻烦,得到返回什么期望,但是当我们去查询,它返回任何结果(除我的phpmyadmin复制和粘贴查询)的帮助下

Anykind将非常感激

编辑:做其他用户

+1

' “:服务”'这里去除双引号。在'bindValue'加上':''以前 – Daan

+0

service'我仍然是一个错误 –

+0

它仍然不能正常工作: SQL:[270] 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 Params:1 Key:Name:[8]:service paramno = -1 name = [8]“:service”is_param = 1 param_type = 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是这样做的更有效的方式,但让我们留到另一天,因为它也将chnage如何得到结果并编写代码的其余部分

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

+0

你真的很有帮助,谢谢你的所有建议,并感谢大家回答我的提示。我将不得不检查所有的答案满足,但这是最完整的,并解决了这个问题。 –

2

参数绑定需要更正为预期的修改。

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

更正代码:在你的代码

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

感谢您的帮助,我做到了这一点,但我仍然没有结果 –

+1

首先,OP必须删除一些引号。 –

+0

我这样做是为了删除报价 –

2

唯一的问题忘了取数据之前执行查询这将是

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

我做了所有的修改,但它仍然无法正常工作,我想我错了别的地方 –

+0

阅读我的第二点 – Saty

+0

我做了'$ detail-> bindValue(':service',$ _GET [$ param],PDO: :PARAM_STR); $ detail-> execute(); //首先执行它 $ 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);'我有一个错误 –

1

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

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

希望帮助:)

+0

晚会派对伙伴 – RiggsFolly

+0

awwwwwww .... :( –