cfqueryparam

説明

クエリーパラメータのデータ型を検証します。バインド変数をサポートする DBMS では、SQL ステートメントでバインド変数を使用できるようにします。バインド変数を使用することで、cfquery ステートメントを何度も実行するときのパフォーマンスが向上します。

このタグは、クエリー SQL ステートメント内に埋め込まれた cfquery タグ内にネストされます。オプションのパラメータを指定すると、このタグはデータ検証を実行します。

cfquery タグ内で cfqueryparam タグを使用して、権限のないユーザーがデータベースにアクセスできないようにしてください。詳細については、セキュリティ情報 ASB99-04「Multiple SQL Statements in Dynamic Queries」(www.adobe.com/go/sn_asb99-04_jp) および『ColdFusion アプリケーションの開発』のAccessing and Retrieving Dataを参照してください。

シンタックス

<cfquery  
    name = "query name" 
    dataSource = "data source name" 
    ...other attributes... 
    SQL STATEMENT column_name =  
    <cfqueryparam value = "parameter value" 
        CFSQLType = "parameter type" 
        list = "yes|no" 
        maxLength = "maximum parameter length" 
        null = "yes|no" 
        scale = "number of decimal places" 
        separator = "separator character"> 
    AND/OR ...additional criteria of the WHERE clause...> 
</cfquery>
注意: このタグの属性は attributeCollection 属性で指定でき、その値は構造体になります。attributeCollection 属性で構造体の名前を指定し、タグの属性名を構造体のキーとして使用します。

関連項目

cfinsertcfprocparamcfprocresultcfquerycfstoredproccftransactioncfupdate、『ColdFusion アプリケーションの開発』のEnhancing security with cfqueryparam

属性

属性

必須 / オプション

デフォルト

説明

value

必須

ColdFusion によって where 節の比較演算子の右側に渡される値です。

CFSQLType が日付または時刻のオプションの場合は、日付の値に必ず使用中の DBMS 固有の日付形式を使用します。CreateODBCDateTime または DateFormat および TimeFormat 関数を使用して、日付の値の形式を設定します。

CFSQLType

オプション

CF_SQL_CHAR

任意の型のパラメータがバインドされる SQL 型です。

  • CF_SQL_BIGINT

  • CF_SQL_BIT

  • CF_SQL_CHAR

  • CF_SQL_BLOB

  • CF_SQL_CLOB

  • CF_SQL_DATE

  • CF_SQL_DECIMAL

  • CF_SQL_DOUBLE

  • CF_SQL_FLOAT

  • CF_SQL_IDSTAMP

  • CF_SQL_INTEGER

  • CF_SQL_LONGVARCHAR

  • CF_SQL_MONEY

  • CF_SQL_MONEY4

  • CF_SQL_NUMERIC

  • CF_SQL_REAL

  • CF_SQL_REFCURSOR

  • CF_SQL_SMALLINT

  • CF_SQL_TIME

  • CF_SQL_TIMESTAMP

  • CF_SQL_TINYINT

  • CF_SQL_VARCHAR

list

オプション

no

  • yes: value 属性値は区切りリストです。

  • no

maxLength

オプション

value 属性値の文字列の長さ

パラメータの最大の長さです。文字列が DBMS に送信される前に ColdFusion で長さチェックを実行するようにする必要があります。その結果、悪意のある文字列の送信を回避できます。

null

オプション

no

パラメータを null 値として渡すかどうかを指定します。

  • yes: value 属性を無視します。

  • no

scale

オプション

0

パラメータの小数点以下の桁数です。CF_SQL_NUMERIC および CF_SQL_DECIMAL に適用されます。

separator

value 属性でリストを指定する場合は必須

, (カンマ)

value 属性内で、リストの値を区切る文字です。

使用方法

cfqueryparam タグは、ColdFusion 変数を使用する任意の SQL ステートメント (SELECT、INSERT、UPDATE、DELETE など) で使用します。

文字列データの検証の最大値を決定するために、maxlength 属性を指定します。

このタグでは次のことが実行されます。

  • SQL バインドパラメータを使用可能にします。これによりパフォーマンスが向上します。

  • 指定された SQL 型と変数データが一致していることを確認します。

  • SQL ステートメントからの長いテキストフィールドの更新を可能にします。

  • 文字列変数を一重引用符でエスケープします。

バインド変数によるパフォーマンスの向上を活かすには、すべての ColdFusion 変数に cfqueryparam を使用します。また、DBMS がバインド変数をサポートしている必要があります。DBMS がバインドパラメータをサポートしていない場合は、ColdFusion で検証が行われ、検証済みのパラメータ値が文字列に置き換えられます。検証に失敗すると、エラーメッセージが返されます。

検証ルールは次のとおりです。

  • CF_SQL_SMALLINT、CF_SQL_INTEGER、CF_SQL_REAL、CF_SQL_FLOAT、CF_SQL_DOUBLE、CF_SQL_TINYINT、CF_SQL_MONEY、CF_SQL_MONEY4、CF_SQL_DECIMAL、CF_SQL_NUMERIC、および CF_SQL_BIGINT については、データ値を数値に変換することができます。

  • CF_SQL_DATE、CF_SQL_TIME、CF_SQL_TIMESTAMP については、データ値をターゲットデータソースでサポートされる日付に変換できます。

  • その他の型では、maxLength 属性を指定した場合、データ値は指定されている最大長を超えることはできません。

ColdFusion のデバッグ出力では、バインド変数が疑問符 (?) で表示され、クエリーの下に値が使用順に表示されます。

注意: SequelLink ODBC Socket または SequelLink Access ドライバを使用して Microsoft Access テーブルに空の文字列を挿入するには、CFSQLType 属性で CF_SQL_LONGVARCHAR を指定する必要があります。

次の表は、JDBC SQL 型を使用する ColdFusion SQL データ型のマッピング、および各データベース管理システムのデータ型を示しています。

ColdFusion

JDBC

DB2

Informix

Oracle

MSSQL

CF_SQL_ARRAY

ARRAY

 

 

 

CF_SQL_BIGINT

BIGINT

Bigint

int8、serial8

 

bigint

CF_SQL_BINARY

BINARY

Char for Bit Data

 

 

binary

timestamp

CF_SQL_BIT

BIT

boolean

 

bit

CF_SQL_BLOB

BLOB

Blob

blob

blob、bfile

longvarbinary

CF_SQL_CHAR

CHAR

Char

char、nchar

char、nchar

char

CF_SQL_CLOB

CLOB

Clob

clob

clob、nclob

 

CF_SQL_DATE

DATE

Date

date、datetime、year to day

 

 date

CF_SQL_DECIMAL

DECIMAL

Decimal

decimal、money

number

decimal

CF_SQL_DISTINCT

DISTINCT

 

 

 

CF_SQL_DOUBLE

DOUBLE

Double

 

 

double 

CF_SQL_FLOAT

FLOAT

Float

float

number

real

CF_SQL_IDSTAMP

CHAR

Char

char、nchar

char、nchar

char

CF_SQL_INTEGER

INTEGER

Integer

integer、serial

 

integer

CF_SQL_LONGVARBINARY

LONGVARBINARY

Long Varchar for Bit Data

byte

long raw

longvarbinary

CF_SQL_LONGVARCHAR

LONGVARCHAR

Long Varchar

text

long

longvarchar

CF_SQL_MONEY

DOUBLE

Double

 

 

 double

CF_SQL_MONEY4

DOUBLE

Double

 

 

double 

CF_SQL_NULL

NULL

 

 

 

CF_SQL_NUMERIC

NUMERIC

Numeric

 

 

numeric

CF_SQL_OTHER

OTHER

 

 

 

CF_SQL_REAL

REAL

Real

smallfloat

 

real

CF_SQL_REFCURSOR

REF

 

 

 

CF_SQL_SMALLINT

SMALLINT

Smallint

smallint

 

smallint

CF_SQL_STRUCT

STRUCT

 

 

 

CF_SQL_TIME

TIME

Time

datetime hour to second

 

time 

CF_SQL_TIMESTAMP

TIMESTAMP

Timestamp

datetime year to fraction(5)、datetime year to second

date

timestamp

CF_SQL_TINYINT

TINYINT

 

 

tinyint

CF_SQL_VARBINARY

VARBINARY

Rowid

 

raw

varbinary

CF_SQL_VARCHAR

VARCHAR

Varchar

varchar、nvarchar、lvarchar

varchar2、nvarchar2

varchar

<!--- This example shows cfqueryparam with VALID input in Course_ID. ---> 
<h3>cfqueryparam Example</h3> 
<cfset Course_ID = 12> 
<cfquery name = "getFirst" dataSource = "cfdocexamples"> 
    SELECT *  
    FROM courses 
    WHERE Course_ID = <cfqueryPARAM value = "#Course_ID#" 
    CFSQLType = 'CF_SQL_INTEGER'>  
</cfquery> 
<cfoutput query = "getFirst"> 
    <p>Course Number: #Course_ID#<br> Description: #descript#</p> 
</cfoutput> 
 
<!--- This example shows the use of CFQUERYPARAM when INVALID string data is  
    in Course_ID. ---->  
<p>This example throws an error because the value passed in the CFQUERYPARAM tag exceeds the 
    MAXLENGTH attribute</p>  
 
<cfset LastName="Peterson; DELETE employees WHERE LastName='Peterson'"> 
<!------- Note that for string input you must specify the MAXLENGTH attribute  
    for validation. -------------------------------------------------->  
<cfquery  
    name="getFirst" datasource="cfdocexamples">  
    SELECT *  
    FROM employees  
    WHERE LastName=<cfqueryparam  
                value="#LastName#"  
                cfsqltype="CF_SQL_VARCHAR"  
                maxlength="17">  
</cfquery>  
<cfoutput  
    query="getFirst">         <p> 
        Course Number: #FirstName# #LastName#  
        Description: #Department# </p>  
</cfoutput>