Frage

Ich habe eine SQL-Abfrage, die das folgende Format hat:

UPDATE foo
SET flag=true
WHERE id=?

Ich habe auch ein PHP-Array mit einer Liste von IDs.Was ist der beste Weg, dies zu erreichen, außer mit der folgenden Analyse ...

foreach($list as $item){  
    $querycondition = $querycondition . " OR " . $item;  
}

...und Verwenden der Ausgabe in der WHERE Klausel?

War es hilfreich?

Lösung

Dies würde das Gleiche erreichen, aber wahrscheinlich keine große Geschwindigkeitssteigerung bringen, sieht aber besser aus.

mysql_query("UPDATE foo SET flag=true WHERE id IN (".implode(', ',$list).")");

Andere Tipps

Sie sollten in der Lage sein, die IN-Klausel zu verwenden (vorausgesetzt, Ihre Datenbank unterstützt sie):

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)

Verwenden Sie die IN-Anweisung.Geben Sie eine durch Kommas getrennte Liste der Schlüsselwerte an.Sie können dies ganz einfach mit tun implode Funktion.

UPDATE foo SET flag = true WHERE id IN (1, 2, 3, 4, 5, ...)

Alternativ können Sie die Bedingung verwenden:

UPDATE foo SET flag = true WHERE flag = false

oder Unterabfrage:

UPDATE foo SET flag = true WHERE id IN (SELECT id FROM foo WHERE .....)

Verwenden Sie „join/implode“, um eine durch Kommas getrennte Liste zu erstellen, die am Ende Folgendes ergibt:

UPDATE foo SET flag=true WHERE id IN (1,2,3,4)

Ich habe noch nie eine andere Möglichkeit gesehen, dies zu tun, als Ihre foreach-Schleife.

Wenn $list jedoch auf irgendeine Weise vom Benutzer abgerufen wird, sollten Sie bei der Verwendung der vorbereiteten Anweisung bleiben und jeweils nur eine Zeile aktualisieren (vorausgesetzt, jemand hat keine Möglichkeit, mehrere Zeilen mit einer vorbereiteten Anweisung zu aktualisieren).Andernfalls sind Sie der SQL-Injektion weitestgehend ausgesetzt.

Sie können die Aktualisierung mit case-Anweisungen blockieren, müssen die Abfrage jedoch selbst erstellen.

UPDATE foo
SET flag=CASE ID WHEN 5 THEN true ELSE flag END  
    ,flag=CASE ID WHEN 6 THEN false ELSE flag END 
WHERE id in (5,6)  

Das Where kann weggelassen werden, erspart Ihnen aber eine vollständige Tabellenaktualisierung.

VB.NET-Code:dim delimitedIdList als string = arrayToString(listOfIds)

dim SQL as string = " UPDATE foo SET flag=true WHERE id in (" + delimitedIdList + ")"

runSql(SQL)

Wenn Sie eine Grenze für die Anzahl der Elemente kennen, verwenden Sie die „IN“-Klausel, wie andere vorgeschlagen haben:

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)

Eine Warnung ist jedoch, dass die Anzahl der Elemente in der Klausel je nach Datenbank begrenzt sein kann.Beispielsweise hatte Oracle 7 oder 8 (?) früher ein Limit von 256 Elementen (dies wurde in späteren Versionen erheblich erhöht).
Wenn Sie eine Liste durchlaufen, verwenden Sie eine Transaktion, damit Sie ein Rollback durchführen können, wenn eine der Aktualisierungen fehlschlägt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top