2010-02-16 3 views
15

Я знаю 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); 
} 

Так почему же не первый способ работы? Каков наилучший способ сопоставления значений массива с функцией?

+0

ли на самом деле работает уродливая версия? –

+2

Ugly версия *. * Работа. – alex

ответ

28

Ожидается, что функция обратного вызова, переданная в array_walk, примет два параметра: один для значения и один для ключа:

Как правило, funcname имеет два параметра. Параметр является первым, а вторым/вторым.

Но mysql_real_escape_string ожидает, что вторым параметром будет ресурс. Вот почему вы получаете эту ошибку.

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

array_map('mysql_real_escape_string', $_POST); 

Второй параметр будет опущен, и поэтому последний открытый используется соединение.

Если вам нужно передать второй параметр, вам необходимо обернуть вызов функции другой функцией, например. anonymous function:

array_map(function($string) use ($link) { return mysql_real_escape_string($string, $link); }, $_POST); 
+3

'array_map()' также лучший выбор, потому что он не изменяет исходный массив, он возвращает новый массив после применения функции. – kapa

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); 
} 

... затем

array_walk($_POST, 'myescape'); 
+0

Итак, 'array_walk()' будет сопоставлять каждое значение массива со всеми параметрами функции? Разве это не немного .. * странно *? В любом случае я могу сказать «Первый парам только пожалуйста»? – alex

+0

Ответ на первый вопрос: НЕТ. –

+0

Я думаю, что myescape отсутствует здесь 2-й аргумент: $ key –

2

http://php.net/manual/en/function.array-walk.php говорит, что array_walk будет вызывать функцию с 2-мя аргументами, значения и ключа.Вы должны написать новую функцию для переноса mysql_real_escape_string. Что-то вроде:

function wrapper($val, $key){ 
    return mysql_real_escape_string($val); 
} 

А потом:

array_walk($_POST, 'wrapper'); 

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

+1

Вы имеете в виду, что второй аргумент 'array_walk()' должен быть '' wrapper''. – alex

2

mysql_real_escape_string() не будет работать, если вы не создали соединение mysql. Причина, по которой это так здорово, заключается в том, что она будет выходить из символов таким образом, чтобы соответствовать типу таблицы. Второй [необязательный] аргумент является ссылкой на соединение mysql.

$_POST всегда настроен как key->value. Итак, вы array_walk звоните mysql_real_escape_string(value, key). Обратите внимание, что второй аргумент не является ссылкой.

Вот почему он не работает. Существует несколько решений, упомянутых выше.

-2

У меня возникли проблемы с использованием принятого ответа, поскольку это вызвало у меня ошибки по причинам, которые я не мог решить. Поэтому для тех, у кого возникли проблемы с array_walk или array_map, я нашел, что это работает.

foreach($_POST as $pk => $pv) $_POST[$pk] = mysql_real_escape_string($pv); 
+0

Вы задали вопрос о том, в чем проблема? Таким образом, этот ответ просто распространяет миф о том, что существует некоторая проблема с 'array_map()'. -1 – kapa

+0

@ bažmegakapa Это не распространяется на миф. Это просто предоставление альтернативного, более простого для понимания решения для тех, кто менее знаком с функциями php. OP попросил простой способ применить функцию к массиву, что это делает ... О чем вы вообще говорите? –

+0

Я даже не упомянул, что тот же код, который вы отправили в качестве ответа, уже находится в вопросе ... – kapa

1

Я знаю, что OP попросил вызвать функцию, однако в тех случаях, когда вы на самом деле не нужно вызвать функцию можно определить anonymous one:

$ids = [1,2,3]; 
array_walk($ids,function(&$id){$id += 1000;}); 
Смежные вопросы