2009-03-09 18 views
0

Ich habe ein paar Fragen in den letzten Tagen gesehen, die mysqli verwendet haben, aber wo die Antworten den Unterschied zwischen $stmt->execute() und $db->query() nicht erkannt haben.Mischen PHP mysqli Datenzugriffsfunktionen?

Wie ich es verstehe, gibt es zwei verschiedene Modelle für den Zugriff auf Ergebnisse in mysqli.

Dies verwendet rohe SQL und erfordert den Programmierer die Eingabe zu entkommen SQL-Injection-Angriffe zu verhindern, aber erlaubt es den Programmierer, eine assoziative Array (oder ein einfaches Array) enthält column => value Mappings abzurufen:

$result_set = $db->query("SAFE SQL QUERY HERE"); 
while ($row = $result_set->fetch_assoc()) { 
    # do something with $row['fieldname']; 
} 

Alternativ Sie tun dies, was schön Bindung von Parametern und Ergebnissen erlaubt, kann aber nicht (AFAIK) geben Sie jede Art von einfachen Array Ergebnis:

$stmt = $db-prepare("SQL QUERY WITH ? PLACEHOLDERS"); 
$stmt->bind_param("s", $input_variable); 
$stmt->execute(); 
$stmt->bind_results($output_col1, $output_col2); 
while ($stmt->fetch()) { 
    # do something with $output_col1 and $output_col2 
} 

Meine Frage ist - ist es eine Möglichkeit, mit mysqli zu bekommen die einfache Array-Ausgabe, die im ersten Muster gezeigt wird, aber trotzdem sicher gebundene Eingabeparameter wie im zweiten Muster verwendet?

Ich kann nicht finden, dies zu tun (außer PDO stattdessen verwenden!).

+0

olafur - Ich habe Ihre Rechtschreibung Änderung rückgängig gemacht. "anerkannt" ist die Standard-englische Schreibweise. – Alnitak

Antwort

1

Es gibt mehrere Implementierungen einer Funktion diese Art der Sache in den Kommentaren auf dieser Seite der PHP-Handbuch zu tun: mysqli_stmt::fetch

0

Ich würde Nein sagen. Dachte, ich habe nicht mit mysqli oder vorbereiteten Aussagen eine Tonne gearbeitet, ich glaube, dass jeder Schritt in Ihrem zweiten Beispiel diskret und notwendig ist. Der einzige Trost, den ich Ihnen geben kann, ist, dass Ihr erstes Beispiel über einige SQL-Entschuldigungen blendete, die Sie in Ihrem zweiten Beispiel sicher und wirklich ignorieren können.

1

Alnitak,

AFAIK, man kann nicht ein ganzes Array mit dem gelieferten Ergebnis automatisch binden. Unglücklicherweise. Wenn Sie jedoch gesuchte Array Verhalten aus ihm (vermutlich so ist es einfacher, die Ergebnisse um passieren), könnten Sie dies versuchen:

<?php 
$dbh = new mysqli(...); 
$arr = array(); 
if($stmt = $dbh->prepare('SELECT id, email FROM email_list'); 
{ 
    $stmt->execute(); 
    $stmt->bind_result($arr['id'], $arr['email']); 

    while($stmt->fetch()) 
    DoSomething($arr); 
} 
?> 

Dies wird Ihnen das Verhalten, das Sie vor angefordert. Dynamische Bindung von Array-Feldern an assoziative Indezten im Array wird jedoch nicht vorgenommen, dh Sie müssen angeben, dass die ID an $ arr ['id'] usw. gebunden ist.

Wenn dynamische Bindung an die assoziativen Indezes In Ihrem Szenario ist wirklich erforderlich, Sie könnten immer eine einfache Klasse schreiben, die zuerst die Abfrage für die ausgewählten Felder analysieren würde, dann richten Sie die assoziativen Array-Indizes ein und führen dann die Abfrage aus.

+0

interessant, aber nicht (AIUI) erlauben $ results [] = $ arr, das ist ein übliches Muster, um ein zweidimensionales Array von Ergebnissen zu erhalten, da es die gleiche $ arr jedes Mal um die Schleife verwendet. Ich denke, du müsstest eine tiefe Kopie von $ arr machen, bevor du es an $ result [ – Alnitak

+0

anfügst. Einfach genug, um es zu testen, und du hast recht! Wenn Sie ein mehrdimensionales Array erstellen möchten, müssen Sie eine tiefe Kopie des gebundenen Arrays ausführen. In der while-Schleife können Sie etwas wie $ multi [] ['id'] = $ arr ['id']; (für jeden assoziierten Index in $ arr). Dies wird Ihnen geben, was Sie brauchen. –