2011-05-06 19 views
3

SQLクエリに条件を追加する必要があります。私はこの解決策を考案しましたが、うまくいかず、理由がわかりません。 You have an error in your SQL syntax; check ... near ''AND platforms.id = 1' ''' at line 6CFScriptの動的SQL

任意のアイデアどのようにこの制限を回避するために、まだSQLインジェクションからの安全性を確保:

local.platformId = arguments.platformId ? "AND platforms.id = #arguments.platformId#" : ""; 

local.pages = new Query(dataSource=variables.wheels.class.connection.datasource); 
local.pages.setSQL 
(" 
    SELECT   COUNT(games.id) AS totalRecords 
    FROM   games 
    INNER JOIN  platforms ON games.platformId = platforms.id 
    WHERE   0=0 
:platform 
"); 

local.pages.addParam(name="platform", cfsqltype="CF_SQL_VARCHAR", value=local.platformId);  
local.pages = local.pages.execute().getResult(); 

は私がの誤差が取得しますか?

答えて

2

をあなたのコード?

local.pages = new Query(dataSource=variables.wheels.class.connection.datasource); 
local.baseSQL = " 
    SELECT   COUNT(games.id) AS totalRecords 
    FROM   games 
    INNER JOIN  platforms ON games.platformId = platforms.id 
    WHERE   platforms.id = :platform 
"; 

if(StructKeyExists(arguments, "platformId") 
{ 
    local.baseSQL &= "AND platforms.id = :platformId"; 
    local.pages.setSQL(baseSQL); 
    local.pages.addParam(
    name="platformId", 
    cfsqltype="CF_SQL_VARCHAR", 
    value=arguments.platformId); 
} 
else 
    local.pages.setSQL(baseSQL) 
local.pages = local.pages.execute().getResult(); 
3

addParamは、CFMLでcfqueryparamを使用するのと同じです。したがって、value属性がSQLのビットではなく '1'や 'foobar'のようになることを期待しています。代わりに、platformIDの値をarguments.platformidまたは空の文字列に設定するだけです。次に、WHERE句のplatform:を直接参照してください。

local.platformId = arguments.platformId ? arguments.platformId : ""; 

local.pages = new Query(dataSource=variables.wheels.class.connection.datasource); 
local.pages.setSQL 
(" 
    SELECT   COUNT(games.id) AS totalRecords 
    FROM   games 
    INNER JOIN  platforms ON games.platformId = platforms.id 
    WHERE   platforms.id = :platform 
"); 

local.pages.addParam(name="platform", cfsqltype="CF_SQL_VARCHAR", value=local.platformId);  
local.pages = local.pages.execute().getResult(); 

ここにこの記事では、いくつかの良い情報を持っている:http://www.bennadel.com/blog/1678-Learning-ColdFusion-9-Using-CFQuery-And-Other-Service-Tags-In-CFScript.htm

+0

私がいること、および指定された、何も戻って来ないだろう何のプラットフォームはありません行う場合...「0 = 0」のためので、必要 – Mohamad

+0

十分フェア、その場合には、私はアダムの提案で行くと思います – duncan

6

私はこのためにsavecontentを使って好き:

SQLを設定し、neccessary場合における条件文でのparamを追加しないのはなぜ
savecontent variable="local.sql"{ 
    WriteOutput(" 
     SELECT   COUNT(games.id) AS totalRecords 
     FROM   games 
     INNER JOIN  platforms ON games.platformId = platforms.id 
     WHERE   0=0 
    "); 
    (arguments.platformId) 
     ? WriteOutput("AND platforms.id = :platform") 
     : WriteOutput(""); 
} 

local.pages = new Query(dataSource=variables.wheels.class.connection.datasource); 
local.pages.setSQL(local.sql); 
if (arguments.platformId){ 
    local.pages.addParam(name="platform", cfsqltype="CF_SQL_VARCHAR", value=arguments.platformId); 
} 
local.pages = local.pages.execute().getResult(); 
+0

どれでも三項条件のまわりのかっこを必要とする。 '(arguments.platformId)'? – user3071284