unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length)
mysql
は有効な開いている接続でなければなりません。エスケープはサーバーで使用されている文字セットによって異なるため、これが必要です。
説明
この関数は、SQL ステートメントで使用できる正当な SQL 文字列を作成するために使われます。セクション9.1.1「文字列リテラル」を参照してください。
from
内の文字列は、接続の現在の文字セットを考慮して、エスケープされた SQL 文字列にエンコードされます。結果は to
に置かれ、終端の NULL バイトが付加されます。エンコードされる文字は 「\
」、「'
」、「"
」、NUL
(ASCII 0)、「\n
」、「\r
」、および Control+Z です。厳密に言うと、MySQL では、クエリー内の文字列に引用符を付けるために使われるバックスラッシュと引用文字がエスケープされることのみを必要とします。mysql_real_escape_string()
は、ほかの文字をログファイル内で読みやすくするために引用符で囲みます。比較については、セクション9.1.1「文字列リテラル」およびセクション12.5「文字列関数」のリテラル文字列と QUOTE()
SQL 関数の引用符使用のルールを参照してください。
from
によって指示される文字列は、length
バイトの長さである必要があります。to
バッファーを少なくとも length*2+1
バイト長になるように割り当てる必要があります。(最悪の場合、各文字を 2 バイトを使用してエンコードする必要がある可能性があるため、終端の NULL バイト分の空きが必要です。)mysql_real_escape_string()
が戻ったときの to
の内容は NULL 終端文字列です。戻り値は、終端の NULL 文字を含まない、エンコードされた文字列の長さです。
接続の文字セットを変更する必要がある場合、SET NAMES
(または SET CHARACTER SET
) ステートメントを実行するのではなく、mysql_set_character_set()
関数を使用します。mysql_set_character_set()
は、SET NAMES
と同じように機能しますが、SET NAMES
では影響を与えない mysql_real_escape_string()
で使用される文字セットにも影響を与えます。
例
char query[1000],*end;
end = strmov(query,"INSERT INTO test_table values(");
*end++ = '\'';
end += mysql_real_escape_string(&mysql, end,"What is this",12);
*end++ = '\'';
*end++ = ',';
*end++ = '\'';
end += mysql_real_escape_string(&mysql, end,"binary data: \0\r\n",16);
*end++ = '\'';
*end++ = ')';
if (mysql_real_query(&mysql,query,(unsigned int) (end - query)))
{
fprintf(stderr, "Failed to insert row, Error: %s\n",
mysql_error(&mysql));
}
例で使用している strmov()
関数は、libmysqlclient
ライブラリに含まれ、strcpy()
のように機能しますが、最初のパラメータの終端の NULL へのポインタを返します。
戻り値
to
に置かれた、終端の NULL 文字を含まない値の長さ。
エラー
なし。