2017-08-19 2 views
1

J'ai cette balise d'insertion:coldfusion cfinsert échoue, comment soumettre une requête avec les champs facultatifs

<cfquery name="aoi_results" datasource="buyerhero" > 
    INSERT INTO polygons(tract, user, name, type, center, radius, north, south, east, west, verticies) 
    VALUES('#url.tract#', '#url.user#', '#url.name#', '#url.type#','#url.center#', '#url.radius#', '#url.north#', '#url.south#', '#url.east#', '#url.west#', '#url.verticies#'); 
</cfquery> 

pour cette requête, tous les champs sont utilisés. certains enregistrements ont center and radius, d'autres ont north, south, east, and west et d'autres ont verticies. Tout champ non utilisé est nul.

Comment écrire l'instruction afin que chaque champ après le type soit facultatif?

Merci

+0

Quel RDBMS utilisez-vous? –

+0

SQL Server 2016. Merci. – arcee123

Répondre

5

Vous pouvez utiliser cfparam par défaut défini les options de URL pour blanc s'ils ne sont pas passés. Ensuite, dans votre requête, vous pouvez utiliser l'attribut null de cfqueryparam. L'attribut null est un booléen, s'il est vrai, il passera en null.

<cfparam name="URL.tract" default="" /> 
<cfparam name="URL.user" default="" /> 
<cfparam name="URL.name" default="" /> 
<cfparam name="URL.type" default="" /> 
<cfparam name="URL.center" default="" /> 
<cfparam name="URL.radius" default="" /> 
<cfparam name="URL.north" default="" /> 
<cfparam name="URL.south" default="" /> 
<cfparam name="URL.east" default="" /> 
<cfparam name="URL.west" default="" /> 
<cfparam name="URL.verticies" default="" /> 

<cfquery name="aoi_results" datasource="buyerhero" > 
    INSERT INTO polygons(tract, user, name, type, center, radius, north, south, east, west, verticies) 
    VALUES(
     <cfqueryparam value="#URL.tract#" cfsqltype="cf_sql_integer" /> 
     ,<cfqueryparam value="#URL.user#" cfsqltype="cf_sql_varchar" /> 
     ,<cfqueryparam value="#URL.name#" cfsqltype="cf_sql_varchar" /> 
     ,<cfqueryparam value="#URL.type#" cfsqltype="cf_sql_integer" /> 
     ,<cfqueryparam value="#URL.center#" cfsqltype="cf_sql_float" null="#len(URL.center) EQ 0#" /> 
     ,<cfqueryparam value="#URL.radius#" cfsqltype="cf_sql_float" null="#len(URL.radius) EQ 0#" /> 
     ,<cfqueryparam value="#URL.north#" cfsqltype="cf_sql_float" null="#len(URL.north) EQ 0#" /> 
     ,<cfqueryparam value="#URL.south#" cfsqltype="cf_sql_float" null="#len(URL.south) EQ 0#" /> 
     ,<cfqueryparam value="#URL.east#" cfsqltype="cf_sql_float" null="#len(URL.east) EQ 0#" /> 
     ,<cfqueryparam value="#URL.west#" cfsqltype="cf_sql_float" null="#len(URL.west) EQ 0#" /> 
     ,<cfqueryparam value="#URL.verticies#" cfsqltype="cf_sql_float" null="#len(URL.verticies) EQ 0#" /> 
    ); 
</cfquery> 

Je devinai sur le cfsqltype, vous devrez vérifier ces soi-même. L'attribut null définira la colonne null si le len() est 0, et tous les paramètres d'URL sont par défaut à blanc en utilisant cfparam

Plus important encore, vous devriez toujours utiliser cfqueryparam. Passer des variables d'URL dans une requête demande simplement d'être piraté avec une attaque par injection SQL. Read the query param section on learncfinaweek pour plus d'informations à ce sujet.

+2

c'était une réponse biblique. Merci beaucoup. Je vais l'utiliser à partir de maintenant. Merci encore. – arcee123