Pregunta

Tengo una consulta SQL que toma la siguiente forma:

UPDATE foo
SET flag=true
WHERE id=?

También tengo una matriz PHP que tiene una lista de ID.¿Cuál es la mejor manera de lograr esto además del análisis, de la siguiente manera?...

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

...y usando la salida en el WHERE ¿cláusula?

¿Fue útil?

Solución

Esto lograría lo mismo, pero probablemente no producirá un gran aumento de velocidad, pero se ve mejor.

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

Otros consejos

Debería poder utilizar la cláusula IN (suponiendo que su base de datos la admita):

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

Utilice la declaración IN.Proporcione una lista de valores clave separados por comas.Puedes hacerlo fácilmente usando implode función.

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

Alternativamente puedes usar la condición:

UPDATE foo SET flag = true WHERE flag = false

o subconsulta:

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

Utilice unirse/implode para hacer una lista delimitada por comas para terminar con:

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

Nunca he visto otra forma de hacer eso que no sea el bucle foreach.

Pero, si $list se obtiene de alguna manera del usuario, debe seguir usando la declaración preparada y simplemente actualizar una fila a la vez (suponiendo que alguien no tenga una forma de actualizar varias filas con una declaración preparada).De lo contrario, está completamente expuesto a la inyección SQL.

puede bloquear su actualización con declaraciones de casos, pero tendrá que crear la consulta usted mismo.

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)  

El dónde se puede omitir pero le evita una actualización completa de la tabla.

Código VB.NET:tenue listaDelimitedIdList como cadena = arrayToString(listOfIds)

dim SQL como cadena = "ACTUALIZAR foo SET flag=true DONDE id en (" + delimitedIdList + ")"

ejecutarSql(SQL)

Si conoce un límite en el número de elementos, utilice la cláusula "IN", como han sugerido otros:

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

Sin embargo, una advertencia es que dependiendo de su base de datos puede haber un límite en la cantidad de elementos en la cláusula.Por ejemplo, Oracle 7 u 8 (?) solía tener un límite de 256 elementos (esto aumentó significativamente en versiones posteriores)
Si itera sobre una lista, utilice una transacción para poder revertirla si falla una de las actualizaciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top