2011-12-07 8 views
1

rownumberに基づいてテーブルから行を選択する次のクエリがあります。コードIgniterクエリバインディング

$targeted_rows = implode(",",$wanted); 


$sql = "SELECT * FROM (
    SELECT @row:[email protected]+1 as rownum, productsa.* FROM (
    SELECT @row:=0 
      )r,productsa 
      )ranked 
      WHERE rownum IN (?) "; 
$q = $this->db->query($sql, $targeted_rows); 

if($q->num_rows() > 0) { 
    foreach ($q->result() as $row) { 
    $data[] = $row; 
} 
return $data; 
}; 

現在、私のクエリは次のように実行されています。数字の周りの引用符で、それは動作していません。

SELECT * FROM (
       SELECT @row:[email protected]+1 as rownum, productsa.* FROM (
        SELECT @row:=0 
       )r,productsa 
      )ranked 
      WHERE rownum IN ('1,4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172') 

しかし、引用符を使わないで手動でクエリを実行すると、正常に動作します。私はクエリで引用符を表示せずにバインディングを行う方法を完全に失っています。

編集:foreachループを使用してIDをcontatenate、それが動作する唯一の方法ではなく、内破使用してのものであり、私は破を削除し、以下のコードを使用してみましたが、私は同じ問題

foreach ($wanted as $value){ 
    $targeted_rows .= $value . ","; 
}  
$this->db->escape($targeted_rows); 

答えて

0

おそらく単純ます$ this-> DB->エスケープして、それがより安全に?

$escaped_wanted = array(); 
foreach ($wanted as $id) { 
    $escaped_wanted[] = $this->db->escape($id); 
} 
$targeted_rows = implode(",", $escaped_wanted); 
$sql = "SELECT * FROM (
    SELECT @row:[email protected]+1 as rownum, productsa.* FROM (
    SELECT @row:=0 
      )r,productsa 
      )ranked 
      WHERE rownum IN ({$targeted_rows})"; 
$q = $this->db->query($sql); 
+0

と同じクエリの出力を得るありがとうそれは完璧に動作します。 – JCrev

0

を取得し、その後、使用:のSudhirは、前述した後、単に(クエリが結合することなく)SQLにエスケープ値を挿入として

 
$this->db->escape(); //to make it safer 
+0

私が欠けているかわからないんだけど、私は

 foreach ($wanted as $value){ \t \t $targeted_rows .= $value . ","; \t } \t \t \t $this->db->escape($targeted_rows); 
としてそれをしようとしたとき、私は引用符(私はコメントでコードをフォーマットする方法は考えている。) – JCrev