Question

J'ai une requête SQL qui prend la forme suivante :

UPDATE foo
SET flag=true
WHERE id=?

J'ai aussi un tableau PHP qui contient une liste d'identifiants.Quelle est la meilleure façon d'y parvenir autrement qu'avec l'analyse, comme suit,...

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

...et en utilisant la sortie dans le WHERE clause?

Était-ce utile?

La solution

Cela permettrait d'obtenir le même résultat, mais n'entraînerait probablement pas une grande augmentation de vitesse, mais semblerait plus agréable.

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

Autres conseils

Vous devriez pouvoir utiliser la clause IN (en supposant que votre base de données la prend en charge) :

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

Utilisez l'instruction IN.Fournissez une liste de valeurs clés séparées par des virgules.Vous pouvez facilement le faire en utilisant implode fonction.

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

Alternativement, vous pouvez utiliser la condition :

UPDATE foo SET flag = true WHERE flag = false

ou sous-requête :

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

Utilisez join/implode pour créer une liste délimitée par des virgules et obtenir :

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

Je n'ai jamais vu d'autre moyen de faire cela que votre boucle foreach.

Mais, si $list est obtenu de quelque manière que ce soit de l'utilisateur, vous devez vous en tenir à l'utilisation de l'instruction préparée et simplement mettre à jour une ligne à la fois (en supposant que quelqu'un n'ait aucun moyen de mettre à jour plusieurs lignes avec une instruction préparée).Sinon, vous êtes grand ouvert à l’injection SQL.

vous pouvez bloquer votre mise à jour avec des instructions case, mais vous devrez créer la requête vous-même.

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)  

Le Where peut être omis mais vous évite une mise à jour complète de la table.

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

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

exécuterSql(SQL)

Si vous connaissez une limite sur le nombre d'éléments, utilisez la clause "IN", comme d'autres l'ont suggéré :

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

Un avertissement cependant est qu'en fonction de votre base de données, le nombre d'éléments dans la clause peut être limité.Par exemple, Oracle 7 ou 8 (?) avait une limite de 256 éléments (cela a été considérablement augmenté dans les versions ultérieures)
Si vous parcourez une liste, utilisez une transaction afin de pouvoir revenir en arrière si l'une des mises à jour échoue

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top