2016-11-23 4 views
1

Ich muss eine SQL-Abfrage dynamisch tun. Mein Code ist einfach zu verstehen: Meine Funktion empfängt ein Array und eine Zeichenfolge, die die Abfrage enthält, und ich werde das Array durchlaufen, um die Schlüsselwerte im "Where" -Teil meiner Abfrage zu verwenden. Hier ist ein Teil des Codes:Reset String nach Schleife Iteration PHP

function graficoTeste ($array, $sql) { 
    $conn = connect(); 

    foreach ($array as $key => $value) { 
     $sql .= "'". $key. "'"; 
     $result = $conn->query($sql); 
     if(!$result) 
      echo $conn->error; 

     while($row = $result->fetch_assoc()) { 
      $array[$key] = $row["count_est"]; 
     } 
    } 

Das Problem ist: Ich brauche, dass meine Anfrage, die die $ key Wert jedes Mal, wenn die foreach Iterierten fügt hinzu, aber ich bin verketten die Zeichenfolge $ sql (die die eigentliche Abfrage enthält) mit $ key, was dazu führt:

SELECT COUNT(Estudante) AS count_est FROM `2016-1` WHERE municipio='Jatai' 
SELECT COUNT(Estudante) AS count_est FROM `2016-1` WHERE municipio='Jatai''Goiânia' 
SELECT COUNT(Estudante) AS count_est FROM `2016-1` WHERE municipio='Jatai''Goiânia''Goiás' 
SELECT COUNT(Estudante) AS count_est FROM `2016-1` WHERE municipio='Jatai''Goiânia''Goiás''Catalão' 

Und ich muss es sein:

SELECT COUNT(Estudante) AS count_est FROM '2016-1' WHERE municipio='Jatai' 
SELECT COUNT(Estudante) AS count_est FROM `2016-1` WHERE municipio='Goiânia' 
SELECT COUNT(Estudante) AS count_est FROM `2016-1` WHERE municipio='Goiás' 
SELECT COUNT(Estudante) AS count_est FROM `2016-1` WHERE municipio='Catalão' 

gibt es eine Möglichkeit, die $ sQL-Zeichenfolge auf den Standard (ohne die Taste $ auf die zurückkehren Ende) für jedes Mal, wenn die Schleife iteriert?

Vielen Dank (Sorry für mein schlechtes Englisch und für den portugiesischen Code, hahah).

+2

Was für ein wunderbares Beispiel, warum sollten Sie * immer * Verwendung Parameter statt munging Werte in Query-Strings zu illustrieren. –

+2

Aber wenn das zu schwer für dich ist, dann '$ result = $ conn-> query ($ sql. ''". $ Key. "'"); ' –

+0

Wo definierst du die Variable' $ sql'? Wenn Sie möchten, dass es bei jeder Schleifeniteration "zurückgesetzt" wird, dann klingt es so, als ob es * in der Schleife * definiert sein sollte. Oder zumindest nicht von der Schleife verändert. – David

Antwort

1

Um dieselbe SQL-Anweisung mit unterschiedlichen WHERE-Klauseln auszuführen, verwenden Sie einfach einen Platzhalter in der Anweisung, bereiten Sie die Anweisung vor und führen Sie sie in einer Schleife mit Ihren Schlüssel/Wert-Paaren aus. Die vorbereitete Anweisung wird bei jeder Ausführung erneut verwendet.

Ihre Aussage wird wie folgt aussehen:

SELECT COUNT(Estudante) AS count_est FROM '2016-1' WHERE municipio = ?

Ihr Code wird grob dieses Setup haben:

$sql = "SELECT COUNT(Estudante) AS count_est FROM '2016-1' WHERE municipio = ?"; 
foreach ($array as $key => $value) { 
    $stmt->execute(array($key)); 
    while ($row = $stmt->fetch()) { 
     print_r($row); 
    } 
} 

Als Abstellgleis Effekt eine vorbereitete Anweisung erneut zu verwenden beschleunigt den Betrieb als die Die Datenbank muss das SQL nicht parsen und einen Ausführungsplan für jeden einzelnen Aufruf erstellen, sondern nur einmal. Die eingesparte Ausführungszeit kann beträchtlich sein.

Siehe auch: Prepared statements and stored procedures at php.net

aber abhängig von den Daten in der Datenbank, kann es viel effizienter sein, eine Abfrage in

SELECT COUNT(Estudante) AS count_est, municipio FROM '2016-1' group by municipio

und sehen den Namen der Stadt zu benutzen, um Ihre PHP-Array, wenn Sie die Ergebnismenge aus der Datenbank abrufen - wahrscheinlich viel weniger Serverlast und Ausführungszeit im Vergleich zum Ausführen einzelner Abfragen in einer Schleife.

Edit 1: Tippfehler beseitigt, Edit 2: vorgeschlagen GROUP BY-Anweisung