Передача значений, разделенных запятыми, через скрипт php в запрос sql

Я передаю аргумент своему php-коду с помощью веб-браузера в следующем формате:

www.site.php?age=1&sex=2

Затем в коде, обращающемся к этим аргументам:

'age' => $_GET['age']
'sex' => $_GET['sex']

Один аргумент должен быть набором значений, разделенных запятыми (например, «1,2,3,4,5»). Когда я делаю следующее, интерпретируется только первое значение:

www.site.php?age=1&sex=2&nums=1,2,3,4,5

Я пробовал использовать скобки, скобки и т. Д., Которые нарушают код. Есть предположения? Спасибо,

РЕДАКТИРОВАТЬ: я неправильно предположил, когда произошла ошибка. Ошибка возникает при попытке выполнить вызов sql:

Это работает:

$sql = <<<SQL
    SELECT * from db
    WHERE age=:age AND nums in (1,2)
SQL;
$query = $dbs['base']['connection']->prepare($sql);

$query->execute(array(
    ':age'      => $_GET['age'],

));

Но это не удается, когда я передаю числа:

$sql = <<<SQL
    SELECT * from db
    WHERE age=:age AND nums in (:nums)
SQL;
$query->execute(array(
        ':age'      => $_GET['age'],
            ':nums'  => $_GET['nums']
    ));

Когда я просто печатаю $ _GET ['nums'], значения, разделенные запятыми, подходят. Как правильно передать аргумент nums в запрос sql?


person mike    schedule 26.01.2013    source источник
comment
Какое значение имеет $_GET['nums']? Просто возьмите его из этого элемента и используйте explode?   -  person slugonamission    schedule 26.01.2013
comment
Я использую его в запросе sql, говорящем WHERE num IN (1,2,3,4,6)   -  person mike    schedule 26.01.2013
comment
Но какое значение вы действительно получаете от переменной $ _GET?   -  person slugonamission    schedule 26.01.2013
comment
Значение, которое я пытаюсь получить, составляет 1,2,3,4,6, включая запятые.   -  person mike    schedule 26.01.2013
comment
затем просто используйте explode, чтобы разделить его. Передавать его прямо в БД - плохая практика, не избегая этого заранее.   -  person slugonamission    schedule 26.01.2013
comment
Проблема в том, что когда я передаю в веб-браузер значения, разделенные запятыми, передается только первое значение.   -  person mike    schedule 26.01.2013
comment
Не может быть. Для отладки используйте print_r($_GET); или $ _SERVER. Вероятно, ваш запрос к базе данных построен неправильно.   -  person mario    schedule 26.01.2013
comment
Да, понял это непосредственно перед прочтением этого - как я могу правильно перейти в запрос sql?   -  person mike    schedule 26.01.2013
comment
см. операторы PDO и SQL IN   -  person peterm    schedule 26.01.2013


Ответы (5)


Вы пробовали urlencode?

// set
$nums = urlencode(join(',', array(1,2,3,4,5)));

// get
$nums = explode(',', urldecode($_GET['nums']));
// i think needs sanitize
$nums = array_map('intval', $nums);
person K-Gun    schedule 26.01.2013
comment
Когда я пробую это сделать, экран просто печатает массив: $ nums = explode (',', urldecode ($ _ GET ['nums'])); печать ($ nums); Что мне не хватает? - person mike; 26.01.2013
comment
Но когда я просто выполняю $ nums = urldecode ($ _ GET ['cause']), я получаю 1,2,3,4,5 - person mike; 26.01.2013
comment
Да, но вам нужно отфильтровать $nums в целях безопасности. После фильтрации можно использовать join(), чтобы получить 1,2,3. - person K-Gun; 27.01.2013

URL закодировать запятыми, если вам нужна строка?

www.site.php?age=1&sex=2&nums=1%2C2%2C3%2C4%2C5

Кроме того, HTTP имеет формат массива для параметров, которые PHP может интерпретировать автоматически. Я забыл синтаксис насквозь, но это довольно просто.

Изменить 2: Неважно, вам нужна строка.

person Tim    schedule 26.01.2013

Непонятно, почему такой тест вам не подходит. Обратите внимание, что <pre> и print_r() предназначены только для отладки. explode(',', $_GET['nums']) - это ключ.

echo '<pre>';
$nums_array = explode(',', $_GET['nums']);
print_r($nums_array);
echo '</pre>';

Может быть, вам нужно поделиться с нами частью кода синтаксического анализа, чтобы лучше понять?

person Giacomo1968    schedule 26.01.2013

Преобразуйте запятую в более удобную форму на странице отправки

$nums = "1,2,3,4,5";
$nums = str_replace(',','|',$nums);

На странице, получающей GET, выполните следующие действия:

$nums = str_replace('|',',',$nums);
person Jason Small    schedule 26.01.2013

С вашим текущим интерфейсом базы данных вы не можете. Он использует подготовленные операторы. Ваш список будет преобразован в строку, поэтому он больше не будет списком значений для предложения IN.

Вот почему я, например, использую что-то вроде этого:

db("SELECT * from t1 WHERE id=? AND x IN (??)", $id, $array);

Однако вам придется вручную создать несколько ?,?,?,?,? заполнителей 1, в зависимости от длины входного списка (после упомянутого разнесения или, лучше, разделения str_getcsv). И да, вам нужны перечисляемые параметры, а не именованные.

1 Именно потому, что это скучно / утомительно, я не привожу здесь образец кода.

person mario    schedule 26.01.2013