No, no es un truco. Las dos declaraciones:
SELECT * FROM pages WHERE is_visible IN ($visibility)
SELECT * FROM pages WHERE is_visible = $visibility
son casi equivalentes. Observamos que las dos afirmaciones son equivalentes en el caso trivial, por ejemplo, cuando $visibility
es un escalar con un valor de 1.
Pero las declaraciones son no equivalente en los casos no triviales cuando $visibility
contiene algo más . Podemos observar una diferencia significativa en el comportamiento de las dos formas. Considere lo que sucede con cada forma cuando $visibility
es una cadena que contiene estos valores de ejemplo:
'1,2,3'
'1 OR 1=1'
'select v.val from vals v'
se observa una diferencia significativa en las sentencias SQL resultantes generadas a partir de las dos formas:
SELECT * FROM pages WHERE is_visible IN (1,2,3)
SELECT * FROM pages WHERE is_visible = 1,2,3
SELECT * FROM pages WHERE is_visible IN (1 OR 1=1)
SELECT * FROM pages WHERE is_visible = 1 OR 1=1
Una gran preocupación aquí, con cualquier forma de la declaración, es el potencial para la inyección SQL. Si $visibility
está destinado a ser un valor escalar, usar una variable de vinculación en la declaración es un enfoque más seguro, ya que evita que cualquiera deslice la sintaxis SQL 'adicional' en la instrucción. (Por supuesto, el uso de variables de vinculación no previene todas las inyecciones de SQL, pero es un enfoque adecuado para cerrar un agujero. Usar una variable de vinculación también mejorará la escalabilidad, al menos en algunas plataformas DBMS como Oracle.)
Considerar ¿Qué sucede cuando utilizamos una variable de vinculación (marcador de posición), que sabemos que NO se interpretará como sintaxis SQL. Observamos que las dos declaraciones SON de hecho equivalente:
SELECT * FROM pages WHERE is_visible IN (?)
SELECT * FROM pages WHERE is_visible = ?
para cualquier valor proporcionado para la variable de vinculación.
HTH
Gracias por las respuestas a todos. En este caso, $ visiblity es confiable y siempre 0 o 1.¡Así que me parece que este uso de "DONDE ... EN ..." es innecesario después de todo! – ledneb
Ahora no siempre significa que siempre lo hará. El desarrollador podría estar preparándose para ese momento "por las dudas". –
YAGNI. El caso de por si acaso nunca viene. –