PHP Имплод, но обернуть каждый элемент в кавычки


Предположим у меня есть массив:

 $elements = array('foo', 'bar', 'tar', 'dar');

тогда я хочу построить DELETE IN SQL запрос:

 $SQL = "DELETE FROM elements
               WHERE id IN ('" . implode(',', $elements) . "')";

проблема в том, что идентификаторы в массиве элементов не цитируются каждый по отдельности. То есть запрос выглядит так:

 $SQL = "DELETE FROM elements
               WHERE id IN ('foo,bar,tar,dar');

каков лучший, самый элегантный способ исправить это?

4 51

4 ответа:

добавить кавычки в implode call: (я предполагаю, что вы имели в виду implode)

$SQL = 'DELETE FROM elements
           WHERE id IN ("' . implode('", "', $elements) . '")';

это производит:

DELETE FROM elements WHERE id IN ("foo", "bar", "tar", "dar")

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

простая вещь, чтобы сделать это должно работать (но я не проверял его), чтобы использовать либо array_map или array_walk, и экранировать каждый параметр, например:

$elements = array();
$elements = array_map( 'mysql_real_escape_string', $elements);

можно использовать array_walk чтобы перебрать все элементы в сторону массива, передающего ссылку на элемент и добавить кавычки следующим образом.

<?php

$arr = ['a','b','c'];

array_walk($arr, function(&$x) {$x = "'$x'";});

echo implode(',', $arr); // 'a','b','c'

?>

вы можете запустить простую функцию array_map (), чтобы обернуть строки в кавычки, а затем обернуть их вокруг implode (), чтобы добавить запятые:

$array = ["one", "two", "three", "four"];

implode(",", array_map(function($string) {
    return '"' . $string . '"';
}, $array));

просто добавить к верхнему ответу немного здесь, даже если вы используете MySQLi можно вызвать real_escape_string с помощью array_map с помощью метода объекта