2016-04-14 13 views
0

Ich habe ein Suchformular für meine Anwendung erstellt. Ich möchte jetzt in der Datenbank suchen, indem Sie Eingaben von entweder 1 oder mehreren Eingaben gleichzeitig von ProductID, ProductName, ProductCostFrom, ProductCostTO nehmen. Ich verwende folgende Abfrage zu suchen. Es funktioniert ruhig gut, wenn ich einen Kostenbereich in den Eingaben gebe, aber gibt Syntaxfehler, wenn ich nur nach "ProID" oder "ProName" oder beidem suche.SQL Suchabfrage für mein Suchformular in Coldfusion

<cfquery name="myquery" datasource="cfdb2"> 
    Select * 
    from ProEntry 
    where (
       Procost BETWEEN #Form.Procost# AND #Form.ProCostTo# 
      ) 
    OR  (
      Proid='#form.Proid#' OR 
      Proname='#form.Proname#' 
      ) 
</cfquery> 
+0

zu dieser Zeit, was wird der Wert von (# Form.Procost #) sein? –

Antwort

5

Denken Sie daran, was Abfrage an die Datenbank senden müssen gültig SQL sein. Wenn die Kostenwerte fehlen (oder nicht numerische Werte enthalten), wird das generierte SQL falsch formatiert. Wenn beide Felder leer sind die where-Klausel wird wie diese (falsche) aussehen:

where (Procost BETWEEN AND) 

.. statt dessen:

where (Procost BETWEEN 50 AND 100) 

Wenn die Suchwerte optional sind, müssen Sie die SQL-Anweisung bauen bedingt. Ein gemeinsamer Ansatz ist mit einem statischen Zustand zu starten, die nie wahr ist, so dass die Abfrage nur Datensätze zurück, wenn die anderen Filter abgestimmt sind:

WHERE 1 = 0 

dann die Filter hängen Sie nur, wenn die erforderlichen Formularfelder bestückt sind. Obwohl immer cfqueryparam verwenden, um gegen SQL-Injektion zu schützen.

<cfif isNumeric(form.Procost) AND isNumeric(form.ProCostTo)> 
    OR (
     Procost BETWEEN 
      <cfqueryparam value="#form.Procost#" cfsqltype="{replace_with_your_type}"> 
     AND 
      <cfqueryparam value="#form.ProCostTo#" cfsqltype="{replace_with_your_type}"> 
    ) 
</cfif> 

<cfif len(trim(form.proID))> 
    OR Proid= <cfqueryparam value="#form.proID#" cfsqltype="{replace_with_your_type}"> 
</cfif> 

... etcetera ...