2017-02-01 4 views
0

Ich verstehe, dass wir Referenzen auf mysqli_stmt_bind_param übergeben müssen. Ich mache folgendesmysqli_stmt_bind_param - erwartet Referenzen

$ref = refValues($data); 
    function refValues($arr){ 
     $refs = array(); 
     foreach($arr as $key => $value) 
      $refs[$key] = &$arr[$key]; 
      var_dump(implode(",", $refs)); 
      return $refs; 
    return $arr; 
} 

Ich habe alle meine Werte in einem Array. Ich verwende die obige Funktion, um die Referenzen zu erhalten. Got the above answer from SO

Meine PHP-Version ist 5.6

ich die params in der folgenden Art und Weise bin verbindlich.

mysqli_stmt_bind_param($stmt, $types, $ref); 

$stmt ist eine Aussage über mysqli_prepare erstellt. Es gibt Fehlernummer 0.

$types ist nichts anderes als $types = str_pad('',count($data),'s');

I $types Daten auch überprüft haben. Es gibt die erwartete Anzahl von Typen zurück. d. h. ssssssss

Wenn ich ausführe, erhalte ich den folgenden Fehler.

Only variables should be passed by reference in test.php 

fand ich this Lösung in SO. Ich kann keine 100 Variablen zuweisen. Ich denke nicht, dass das machbar ist.

Ich fand eine andere Alternative ist call_user_func_arrary.

$values = refValues($data); 
call_user_func_array(array($stmt, 'bind_param'), $values); 

Es gibt number of bind type doesn't match number of values zurück. Es ist komisch für mich. Ich habe das Array und die Werte überprüft. Beide Zählungen stimmen überein. Mir ist keine interne Implementierung von call_user_func_array bekannt.

Bitte lassen Sie mich wissen, gibt es eine Möglichkeit, dies effizient zu lösen.

+0

Nun, zunächst einmal, 'Funktion refValues ​​($ arr) {' erstellt eine Kopie von '$ data' – Xorifelse

+0

@Xorifelse Bitte Siehe den aktualisierten Link. 34 upvotes für die Antwort. Erstellt es keine Referenzen? –

+0

In Ihrem Code $ ref ist ein Array (Wert), das Referenzen enthält. –

Antwort

3

Diese Linie

mysqli_stmt_bind_param($stmt, $types, $ref); 

bedeutet, dass Sie ein Bezug zu binden.

Warum? Mal sehen:

  • erstes Argument ist eine Aussage
  • zweites Argument ist ein String mit Typen
  • folgenden Argumente Verweise auf Werte, die binded werden sollen.

Wie Sie ein Argument übergeben (es ist $ref) - Sie versuchen, nur ein Wert zu binden. Und $ref ist nicht eine Referenz, es ist Array von Werten, die Verweise sind. Sieh den Unterschied? Array von Referenzen gegen Referenz.

So nahm man zweiten Ansatz, und es ist ein richtiger:

$values = refValues($data); 
call_user_func_array(array($stmt, 'bind_param'), $values); 

Was hier der Fehler ist? Sie ging nicht Typen $types:

// do not assign anything to a variable 
// pass results of `refValues` directly to `call_user_func_array` 
call_user_func_array(array($stmt, 'bind_param'), array_merge(array($types), refValues($data))); 

Was wir hier tun, tun: wir versuchen $stmt->bind_param anrufen und auf diese Funktion Argumente als Array übergeben.

Was sind die Argumente von $stmt->bind_param?

  • erste Argument ist Typen ($types)
  • folgende Argumente Verweise auf Werte ($values)

Jetzt sollte es funktionieren.

+0

Ich bekomme 'Warnung: Parameter 2 zu mysqli_stmt :: bind_param() erwartet, um eine Referenz, Wert gegeben werden 'Jede Hilfe? –

+0

@GopsAB verwenden PDO –

+0

Behoben, siehe Update. –

1

Es gibt zwei Möglichkeiten, diese Umstände zu vermeiden:

  1. Verwendung PDO. Ihr aktuelles Problem ist nur das erste von vielen WTFs, die Sie mit mysqli haben werden. In diesem speziellen Fall wäre es so einfach und natürlichen als

    $stmt = $db->prepare($sql); 
    $stmt->execute($data); 
    
  2. in Ordnung, Sie haben so eine Laune der mysqli verwenden. Dann, solange Sie eine unterstützte PHP-Version verwenden, you can use a splat or a three dot operator:

    $stmt = $db->prepare($sql); 
    $types = str_repeat('s', count($data)); 
    $statement->bind_param($types, ...$data); 
    $statement->execute(); 
    
+0

Danke. Ich werde über ein Upgrade auf PDO nachdenken. –