Форматирование массива PHP для предложения SQL «IN»

Я пытаюсь запросить базу данных для записей, где «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'

Что я делаю не так? Любая помощь очень ценится! Я могу уточнить вопрос при необходимости 🙂

Related of "Форматирование массива PHP для предложения SQL «IN»"

Существует лучший способ

Вы упомянете в комментариях, что используете 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')