Привязка запроса к воспламенителю кода - PullRequest
1 голос
/ 07 декабря 2011

У меня есть следующий запрос для выбора строк из таблицы на основе номера.

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


$sql =  "SELECT * FROM (
     SELECT @row:=@row+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:=@row+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')  

Но когда я выполняю запрос вручную без кавычек, он работает нормально.Я совершенно не знаю, как выполнить связывание без указания кавычек в запросе.

edit: я пытался удалить имплозу и использовать приведенный ниже код, но у меня та же проблема

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

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

Может быть, просто сделать его более безопасным с помощью $ this-> db-> escape, как упомянул Судхир ранее, а затем просто вставить экранированные значения в SQL (без привязки к запросу)?

$escaped_wanted = array();
foreach ($wanted as $id) {
  $escaped_wanted[] = $this->db->escape($id);
}
$targeted_rows = implode(",", $escaped_wanted);
$sql =  "SELECT * FROM (
     SELECT @row:=@row+1 as rownum, productsa.* FROM (
     SELECT @row:=0
            )r,productsa
            )ranked
            WHERE rownum IN ({$targeted_rows})";
$q = $this->db->query($sql);
0 голосов
/ 07 декабря 2011

Единственный способ, которым это будет работать, это вместо того, чтобы использовать implode, связать идентификаторы с помощью цикла foreach, а затем использовать:

$this->db->escape();  //to make it safer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...