MySQLI bindende Parameter mit call_user_func_array

8

Siehe unten meinen Code. Ich versuche, ein Array von Parametern an meine vorbereitete Anweisung zu binden. Ich habe mich im Internet umgesehen und kann sehen, dass ich call_user_func_array verwenden muss, aber es nicht zum Laufen bringen kann. Der Fehler, den ich bekomme, ist: "Es wird erwartet, dass das erste Argument ein gültiger Rückruf ist, Array wurde angegeben." Ich mag mich irren, aber ich nehme an, das erste Argument kann ein Array sein und vielleicht ist diese Fehlermeldung irreführend. Ich denke, das Problem ist, dass mein Array irgendwie schuld ist. Kann jemand sehen, was ich falsch mache? Danke.

%Vor%     
Columbo 16.12.2009, 10:57
quelle

6 Antworten

9

Ich wüsste nicht, warum Sie call_user_func_array verwenden müssen, aber das ist eine andere Geschichte.

Das Einzige, was in meinen Augen falsch sein könnte, ist, dass Sie einen Verweis auf das Objekt verwenden. Angenommen, Sie verwenden PHP 5. *, ist das nicht notwendig:

%Vor%     
Franz 16.12.2009, 11:05
quelle
16

Es muss so sein:

%Vor%     
abd.agha 12.07.2014 13:38
quelle
1

War nicht in der Lage, dies auf meine eigene Frage zu beantworten, weil es als betrogen markiert wurde: hier . Aber ich denke, dass meine endgültige Lösung, die die Antworten in dieser Frage verwendet, in meinem Anwendungsfall funktioniert, könnte für jemanden hilfreich sein.

Meine Ziele bestanden darin, einen Satz von IDs zu verwenden und sie in einer NOT IN MYSQL-Anweisung zu verwenden. Angenommen Array von 5 IDs wurde gepostet.

  1. Zählen Sie die Anzahl der gebuchten IDs, um die ? Platzhalter für die NOT IN Anweisung zu erstellen. Die Verwendung von $params_count = substr(str_repeat(',?', count($array_of_ids)), 1); ergibt das Ergebnis: (?,?,?,?,?) , das in der SQL-Anweisung verwendet werden soll.

  2. Stelle eine Funktion her, die IDs akzeptiert und i oder s usw. eingibt. Für mich waren das alle i , also ist meine Funktion einfacher. Rückgabe-Array, das wie folgt aussieht $params= array("iiiii",1,2,3,4,5) wobei der erste Wert die Menge i und die nachfolgenden Werte die IDs sind, die von der Gesamt-ID abhängen, die in die Funktion übergeben wurde.

    %Vor%

$params = build_bind_params($array_of_ids, "i");

  1. Verwenden Sie dann foreach ($params as $key => $value) $tmp[$key] = &$params[$key]; , um die neu erstellte $params richtig zum Binden zu formatieren.

  2. Verwenden Sie dann call_user_func_array(array($stmt , 'bind_param') , $tmp); , um das Array ordnungsgemäß zu binden.

  3. Führen Sie dann $stmt

  4. aus
Jeff Solomon 15.12.2017 21:15
quelle
1

Die meisten der oben genannten Lösungen sind keine Lösungen, ohne die Typen zusammen mit den Werten zu integrieren, bevor sie zu call_user_func_array () hinzugefügt werden. Diese Lösung hat für mich funktioniert:

%Vor%

Hier ist ein Verweis auf die vollständige Beschreibung, auf der dieses Beispiel basiert: Ссылка

    
Greg Gay 03.01.2018 17:48
quelle
0

Warum möchten Sie call_user_func_array (array ($ statement, 'bind_param'), $ bind_arguments) aufrufen? Weil $ bind_arguments ein Array ist. Sie erhalten eine Funktion, die eine Anweisung an ihre abgefragten Parameter bindet, unabhängig davon, wie viele Parameter Sie andernfalls hätten.

Beispiel für guten Code ...

%Vor%

Beispiel für fehlerhaften Code ...

%Vor%

Im ersten Beispiel: Sie können so viel oder so wenig an die auszuführende Bindung übergeben, dass bind () in nur einer Zeile in Ihrer gesamten Anwendung aufgerufen werden kann. Das ist gut skalierbar.

Im zweiten Beispiel: Sie müssen eine bind () -Anweisung für jede mögliche Gruppe von Einfügungen für jeden möglichen Datensatz in Ihrer Datenbank schreiben. Das skaliert schlecht.

    
HoldOffHunger 21.02.2016 21:38
quelle
0

Wenn Sie einen Fehler erhalten, sollten Sie Folgendes versuchen:

%Vor%     
paulalexandru 04.11.2016 22:26
quelle

Tags und Links