Я пытаюсь запросить базу данных для записей, где «product_id» включен в массив идентификаторов продуктов.
Массив – результат после ввода с множественным выбором ( <select>
) и выглядит так:
$clients = Array ( [0] => 80000016-1302638679 [1] => 8000003B-1329924004 )
Я хотел бы передать этот массив в предложение «IN» инструкции SQL, например:
$sql = "SELECT * FROM sales WHERE product_id IN (".$clients.")";
… но это не работает (Error: Message: Array to string conversion
).
В нескольких сообщениях предлагается использовать эту функцию для форматирования массива способом, подходящим для SQL:
function format_array($array){ return implode(', ', $array); } }
Такие как …
$sql = "SELECT * FROM sales WHERE product_id IN (".format_array($clients).")";
Это приводит к этому запросу:
SELECT * FROM sales WHERE product_id IN (80000016-1302638679, 8000003B-132992400)
… и эта ошибка:
Unknown column '8000003B' in 'where clause'
Что я делаю не так? Любая помощь очень ценится! Я могу уточнить вопрос при необходимости 🙂
Вы упомянете в комментариях, что используете CodeIgniter. Если вы не делаете что-то необычайно сложное, нет никакой практической причины, по которой вы должны строить свои собственные домашние where_in
когда у вас есть where_in
.
И если это не сработает, тогда будет хороший escape
моды.
Хорошо, поэтому у вас есть большинство людей, говорящих, что вам нужно процитировать элементы и дать вам следующее:
function createInClause($arr) { return '\'' . implode( '\', \'', $arr ) . '\''; }
но этого действительно недостаточно, если у вас есть возможность для сомнительного ввода (например, '); DROP TABLE STUDENTS; --
'); DROP TABLE STUDENTS; --
'); DROP TABLE STUDENTS; --
. Для защиты от этого вам необходимо убедиться, что вы проверяете SQL-инъекцию:
function createInClause($arr) { $tmp = array(); foreach($arr as $item) { // this line makes sure you don't risk a sql injection attack // $connection is your current connection $tmp[] = mysqli_escape_string($connection, $item); } return '\'' . implode( '\', \'', $tmp ) . '\''; }
Попробуйте это, чтобы положить свои идентификаторы в кавычки:
function format_array($array){ return "'" . implode("', '", $array) . "'"; } }
Как указал cwallenpoole, вы должны избежать строки, если вы этого еще не сделали. Не избежание строки крайне опасно, особенно если у вас есть публичное приложение.
Вы должны поставить 80000016-1302638679
в кавычки. В противном случае предполагается, что вы делаете вычитание.
return "'".implode("', '", $array)."'";
Используйте эту функцию
function format_array($array){ return implode("','", $array); } }
И этот запрос
$sql = "SELECT * FROM sales WHERE product_id IN ('".$clients."')";
Вам нужно поместить их в кавычки, как
SELECT * FROM sales WHERE product_id IN ('80000016-1302638679', '8000003B-132992400')
Вам нужно обернуть свои позиции в кавычки. Вот быстрое решение:
$clientIds = ""; foreach ($clients as $client) { $clientIds .= ($clientIds == "" ? "" : ", ") . "'".mysqli_escape_string($client)."'"; } $sql = "SELECT * FROM sales WHERE product_id IN (".$clientIds.")";
Поместите значения под цитатой следующим образом:
SELECT * FROM sales WHERE product_id IN ('80000016-1302638679', '8000003B-132992400')