PHP массив для предложения SQL "IN"?

Я пытаюсь найти несколько номеров роллов из базы данных с помощью HTML-формы, например, 2345,7654,8976 в одном поле сейчас для php я пытаюсь

$query = "SELECT `firstname`, `lastname`, `roll`, `board`, `city` FROM `result` WHERE 1=1";

if(isset($_POST['mroll']))
{
$mroll=$_POST['mroll'];
$query.="and roll IN ('$mroll')";
}

но $_POST['mroll'] будет выглядеть следующим образом => 2345,7654,8976 для sql. Я должен процитировать их следующим образом => '2345','7654','8976', прежде чем использовать его в запросе, помогите.

1 ответ

Решение

Поскольку значения являются целыми числами, если вы не заключите в кавычки переменную, запрос будет действительным. Это откроет вам для SQL инъекций, хотя. Вы должны использовать параметризованный запрос и передавать каждое значение в качестве заполнителя. Попробуйте что-то вроде:

$query = "SELECT `firstname`, `lastname`, `roll`, `board`, `city` FROM `result` WHERE 1=1";
if(isset($_POST['mroll'])) {
     $mroll=$_POST['mroll'];
     foreach(explode(',', $mroll) as $int) {
         $placeholders .= '?, ';
         $params[] = $int; 
     }
     $placeholders = rtrim ($placeholders, ', ');
     $query .= " and roll IN ($placeholders)";
}

Демо: https://eval.in/657610

Технически вы можете просто изменить:

$query.="and roll IN ('$mroll')";

в

$query.="and roll IN ($mroll)";

очень препятствуйте этому подходу все же.

Ваш запрос при цитировании становится:

SELECT `firstname`, `lastname`, `roll`, `board`, `city` FROM `result` WHERE 1=1and IN ('2345,7654,8976')

что делает 2345,7654,8976 одно значение, а не три значения.

Другие вопросы по тегам