Легкий способ применения функции к массиву
Я знаю array_walk()
и array_map()
. Однако при использовании первого типа (в старом проекте) он не удался
array_walk($_POST, 'mysql_real_escape_string');
Предупреждение: mysql_real_escape_string() ожидает, что параметр 2 будет ресурсом, строка.
Итак, я пошел с этой немного более уродливой версией
foreach($_POST as $key => $value) {
$_POST[$key] = mysql_real_escape_string($value);
}
Так почему же первый способ не работал? Каков наилучший способ сопоставления значений массива с функцией?
Ответы
Ответ 1
Функция обратного вызова, переданная в array_walk
, должна принимать два параметра: один для значения и один для ключа:
Как правило, funcname принимает два параметра. Значение параметра массива является первым, а второй/индекс вторым.
Но mysql_real_escape_string
ожидает, что вторым параметром будет ресурс. Вот почему вы получаете эту ошибку.
Используйте array_map
, он принимает только значение каждого элемента и передает его данной функции обратного вызова:
array_map('mysql_real_escape_string', $_POST);
Второй параметр будет опущен, поэтому используется последнее открытое соединение.
Если вам нужно передать второй параметр, вам необходимо обернуть вызов функции другой функцией, например. анонимная функция :
array_map(function($string) use ($link) { return mysql_real_escape_string($string, $link); }, $_POST);
Ответ 2
Это потому, что 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);
}
... then
array_walk($_POST, 'myescape');
Ответ 3
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 неверен, но я думаю, вы поймете общую идею.
Ответ 4
mysql_real_escape_string()
не будет работать, если вы сначала не подключили mysql. Причина, по которой это так здорово, заключается в том, что она будет выходить из символов таким образом, чтобы соответствовать типу таблицы. Второй [дополнительный] аргумент является ссылкой на соединение mysql.
$_POST
всегда устанавливается как key->value
. Итак, вы array_walk
звоните mysql_real_escape_string(value, key)
. Обратите внимание, что второй аргумент не является ссылкой.
Вот почему это не работает. Существует несколько решений, упомянутых выше.
Ответ 5
Я знаю, что OP попросил вызвать функцию, однако в тех случаях, когда вам действительно не нужно вызывать функцию, вы можете определить анонимный:
$ids = [1,2,3];
array_walk($ids,function(&$id){$id += 1000;});
Ответ 6
У меня возникли проблемы с использованием принятого ответа, поскольку он вызвал у меня ошибки по причинам, которые я не мог решить. Поэтому для тех, у кого возникли проблемы с array_walk или array_map, я нашел, что это работает.
foreach($_POST as $pk => $pv) $_POST[$pk] = mysql_real_escape_string($pv);