2010-02-16 9 views
15

Ich bin bewusst, array_walk() und array_map(). Allerdings, wenn die frühere wie so verwenden (auf einem alten Projekt) es versäumtEinfache Möglichkeit, eine Funktion auf ein Array anzuwenden

array_walk($_POST, 'mysql_real_escape_string'); 

Warnung: mysql_real_escape_string() erwartet Parameter 2 Ressource zu sein, String angegeben.

Also ging ich mit dieser etwas hässlichen Version

foreach($_POST as $key => $value) { 
    $_POST[$key] = mysql_real_escape_string($value); 
} 

Also warum nicht die ersten Art und Weise der Arbeit? Was ist der beste Weg, um Werte eines Arrays einer Funktion zuzuordnen?

+0

Ist die hässliche Version eigentlich? –

+2

Hässliche Version * funktioniert *. – alex

Antwort

28
geleitet, um die Anzahl von Arrays entsprechen

Die Rückruffunktion, die an array_walk übergeben wird, akzeptiert zwei Parameter, einen für den Wert und einen für den Schlüssel:

Typischerweise funcname nimmt zwei Parameter. Der Array Parameter Wert ist der erste und der Schlüssel/Index Sekunde.

Aber mysql_real_escape_string erwartet, dass der zweite Parameter eine Ressource ist. Deshalb bekommst du diesen Fehler.

Verwendung array_map statt, dauert es nur um den Wert der einzelnen Elemente und leitet sie an den Callback-Funktion angegeben:

array_map('mysql_real_escape_string', $_POST); 

Der zweite Parameter wird verzichtet und so die zuletzt hergestellte Verbindung verwendet wird.

Wenn Sie den zweiten Parameter übergeben müssen, müssen Sie den Funktionsaufruf in eine andere Funktion, z. ein anonymous function:

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

'array_map()' ist auch eine bessere Wahl, weil es das ursprüngliche Array nicht verändert, es gibt ein neues Array zurück, nachdem die Funktion angewendet wurde. – kapa

2

Es ist, weil die mysql_real_escape_string zwei Parameter, beide Zeichenfolge, gegeben wird.

http://php.net/manual/en/function.mysql-real-escape-string.php

http://www.phpbuilder.com/manual/en/function.array-map.php:

array_map() gibt ein Array alle Elemente enthält arr1 nachdem die Rückruffunktion an jeden Anwendung. Die Anzahl der Parameter , dass die Callback-Funktion übernimmt sollte die array_map()

Sie

function myescape($val) 
{ 
    return mysql_real_escape_string($val); 
} 

tun könnten ... dann

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

Also 'array_walk()' wird jeden Array-Wert auf alle Parameter der Funktion abbilden? Ist das nicht ein bisschen ... * komisch *? Irgendwie kann ich "First param nur bitte" sagen? – alex

+0

Die Antwort auf die erste Frage ist NEIN. –

+0

Ich denke, myescape fehlt hier ein zweites Argument: $ key –

2

http://php.net/manual/en/function.array-walk.php sagt, dass array_walk die Funktion mit zwei Argumenten aufrufen wird, den Wert und den Schlüssel.Sie sollten eine neue Funktion schreiben, um mysql_real_escape_string zu umbrechen. Etwas wie:

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

Und dann:

array_walk($_POST, 'wrapper'); 

Sorry, wenn mein PHP nicht korrekt ist, aber ich denke, dass Sie die allgemeine Idee zu fangen.

+1

Sie meinen, das zweite Argument von 'array_walk()' sollte ''wrapper'' sein. – alex

2

mysql_real_escape_string() wird nicht funktionieren, wenn Sie eine mysql-Verbindung zuerst gemacht haben. Der Grund, warum es so cool ist, ist, dass es Zeichen in einer Weise entkoppelt, die dem Tabellentyp entspricht. Das zweite Argument [optional] ist ein Verweis auf die mysql-Verbindung.

$_POST ist immer als key->value eingerichtet. Also, Sie array_walk Anrufe mysql_real_escape_string(value, key). Beachten Sie, dass das zweite Argument keine Referenz ist.

Deshalb funktioniert es nicht. Es gibt mehrere oben bereits erwähnte Lösungen.

-2

Ich hatte Probleme mit der akzeptierten Antwort, weil es mir Fehler aus Gründen verursachte, die ich nicht ausarbeiten konnte. Also für jeden, der Probleme mit array_walk oder array_map hatte, fand ich das funktioniert.

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

Haben Sie eine Frage zu dem Problem gestellt? Auf diese Weise verbreitet diese Antwort einfach einen Mythos, dass es ein Problem mit 'array_map()' gibt. -1 – kapa

+0

@ bažmegakapa Dies verbreitet keinen Mythos. Dies ist nur eine alternative, einfacher zu verstehen, Lösung für diejenigen, die weniger mit PHP-Funktionen vertraut sind. Das OP hat nach einer einfachen Möglichkeit gefragt, eine Funktion auf ein Array anzuwenden, was das tut ... Worüber reden Sie überhaupt? –

+0

Ich habe nicht einmal erwähnt, dass der gleiche Code, den Sie als Antwort geschrieben hat, bereits in der Frage ist ... – kapa

1

weiß, dass ich die OP fragte eine Funktion aufzurufen, jedoch in den Fällen, in denen Sie nicht wirklich benötigen Sie eine Funktion aufrufen, definieren eine anonymous one:

$ids = [1,2,3]; 
array_walk($ids,function(&$id){$id += 1000;}); 
Verwandte Themen