2008-10-30 20 views
69

Estoy escribiendo una función de búsqueda, y he pensado en esta consulta utilizando parámetros para evitar, o al menos limitar, ataques de inyección SQL. Sin embargo, cuando lo ejecuto a través de mi programa no devuelve nada:¿Cómo? Parámetros y declaración LIKE SQL

SELECT * FROM compliance_corner WHERE (body LIKE '%@query%') OR (title LIKE '%@query%')

Puede parámetros usarse como este? o solo son válidos en una instancia como:

SELECT * FROM compliance_corner WHERE body LIKE '%<string>%' (donde <string> es el objeto de búsqueda).

EDITAR: Estoy construyendo esta función con VB.NET, ¿tiene eso un impacto en la sintaxis que ustedes han contribuido?

Además, ejecuté esta declaración en SQL Server: SELECT * FROM compliance_corner WHERE (body LIKE '%max%') OR (title LIKE% max% ') `y eso devuelve resultados.

Respuesta

71

Su código de Visual Basic sería algo como esto:

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE '%' + @query + '%') OR (title LIKE '%' + @query + '%')") 

cmd.Parameters.Add("@query", searchString) 
+1

Como Adam ha señalado en su respuesta, esto no protege contra la inyección de SQL. La consulta debe estar parametrizada. – DOK

+5

¿Podría proporcionar un ejemplo donde esto no impida la inyección de SQL? De mi prueba funciona bien – John

+25

No está abierto a la inyección de 'SQL', solo inyección' LIKE'. Esto significa que el usuario puede ingresar caracteres especiales como '%' '^' y '_' que' LIKE' interpretará especialmente. Esto significa que el usuario puede no obtener lo que espera para ciertas búsquedas. Como ejemplo, una búsqueda de '' menos de 1% de grasa '' puede devolver el resultado '' menos del 1% de los médicos recomiendan esto: ¡está lleno de grasa! ''. –

1

Puede que tenga que concatenar los signos% con su parámetro, por ejemplo .:

COMO '%' || @query || '%'

Edit: En realidad, eso puede no tener ningún sentido en absoluto. Creo que puedo haber entendido mal tu problema.

23

que tiene que hacer:

LIKE '%' + @param + '%'

+0

+ 1 corto y simple –

+0

excelente solución - le daría más de 1 ¡si es posible! Gracias –

100

Bueno, me gustaría ir con:

Dim cmd as New SqlCommand(
"SELECT * FROM compliance_corner"_ 
    + " WHERE (body LIKE @query)"_ 
    + " OR (title LIKE @query)") 

cmd.Parameters.Add("@query", "%" +searchString +"%") 
+0

Esto es correcto, ¡la respuesta aceptada provista por John tiene una sintaxis incorrecta! – Adam

+3

No estoy seguro de cómo su sintaxis es incorrecta, su solución funcionó bien. Tengo una función que construye y devuelve una declaración de SQL para su uso en una tabla de datos o lo que sea. – Anders

+1

Nota adicional: Sintaxis para C# utilizando MySQLDataAdapter = da = new MySQLDataAdapter ("SELECCIONAR * FROM tableA WHERE fieldA = @fieldA"); da.SelectCommand.Parameters.AddWithValue ("@ fieldA", "%" + someValue + "%"); –

1

A veces, el símbolo utilizado como marcador de posición % no es el mismo si ejecuta una consulta de VB como cuando la ejecuta desde MS SQL/Access. Intente cambiar el símbolo de marcador de posición de % a *. Aquello podría funcionar.
Sin embargo, si depura y desea copiar su cadena de SQL directamente en MS SQL o Access para probarla, es posible que tenga que volver a cambiar el símbolo a % en MS SQL o Access para devolver realmente los valores.

Esperanza esto ayuda

0

intento también de esta manera

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE CONCAT('%',@query,'%') OR title LIKE CONCAT('%',@query,'%'))") 
cmd.Parameters.Add("@query", searchString) 
cmd.ExecuteNonQuery() 

usados ​​de concatenación en lugar de +

Cuestiones relacionadas