unsigned long
mysql_real_escape_string_quote(MYSQL *mysql,
char *to,
const char *from,
unsigned long length,
char quote)
此函式會建立一個合法的 SQL 字串,以便在 SQL 陳述式中使用。請參閱字串常值。
mysql
引數必須是一個有效、已開啟的連線,因為字元跳脫取決於伺服器所使用的字元集。
會對 from
引數中的字串進行編碼,以產生跳脫的 SQL 字串,其中會考慮到連線的目前字元集。結果會放置在 to
引數中,後面接著一個終止空位元組。
編碼的字元為 \
、'
、"
、NUL
(ASCII 0)、\n
、\r
、Control+Z 和 `
。嚴格來說,MySQL 僅要求跳脫反斜線和查詢中用於引用字串的引號字元。 mysql_real_escape_string_quote()
會引用其他字元,讓它們在記錄檔中更容易閱讀。若要比較,請參閱字串常值的引用規則,以及QUOTE()
SQL 函式 (位於字串常值和字串函式和運算子中)。
如果啟用了ANSI_QUOTES
SQL 模式,則無法使用mysql_real_escape_string_quote()
來跳脫雙引號字元,以便在雙引號識別碼中使用。(此函式無法判斷是否已啟用該模式,以決定正確的跳脫字元。)
from
所指向的字串長度必須是 length
個位元組。您必須配置 to
緩衝區,使其長度至少為 length*2+1
個位元組。(在最糟的情況下,每個字元可能需要編碼為使用兩個位元組,而且必須有空間放置終止空位元組。)當mysql_real_escape_string_quote()
傳回時,to
的內容會是一個以 null 終止的字串。傳回值是編碼字串的長度,不包括終止空位元組。
quote
引數會指出要放置跳脫字串的內容。假設您打算跳脫 from
引數,並將跳脫的字串 (在此以 str
表示) 插入下列其中一個陳述式
1) SELECT * FROM table WHERE name = 'str'
2) SELECT * FROM table WHERE name = "str"
3) SELECT * FROM `str` WHERE id = 103
若要針對每個陳述式正確執行跳脫,請如下呼叫 mysql_real_escape_string_quote()
,其中最後一個引數會指出引用內容
1) len = mysql_real_escape_string_quote(&mysql,to,from,from_len,'\'');
2) len = mysql_real_escape_string_quote(&mysql,to,from,from_len,'"');
3) len = mysql_real_escape_string_quote(&mysql,to,from,from_len,'`');
如果必須變更連線的字元集,請使用 mysql_set_character_set()
函式,而不是執行 SET NAMES
(或 SET CHARACTER SET
) 陳述式。mysql_set_character_set()
的運作方式與 SET NAMES
類似,但也會影響 mysql_real_escape_string_quote()
所使用的字元集,而 SET NAMES
不會。
下列範例會將兩個跳脫的字串插入 INSERT
陳述式中,每個字串都位於單引號字元內
char query[1000],*end;
end = my_stpcpy(query,"INSERT INTO test_table VALUES('");
end += mysql_real_escape_string_quote(&mysql,end,"What is this",12,'\'');
end = my_stpcpy(end,"','");
end += mysql_real_escape_string_quote(&mysql,end,"binary data: \0\r\n",16,'\'');
end = my_stpcpy(end,"')");
if (mysql_real_query(&mysql,query,(unsigned int) (end - query)))
{
fprintf(stderr, "Failed to insert row, Error: %s\n",
mysql_error(&mysql));
}
範例中使用的 my_stpcpy()
函式包含在 libmysqlclient
程式庫中,其運作方式與 strcpy()
類似,但會傳回指向第一個參數終止 null 的指標。