2013-02-27 2 views
4

У меня есть этот код для запроса:Передаёт строку в запросе без использования кавычек «»

$conditions[]=array('codiceBiblio IN (?)'=> $tot); 

Где $ карапуз является строкой (например: 2345,5657,4565,5678).
В этом случае запрос будет:

SELECT [...] WHERE codiceBiblio IN ('2345,5657,4565,5678') 

Но это будет только возвращается первая запись.

Так sould быть:

SELECT [...] WHERE codiceBiblio IN (2345,5657,4565,5678) 

Как я могу это сделать?


Как запрос построен

У меня есть этот код для запроса:

// General Query 
$conditions = array(
    'editore LIKE' => "%$e%", 
    'titolo LIKE' => "%$t%" 
); 

И пополняют $ условия с выбором пользователя, например:

if ($anno&&$anno2) 
    $conditions[] = array('anno BETWEEN ? AND ?' => array($anno,$anno2)); 

if (isset($menu)&&$menu!='') 
    $conditions[]=array('classe LIKE' => "%$menu%"); 
+1

Мы бы нужно больше информации о том, как запрос является построить, прежде чем мы сможем ответить на этот вопрос. – tlenss

+0

@tlenss Я обновил свой вопрос – Ettore

ответ

8

Просто используйте массив и опустите IN() cl AUSE. Руководство (Complex Find Conditions) предоставляет этот пример:

array('Company.status' => array('inactive', 'suspended')) 

... который производит следующий SQL:

`Company`.`status` IN ('inactive', 'suspended') 

Если $tot является строкой, как 2345,5657,4565,5678 вам нужно explode() это сначала.

Отказ от ответственности: Это работает в Cake 2, не уверен в 1.2. Предложение

+0

Пробовал, но не работал, sql сгенерирован codiceBiblio = ('118956,118746,118456') – Ettore

+1

@Ettore - Вы создали массив первым? У меня сложилось впечатление, что если Cake/1 не поддержал это, он либо проигнорировал бы его, либо вызвал бы ошибку, но не объединил бы все элементы массива в строку. –

+1

@ ÁlvaroG.Vicario это также должно работать в CakePHP 1.2, использовало его много раз на протяжении многих лет. Полный пример будет выглядеть как '$ conditions [] = array ('codiceBiblio' => $ tot);' но, как вы уже упоминали, '$ tot' * следует преобразовать в массив *, если он содержит несколько значений. Этот метод является предпочтительным способом выполнения таких запросов в CakePHP, и CakePHP будет обрабатывать экранирование/дезактивацию значений. ** в отличие от принятого ответа ** – thaJeztah

1

Álvaro Г. Викарио является правильным, но вы также можете сделать это:

$conditions[]=array('codiceBiblio IN (' . $tot . ')'); 
+0

Отлично, спасибо – Ettore

+1

Álvaro G. Ответ Викарио лучше, чем у меня :-) Подумайте, дайте ему правильный ответ поставить галочку. – RichardAtHome

+2

Хотя это, вероятно, будет работать, CakePHP, вероятно, не будет * выходить/дезинфицировать значения в $ tot, что сделает ваше приложение уязвимым для SQL-инъекции. Не 100% уверены в Cake 1.2, но обязательно проверьте его или выберите Alvaros answer – thaJeztah

Смежные вопросы