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

53

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

<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>

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

Будьте очень осторожны ... вы, вероятно, открыты для серьезного внедрения SQL. Brad
Какой лучший способ предотвратить внедрение SQL с помощью решения, предоставленногоnickb затем? Благодарю. Justin

Ваш Ответ

4   ответа
0

даже если вы используете 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);
3

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

<?php

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

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

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

?>
Пожалуйста, добавьте пояснение, почему это ответ. Это может показаться вам тривиальным, но поскольку вы не добавляете никаких объяснений, ваше предложение открыто для толкования относительно его использования.
104

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

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

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

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

Похожие вопросы