php - por - Una manera fácil de aplicar una función a una matriz
multiplicar matriz por vector excel (6)
Esto se debe a que a mysql_real_escape_string se le están asignando dos parámetros, ambas cadenas.
http://php.net/manual/en/function.mysql-real-escape-string.php
http://www.phpbuilder.com/manual/en/function.array-map.php :
array_map () devuelve una matriz que contiene todos los elementos de arr1 después de aplicar la función de devolución de llamada a cada uno. El número de parámetros que acepta la función de devolución de llamada debe coincidir con el número de matrices pasadas a array_map ()
Podrías hacerlo
function myescape($val)
{
return mysql_real_escape_string($val);
}
... entonces
array_walk($_POST, ''myescape'');
Soy consciente de array_walk()
y array_map()
. Sin embargo, al usar el anterior como tal (en un proyecto anterior), falló
array_walk($_POST, ''mysql_real_escape_string'');
Advertencia: mysql_real_escape_string () espera que el parámetro 2 sea un recurso, una cadena dada.
Así que fui con esta versión un poco más fea.
foreach($_POST as $key => $value) {
$_POST[$key] = mysql_real_escape_string($value);
}
Entonces, ¿por qué no funcionó la primera manera? ¿Cuál es la mejor manera de asignar los valores de una matriz a una función?
Sé que el OP solicitó llamar a una función, sin embargo, en los casos en los que realmente no necesita llamar a una función, puede definir una anónima :
$ids = [1,2,3];
array_walk($ids,function(&$id){$id += 1000;});
Se espera que la función de devolución de llamada pasada a array_walk
acepte dos parámetros, uno para el valor y otro para la clave:
Normalmente, funcname toma dos parámetros. El valor del parámetro de matriz es el primero, y la clave / índice segundo.
Pero mysql_real_escape_string
espera que el segundo parámetro sea un recurso. Es por eso que estás recibiendo ese error.
Utilice array_map
en array_map
lugar, solo toma el valor de cada elemento y lo pasa a la función de devolución de llamada dada:
array_map(''mysql_real_escape_string'', $_POST);
El segundo parámetro se omitirá y, por lo tanto, se utilizará la última conexión abierta.
Si necesita pasar el segundo parámetro, debe ajustar la llamada a la función en otra función, por ejemplo, una función anónima :
array_map(function($string) use ($link) { return mysql_real_escape_string($string, $link); }, $_POST);
Tuve problemas para usar la respuesta aceptada, ya que me causó errores por razones que no pude resolver. Así que para cualquier persona que tenga problemas con array_walk o array_map, encontré que esto funciona.
foreach($_POST as $pk => $pv) $_POST[$pk] = mysql_real_escape_string($pv);
http://php.net/manual/en/function.array-walk.php dice que array_walk llamará a la función con 2 argumentos, el valor y la clave. Debería escribir una nueva función para envolver mysql_real_escape_string. Algo como:
function wrapper($val, $key){
return mysql_real_escape_string($val);
}
Y entonces:
array_walk($_POST, ''wrapper'');
Lo siento si mi PHP no es correcto, pero creo que captarás la idea general.
mysql_real_escape_string()
no funcionará a menos que primero haya realizado una conexión mysql. La razón por la que es tan genial es que escapará de los caracteres de una manera que se ajuste al tipo de tabla. El segundo argumento [opcional] es una referencia a la conexión mysql.
$_POST
siempre se configura como key->value
. Por lo tanto, array_walk
llama mysql_real_escape_string(value, key)
. Note que el segundo argumento no es una referencia.
Por eso no funciona. Hay varias soluciones ya mencionadas anteriormente.