Я знаю array_walk()
и array_map()
. Однако при использовании прежнего, как это было (по старому проекту), он не прошел
array_walk($_POST, 'mysql_real_escape_string');
Предупреждение: mysql_real_escape_string () ожидает, что параметр 2 будет ресурсом, указанная строка.
- Известная проблема с PHP-сессией IE 8?
- Как удалить автоматическое форматирование абзаца для страниц ТОЛЬКО, а не сообщений (WordPress)
- Предотвращение входа пользователей из неавторизованной области
- В чем разница между сеансами и файлами cookie в PHP?
- Как передать значение datepicker jquery в форме метода POST?
Поэтому я пошел с этой немного более уродливой версией
foreach($_POST as $key => $value) { $_POST[$key] = mysql_real_escape_string($value); }
Так почему же не первый способ работы? Каков наилучший способ сопоставления значений массива с функцией?
Ожидается, что функция обратного вызова, переданная в array_walk
, примет два параметра: один для значения и один для ключа:
Как правило, funcname принимает два параметра. Значение параметра массива является первым, а ключ / индекс вторым.
Но mysql_real_escape_string
ожидает, что вторым параметром будет ресурс. Вот почему вы получаете эту ошибку.
array_map
этого используйте array_map
, он принимает только значение каждого элемента и передает его данной функции обратного вызова:
array_map('mysql_real_escape_string', $_POST);
Второй параметр будет опущен, поэтому используется последнее открытое соединение.
Если вам нужно передать второй параметр, вам нужно обернуть вызов функции другой функцией, например анонимной функцией :
array_map(function($string) use ($link) { return mysql_real_escape_string($string, $link); }, $_POST);
Это потому, что mysql_real_escape_string присваивается два параметра: обе строки.
http://php.net/manual/en/function.mysql-real-escape-string.php
http://www.phpbuilder.com/manual/en/function.array-map.php :
array_map () возвращает массив, содержащий все элементы arr1 после применения функции обратного вызова к каждому из них. Количество параметров, которые принимает функция обратного вызова, должно соответствовать количеству массивов, переданных массиву array_map ()
вы могли бы сделать
function myescape($val) { return mysql_real_escape_string($val); }
… тогда
array_walk($_POST, 'myescape');
mysql_real_escape_string()
не будет работать, если вы сначала не подключили mysql. Причина, по которой это так здорово, заключается в том, что она будет выходить из символов таким образом, чтобы соответствовать типу таблицы. Второй [необязательный] аргумент является ссылкой на соединение mysql.
$_POST
всегда настроен как key->value
. Итак, array_walk
вызывает mysql_real_escape_string(value, key)
. Обратите внимание, что второй аргумент не является ссылкой.
Вот почему это не работает. Существует несколько решений, упомянутых выше.
http://php.net/manual/en/function.array-walk.php говорит, что array_walk вызовет функцию с двумя аргументами, значением и ключом. Вы должны написать новую функцию для переноса mysql_real_escape_string. Что-то вроде:
function wrapper($val, $key){ return mysql_real_escape_string($val); }
А потом:
array_walk($_POST, 'wrapper');
Извините, если мой PHP неправильный, но я думаю, вы поймете общую идею.
Я знаю, что OP попросил вызвать функцию, однако в тех случаях, когда вам действительно не нужно вызывать функцию, вы можете определить анонимную :
$ids = [1,2,3]; array_walk($ids,function(&$id){$id += 1000;});
У меня возникли проблемы с использованием принятого ответа, поскольку это вызвало у меня ошибки по причинам, которые я не мог решить. Поэтому для тех, у кого возникли проблемы с array_walk или array_map, я нашел, что это работает.
foreach($_POST as $pk => $pv) $_POST[$pk] = mysql_real_escape_string($pv);