addslashes 和 mysql_real_escape_string 都是为了使数据安全的插入到数据库中而进行的过滤,那么这两个函数到底是有什么区别呢?

首先,我们还是从PHP手册入手:

手册上addslashes转义的字符是单引号(')、双引号(")、反斜线(\)与NUL(NULL 字符)。

mysql_real_escape_string转义的字符并没有被提到,只是说了一句:

注意:mysql_real_escape_string() 并不转义% 和_。

为什么PHP手册没有说呢?因为其实这是个MySql的C的API,所以我们需要查下MySql手册,上面是这么说的:

编码的字符为NUL (ASCII 0)、'\n'、'\r'、'\'、'''、'"'、以及Control-Z(请参见9.1节,“文字值”)。(严格地讲,MySQL仅需要反斜杠和引号字符,用于引用转义查询中的字符串。该函数能引用其他字符,从而使得它们在日志文件中具有更好的可读性)。

MySql手册上面的话总是令人费解的。

我们为了更深层次的探究这两个函数的不同,还是去看一看PHP的源码吧。

这是PHP的addslashes函数:

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);

}

很显然,它调用了 php_addslashes,我们继续看这个函数,

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);

}

结果又是在调用 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;

}

上面的函数已经非常清楚的描述出都要转义哪些字符了,现在我们去看一看 mysql_real_escape_string

这个不在string.c里了,是在mysql扩展中。

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);

}

这个函数并没有像上面的那样剥洋葱,而是直接调用了MySql的C的API,mysql_real_escape_string()。

需要注意的是,这个函数在调用mysql_real_escape_string这个API之前,先是判断了是否连接上了数据库,

CHECK_LINK(id); // 就是这句

所以,这就意味着mysql_real_escape_string必须是连接数据库之后才能使用。为了证实这一点,我们来简单的实验下:

echo mysql_real_escape_string("fdsafda'fdsa");

结果:

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

果然报错了,显示没有链接上数据库。

好了,总结就先告一段落。

终于明白为什么那么多开源的程序比如Discuz用addslashes而不用mysql_real_escape_string了。

所以呢,以后也就用addslashes好了,暂时可以忘记掉mysql_real_escape_string了!

php mysql addslashes_PHP函数 mysql_real_escape_string 与 addslashes 的区别相关推荐

  1. mysql addslashes_PHP函数addslashes和mysql_real_escape_string的区别

    首先:不要使用mysql_escape_string,它已被弃用,请使用mysql_real_escape_string代替它. mysql_real_escape_string和addslashes ...

  2. MySQL自定义函数创建与使用总结

    MySQL自定义函数创建与使用总结 MySQL自定义函数和存储过程类似,也需要在数据库中创建并保存.它与存储过程一样,都是由SQL语句和控制语句组成的代码片段,可以被应用程序和其他SQL语句调用. M ...

  3. mysql real escape,mysql_real_escape_string()函数

    mysql_real_escape_string()函数 mysql_real_escape_string()函数用于转义SQL语句中的特殊字符,该函数的语法格式如下: string mysql_re ...

  4. mysql addslashes_mysql 转义字符和php addslashes

    遇到一个很奇怪的问题,json数据中含有中文: "mail":{"title":"\u6218\u529b\u8fbe\u4eba\u6d3b\u52 ...

  5. oracle增量 mysql_是否有任何mysql / Oracle函数给予增量号。基于另一列相似值的一列?...

    我有兴趣知道是否有任何MySQL / Oracle函数给增量号.在另一列相似的值的基础上的一列? 就像在我的下面的代码中,我有order_primary列,其中包含订单号.所以基于此我们可以确定有多少 ...

  6. ipad php mysql_PHP中的MYSQL常用函数

    PHP中的MYSQL常用函数 1.mysql_connect()-建立数据库连接 格式: resource mysql_connect([string hostname [:port] [:/path ...

  7. mysql 本周函数_【转】MySQL时间函数的使用:查询本周、下周、本月、下个月份的数据...

    MySQL时间函数的使用:查询本周.上周.本月.上个月份的数据[转] /*今天*/ select * from 表名 where to_days(时间字段) = to_days(now()); /*昨 ...

  8. mysql聚合函数count用法_MySQL中聚合函数count的使用和性能优化技巧

    本文的环境是Windows 10,MySQL版本是5.7.12-log 一. 基本使用 count的基本作用是有两个: 统计某个列的数据的数量: 统计结果集的行数: 用来获取满足条件的数据的数量.但是 ...

  9. MySQL STR_TO_DATE函数

    转: MySQL STR_TO_DATE函数 2017年12月05日 15:41:58 木林森淼 阅读数:23822 版权声明:水平有限,如有补充或更正,望大家评论指正 https://blog.cs ...

最新文章

  1. call,apply,bind,new实现原理
  2. 陶哲轩实分析 习题 13.5.6
  3. java子类参数传递给父类_java – 为什么调用将父类作为参数的方法调用,而不是将子类作为参数获取的方法?...
  4. 什么是SQL 注入?
  5. 南邮微型计算机实验,南邮 微机原理 微型计算机与接口技术 微机原理实验.doc...
  6. asp.net读取图像二进制
  7. easyui树形菜单实现
  8. python保存和加载数组
  9. 人人都可以用Mac--安装和卸载应用软件
  10. 如何修复macOS上的Microsoft Edge高CPU和内存使用情况?
  11. 怎样解决DEDE织梦友情链接字数限制与链接个数限制
  12. 干货来袭!java从入门到精通第五版pdf
  13. MATLAB 时间序列预测算法(有代码)
  14. linux下双机热备份系统,基于Linux的双机热备份系统的研究与设计
  15. 郭盛华年收入5000万是真的吗?
  16. Python爬虫实战,采集高德地图信息
  17. 手把手教你一键U盘装系统
  18. 我的世界服务器无限开号,我的世界开挂指令大全表一览!39条命令无限可能性
  19. UEditor .Net版本任意文件上传漏洞复现
  20. Opencv或python中图像与三维数组原理

热门文章

  1. aws rds恢复数据库_使用AWS Glue将数据从AWS S3加载到AWS RDS SQL Server数据库
  2. sql 时态表的意义_SQL Server中的时态表
  3. Leetcode 32.最长有效括号
  4. [转]Delphi 12种大小写转换的方法
  5. JaveScript用二分法与普通遍历(冒泡)
  6. robotframework 测试工具添加PDF文件内容匹配插件
  7. 1004. Counting Leaves (30)
  8. HDOJ HDU 1849 Rabbit and Grass ACM 1849 IN HDU
  9. USBKiller (U盘病毒专杀工具)绿色特别版V2.3 b0825
  10. 睿停车系统车场服务器,睿停车后台管理中心系统-用户手册-前台版本