日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql_real_escape_string 报错_addslashes与mysql_real_escape_string的区别

發(fā)布時(shí)間:2023/12/13 数据库 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql_real_escape_string 报错_addslashes与mysql_real_escape_string的区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

addslashes和mysql_real_escape_string.都是為了使數(shù)據(jù)安全的插入到數(shù)據(jù)庫(kù)中而進(jìn)行過(guò)濾.那么這兩個(gè)函數(shù)到底是有什么區(qū)別呢??

我們今天來(lái)簡(jiǎn)單的看下..

首先.我們還是從PHP手冊(cè)入手..

手冊(cè)上addslashes轉(zhuǎn)義的字符是單引號(hào)(')、雙引號(hào)(")、反斜線(xiàn)(\)與NUL(NULL 字符)。

mysql_real_escape_string轉(zhuǎn)義的字符并沒(méi)有被提到.只是說(shuō)了一句

注意: mysql_real_escape_string() 并不轉(zhuǎn)義% 和_。

為什么PHP手冊(cè)沒(méi)有說(shuō)呢?因?yàn)槠鋵?shí)這是個(gè)MySql的C的API.所以我們需要查下MySql手冊(cè)..上面是這么說(shuō)的.

編碼的字符為NUL (ASCII 0)、'\n'、'\r'、'\'、'''、'"'、以及Control-Z(請(qǐng)參見(jiàn)9.1節(jié),“文字值”)。(嚴(yán)格地講,MySQL僅需要反斜杠和引號(hào)字符,用于引用轉(zhuǎn)義查詢(xún)中的字符串。該函數(shù)能引用其他字符,從而使得它們?cè)谌罩疚募芯哂懈玫目勺x性)。

不得不說(shuō)一句.MySql手冊(cè)上面的話(huà)總是令人費(fèi)解的..

我們?yōu)榱烁顚哟蔚奶骄窟@兩個(gè)函數(shù)的不同..還是去看一看PHP的源碼吧..

這是PHP的addslashes函數(shù)..

PHP_FUNCTION(addslashes)

{

zval **str;

if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == FAILURE) {

WRONG_PARAM_COUNT;

}

convert_to_string_ex(str);

if (Z_STRLEN_PP(str) == 0) {

RETURN_EMPTY_STRING();

}

RETURN_STRING(php_addslashes(Z_STRVAL_PP(str),

Z_STRLEN_PP(str),

&Z_STRLEN_P(return_value), 0

TSRMLS_CC), 0);

}

很顯然.它調(diào)用了php_addslashes.我們繼續(xù)看這個(gè)函數(shù)

PHPAPI char *php_addslashes(char *str, int length, int *new_length, int should_free TSRMLS_DC)

{

return php_addslashes_ex(str, length, new_length, should_free, 0 TSRMLS_CC);

}

結(jié)果又是是在調(diào)用php_addslashes_ex 我們就像在剝洋蔥一樣..一步一步的接近真理..

PHPAPI char *php_addslashes_ex(char *str, int length, int *new_length, int should_free, int ignore_sybase TSRMLS_DC)

{

/* maximum string length, worst case situation */

char *new_str;

char *source, *target;

char *end;

int local_new_length;

if (!new_length) {

new_length = &local_new_length;

}

if (!str) {

*new_length = 0;

return str;

}

new_str = (char *) safe_emalloc(2, (length ? length : (length = strlen(str))), 1);

source = str;

end = source + length;

target = new_str;

if (!ignore_sybase && PG(magic_quotes_sybase)) {

while (source < end) {

switch (*source) {

case '\0':

*target++ = '\\';

*target++ = '0';

break;

case '\'':

*target++ = '\'';

*target++ = '\'';

break;

default:

*target++ = *source;

break;

}

source++;

}

} else {

while (source < end) {

switch (*source) {

case '\0':

*target++ = '\\';

*target++ = '0';

break;

case '\'':

case '\"':

case '\\':

*target++ = '\\';

/* break is missing *intentionally* */

default:

*target++ = *source;

break;

}

source++;

}

}

*target = 0;

*new_length = target - new_str;

if (should_free) {

STR_FREE(str);

}

new_str = (char *) erealloc(new_str, *new_length + 1);

return new_str;

}

上面的函數(shù)已經(jīng)非常清楚的描述出都要轉(zhuǎn)義哪些字符了..現(xiàn)在我們?nèi)タ匆豢磎ysql_real_escape_string

這個(gè)不在string.c里了..是在mysql擴(kuò)展中.

PHP_FUNCTION(mysql_real_escape_string)

{

zval *mysql_link = NULL;

char *str;

char *new_str;

int id = -1, str_len, new_str_len;

php_mysql_conn *mysql;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &str, &str_len, &mysql_link) == FAILURE) {

return;

}

if (ZEND_NUM_ARGS() == 1) {

id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);

CHECK_LINK(id);

}

ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);

new_str = safe_emalloc(str_len, 2, 1);

new_str_len = mysql_real_escape_string(&mysql->conn, new_str, str, str_len);

new_str = erealloc(new_str, new_str_len + 1);

RETURN_STRINGL(new_str, new_str_len, 0);

}

這個(gè)函數(shù)并沒(méi)有像上面的那樣剝洋蔥..

而是直接調(diào)用了MySql的C的API.mysql_real_escape_string()..

需要注意的是.這個(gè)函數(shù)在調(diào)用mysql_real_escape_string這個(gè)API之前.先是判斷了是否連接上了數(shù)據(jù)庫(kù)

CHECK_LINK(id);?? //就是這句

所以這就意味著mysql_real_escape_string必須是連接數(shù)據(jù)庫(kù)之后才能使用.為了證實(shí)這一點(diǎn).

我們來(lái)簡(jiǎn)單的實(shí)驗(yàn)下.

echo mysql_real_escape_string("fdsafda'fdsa");

結(jié)果

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in PHPDocument1 on line 2

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in PHPDocument1 on line 2

果然報(bào)錯(cuò)了..顯示沒(méi)有鏈接上數(shù)據(jù)庫(kù)..

好了..總結(jié)就先告一段落..

我們終于明白為什么那么多開(kāi)源的程序比如Discuz用addslashes而不用mysql_real_escape_string了.

所以呢.以后也就用addslashes好了..暫時(shí)可以忘記掉mysql_real_escape_string了

總結(jié)

以上是生活随笔為你收集整理的mysql_real_escape_string 报错_addslashes与mysql_real_escape_string的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。