Domanda

Ho una query SQL che assume la seguente forma:

UPDATE foo
SET flag=true
WHERE id=?

Ho anche un array PHP che ha un elenco di ID.Qual è il modo migliore per ottenere questo risultato se non con l'analisi, come segue, ...

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

...e utilizzando l'output in WHERE clausola?

È stato utile?

Soluzione

Ciò otterrebbe la stessa cosa, ma probabilmente non produrrà un grande aumento di velocità, ma sembra più carino.

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

Altri suggerimenti

Dovresti essere in grado di utilizzare la clausola IN (supponendo che il tuo database la supporti):

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

Utilizzare l'istruzione IN.Fornire un elenco di valori chiave separati da virgole.Puoi farlo facilmente utilizzando implode funzione.

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

In alternativa puoi usare la condizione:

UPDATE foo SET flag = true WHERE flag = false

o sottoquery:

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

Usa join/implode per creare un elenco delimitato da virgole con cui finire:

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

Non ho mai visto un modo per farlo oltre al tuo ciclo foreach.

Ma, se $list viene in qualche modo ottenuto dall'utente, dovresti limitarti a utilizzare l'istruzione preparata e aggiornare semplicemente una riga alla volta (supponendo che qualcuno non abbia un modo per aggiornare diverse righe con un'istruzione preparata).Altrimenti, sei completamente aperto all'iniezione SQL.

puoi intasare l'aggiornamento con le istruzioni case ma dovrai creare la query da solo.

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)  

Il dove può essere omesso ma ti evita un aggiornamento completo della tabella.

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

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

eseguiSQL(SQL)

Se conosci un limite al numero di articoli, utilizza la clausola "IN", come altri hanno suggerito:

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

Un avvertimento, tuttavia, è che, a seconda del database, potrebbe esserci un limite al numero di elementi nella clausola.Ad esempio, Oracle 7 o 8 (?) aveva un limite di 256 articoli (questo è stato aumentato in modo significativo nelle versioni successive)
Se esegui l'iterazione su un elenco, utilizza una transazione in modo da poter eseguire il rollback se uno degli aggiornamenti fallisce

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top