Развернуть/свернуть список для Mysql, ГДЕ В ()

Я действительно застрял с этим.

Я пытаюсь передать список кодов в оператор MySql, но не в том формате, в котором он работает.

Мой список исходит из текстовой области формы под названием «уникальный код».

Примеры кодов (все на новой строке) из текстовой области:

фг3456 тг7844 де3902 .. и т.д.

Я пытаюсь взорвать и взорвать список с помощью:

$ar = $_POST['uniquecode']
$in = "'".implode("','", explode("\n", $ar))."'";

Затем результат $in передается в статус Mysql:

$sql = "SELECT code, size, price from stock WHERE code IN ($in)";

Когда я повторяю $sql, я получаю следующее:

SELECT housecode, name, cost, size, price FROM stock where code IN ('fg3456 ','tg7844 ', ','de3902')

Как видите, только ПОСЛЕДНИЙ элемент, 'de3902', отформатирован правильно. Обратите внимание, что первый элемент в списке имеет пробел, затем одинарную кавычку, а затем запятую: 'fg3456',

Из-за этой проблемы, когда я пытаюсь просмотреть набор результатов из запроса, возвращается только последний элемент:

$result = $mysqli->query($sql); 
if ($result = mysqli_query($mysqli, $sql)) {
        while($row = $result->fetch_array()) {
            $code = $row['code'];
            $name = $row['name'];
            $size = $row['size'];
            $price = $row['price'];
        }   

 echo $code; //returns last item in the list: de3902

Итак, мой вопрос заключается в том, как взорвать/взорвать список в правильный формат для предложения IN запроса Mysql, чтобы он правильно читался и возвращал все коды???

SELECT code, name, size, price from stock WHERE code IN ('fg3456','tg7844','de3902')

С уважением


person Hexana    schedule 18.12.2014    source источник
comment
Правильный способ (на мой взгляд...) состоял бы в том, чтобы перебирать ваши значения и добавлять вопросительный знак для каждого значения, а затем привязывать значения к этим заполнителям после того, как вы подготовили оператор. Прямо сейчас у вас есть проблема с SQL-инъекцией.   -  person jeroen    schedule 18.12.2014
comment
Взорвите в отдельный вар, сделайте обрезку и добавьте их в имплоде, только если обрезана длина › 0   -  person Marco Mura    schedule 18.12.2014
comment
Пожалуйста, опубликуйте вывод из var_dump($_POST['uniquecode']), скопированный из исходного кода страницы браузера, а не отображаемый на экране. У вас есть что-то ложное (я думаю, не лишний разрыв строки), что нарушает ваш implode(), возможно, это можно исправить с помощью arary_filter(). Но необходимо предпринять шаги, чтобы защитить это от SQL-инъекций.   -  person Michael Berkowski    schedule 18.12.2014
comment
var_dump($ar) результат: строка(23) fg3456 tg7844 de3902   -  person Hexana    schedule 18.12.2014
comment
@Hexana В показанной строке всего 20 символов, поэтому, возможно, вам следует использовать preg_split() вместо этого, чтобы разбить на несколько пробелов или символов новой строки.   -  person jeroen    schedule 18.12.2014
comment
Defo решит проблему инъекций!!   -  person Hexana    schedule 18.12.2014


Ответы (2)


Как упоминалось в комментариях, я бы перебирал ваши значения и добавлял вопросительный знак для каждого значения, а затем привязывал значения к этим заполнителям после того, как вы подготовили оператор. Прямо сейчас у вас есть проблема с SQL-инъекцией.

Однако, чтобы убедиться, что вы получаете нужную строку с вводом, который вы, кажется, получаете, вы можете использовать preg_split() для разбивки на несколько пробелов, табуляции или символов новой строки.

Для примера:

$st = trim(" \n fg3456   tg7844  \n  \n de3902  \n ");
$ar = preg_split('#\s+#', $st);
var_dump($ar);
$in = "'".implode("','", $ar)."'";
var_dump($in);

Результат:

array(3) {
  [0]=>
  string(6) "fg3456"
  [1]=>
  string(6) "tg7844"
  [2]=>
  string(6) "de3902"
}
string(26) "'fg3456','tg7844','de3902'"

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

$st = trim(" \n fg3456   tg7844  \n  \n de3902  \n ");
$ar = preg_split('#\s+#', $st);
$in = trim(str_repeat('?,', count($ar)), ',');
$sql = "SELECT code, size, price from stock WHERE code IN ($in)";
var_dump($sql);

Результат:

string(57) "SELECT code, size, price from stock WHERE code IN (?,?,?)"

Кстати, лично я бы использовал PDO, так как это значительно упростило бы привязку.

person jeroen    schedule 18.12.2014
comment
БИНГО !!! Умное печенье. Эта строка сделала свое дело $ar = preg_split('#\s+#', $st); Большое спасибо. Однако мне нужно решить проблему с инъекцией :) - person Hexana; 18.12.2014

Почему вы взрываетесь на \n, кажется, вы должны взорваться на пространстве (' '). В противном случае взрыв выглядит нормально.

В качестве альтернативы вы можете сделать preg_replace, чтобы заменить любое количество пробелов (цитировать запятую). $in = "'" . preg_replace('/\s+/',"','", $ar) . "'";.

person Dan    schedule 18.12.2014
comment
Пробовали: $ar = ' . preg_replace('/\s+/,',',' $ar) . '; но дает мне ошибку синтаксического анализа !! - person Hexana; 18.12.2014
comment
Должно быть $in=..., я отредактирую. О, и я пропустил цитату вокруг регулярного выражения. - person Dan; 18.12.2014