web-dev-qa-db-fra.com

Comment? Paramètres et instruction SQL LIKE

J'écris une fonction de recherche et ai conçu cette requête en utilisant des paramètres pour empêcher, ou du moins limiter, les attaques par injection SQL. Cependant, lorsque je le lance dans mon programme, il ne renvoie rien:

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

Est-ce que les paramètres peuvent être utilisés comme ça? ou sont-ils uniquement valables dans un cas tel que:

SELECT * FROM compliance_corner WHERE body LIKE '%<string>%' (où <string> est l'objet de recherche).

EDIT: Je construis cette fonction avec VB.NET, cela a-t-il un impact sur la syntaxe à laquelle vous avez contribué?

En outre, j'ai exécuté cette instruction dans SQL Server: SELECT * FROM compliance_corner WHERE (body LIKE '%max%') OR (title LIKE% max% ') `et qui renvoie des résultats.

75
Anders

Votre code visuel de base ressemblerait à quelque chose comme ceci:

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

cmd.Parameters.Add("@query", searchString)
76
John

Eh bien, j'irais avec:

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

 cmd.Parameters.Add("@query", "%" +searchString +"%")
107
James Curran

tu dois faire:

LIKE '%' + @param + '%'

24
Andrew Bullock

Parfois, le symbole utilisé comme espace réservé % n’est pas le même si vous exécutez une requête à partir de VB que lorsque vous l’exécutez à partir de MS SQL/Access. Essayez de changer votre symbole d'espace réservé de % à *. Cela pourrait fonctionner.
Cependant, si vous déboguez et que vous voulez copier votre chaîne SQL directement dans MS SQL ou Access pour la tester, vous devrez peut-être redéfinir le symbole sur % dans MS SQL ou Access afin de renvoyer des valeurs.

J'espère que cela t'aides

1
Lalie

Vous devrez peut-être concaténer les signes% avec votre paramètre, par exemple:

LIKE '%' || @query || '%'

Edit: En fait, cela peut ne pas avoir de sens du tout. Je pense avoir mal compris votre problème.

1
Will Wagner

essayez aussi de cette façon

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()

Utilisé Concat au lieu de +

0
Ramgy Borja