unsigned long mysql_real_escape_string(MYSQL *mysql,
char *to, const char *from, unsigned long length)
mysql
は有効なオープン接続でなければならないことにご注目ください。回避はサーバによって使用中の文字セットに依存しているのでこれが必要です。
説明
この機能は、SQLステートメントの中に使うことができる法定SQLストリングを作るために使われます。項8.1.1. 「文字列」を参照してください。
from
中のストリングは、現在の接続文字セットを考慮して、エスケープしたSQLストリングに対してコード化されます。結果はto
の中に置かれ、最後の部位にゼロバイトが付加されます。コード化された文字はNUL
(ASCII
0)、‘\n
’、‘\r
’、‘\
’,
‘'
’,
‘"
’およびControl-Z
(項8.1. 「リテラル値」参照)です。(厳密に言えば、MySQLはバックスラッシュおよびクエリー中にストリングを引用する引用文字を除外することだけを要求します。この機能はそれらをログファイルの中で読み取るを容易にするため、他の文字を引用します。)
from
によって指定されたストリングは、長さがlength
バイトでなければなりません。to
バッファーを割り当て、長さが少なくともlength*2+1
バイトにしなければなりません。(最悪の場合、各文字は2バイトを使用するように、コード化する必要があるかもしれないので、端末ゼロバイトのための余裕が必要です。)mysql_real_escape_string()
が戻るとき、to
の中身はゼロで終わるストリングです。戻り値は、ゼロで終わる文字を含まないコード化されたストリングの長さに等しい大きさを持っています。
接続の文字セットに変更を施す必要がある場合、SET
NAMES
(またはSET CHARACTER
SET
ステートメントではなく、mysql_set_character_set()
機能を使うべきです。mysql_set_character_set()
は、SET
NAMES
のように働きますが、mysql_real_escape_string()
が使用した文字セットせっとにも影響を及ぼします。この場合、SET
NAMES
には影響を及ぼしません。
例
char query[1000],*end; end = strmov(query,"INSERT INTO test_table values("); *end++ = '\''; end += mysql_real_escape_string(&mysql, end,"What's this",11); *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()
機能は、mysqlclient
ライブラリの中に含まれています。当該機能はstrcpy()
と同じような働きをしますが、ポインターを最初のパラメータの終わりのゼロに戻します。
戻り値
to
の中に置かれた、ゼロで終わる文字を含まない値の長さ。
エラー
なし。