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

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

<code> $elements = array('foo', 'bar', 'tar', 'dar');
</code>

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

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

Проблема состоит в том, что идентификаторы в массиве элементов не указаны в отдельности. I.E запрос выглядит так:

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

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

 Justin08 мая 2012 г., 02:25
Какой лучший способ предотвратить внедрение SQL с помощью решения, предоставленногоnickb затем? Благодарю.
 Brad08 мая 2012 г., 02:16
Будьте очень осторожны ... вы, вероятно, открыты для серьезного внедрения SQL.

Ответы на вопрос(4)

даже если вы используете MySQLi, можно вызвать real_escape_string с помощью array_map с помощью метода объектаcallable форма. Вот пример, предполагая,$conn ваше соединение MySQLi:

$elements = array('foo', 'bar', 'tar', 'dar');
$cleanedElements = array_map([$conn, 'real_escape_string'], $ids);
$SQL = 'DELETE FROM elements WHERE id IN ("' . implode('", "', $elements) . '")';

Обратите внимание, что первым параметром array_map является массив с объектом, за которым следует имя метода. Это то же самое, что выполнить следующее для каждого элемента в массиве:

$newItem = $conn->real_escape_string($item);

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

<?php

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

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

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

?>
 01 февр. 2018 г., 14:35
Пожалуйста, добавьте пояснение, почему это ответ. Это может показаться вам тривиальным, но поскольку вы не добавляете никаких объяснений, ваше предложение открыто для толкования относительно его использования.
Решение Вопроса

Добавьте цитаты вimplode позвоните: (Я предполагаю, что вы имели в виду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);
 08 мая 2012 г., 02:30
@Justin Лучший способ - использовать готовые заявленияphp.net/manual/en/pdo.prepared-statements.php php.net/manual/en/mysqli.prepare.php
 Justin08 мая 2012 г., 02:46
Спасибо, использовал array_map.
 Justin08 мая 2012 г., 02:24
Отлично, так как лучше всего предотвратить SQL-инъекцию, как предложил Брэд с этим решением?
 08 мая 2012 г., 02:28
@Jusin Я отредактировал свой ответ с предложением о предотвращении SQL-инъекций.
 01 февр. 2018 г., 18:30
Не используйте функции mysql_.

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

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

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

Ваш ответ на вопрос