mysql_real_escape_string 报错_addslashes与mysql_real_escape_string的区别
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了
mysql_real_escape_string 报错_addslashes与mysql_real_escape_string的区别相关推荐
- 线上MYSQL同步报错故障处理总结 实现同步不一致进行邮件报警
线上MYSQL同步报错故障处理总结 公司使用腾讯云数据库,今天在从库上面查询相关数据时候,显示没有任何记录,登录后 show slave status\G 查看到状态中报1032错误,这里把相关主从同 ...
- git:Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists)....
Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists). 解决办法一:保 ...
- python时间函数报错_python3中datetime库,time库以及pandas中的时间函数区别与详解...
1介绍datetime库之前 我们先比较下time库和datetime库的区别 先说下time 在 Python 文档里,time是归类在Generic Operating System Servic ...
- explode php 报错,PHP函数explode和split的区别
explode和split在php中都是可以通过特定字符把字符串转换成数组哦,那么explode和split既然是一样的为什么会有两个函数呢,那么explode和split的区别在哪里呢,我们来看看. ...
- java sendredirect报错_java 中sendredirect()和forward()方法的区别
HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源. sendRedirect实现请求重定向,forw ...
- 为什么派生的子类报错不能实例化抽象类_一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别...
目录 #抽象类介绍 #为什么要用抽象类 #一个抽象类小故事 #一个抽象类小游戏 #接口介绍 #接口与类相似点: #接口与类的区别: #接口特性 #抽象类和接口的区别 #接口的使用: #接口最佳实践:设 ...
- Java File.getPath() File.getAbsolutePath()函数在Windows和Linux系统上存在区别!win正常而linux会报错!
Java File.getPath() File.getAbsolutePath()函数在Windows和Linux系统上存在区别!win正常而linux会报错! 如下图: windows下的源代码和 ...
- java中的反斜杠报错,老生常谈java路径中的反斜杠和斜杠的区别
JAVA中的斜杠 有正斜杠与反斜杠之分,正斜杠,一般就叫做斜杠,符号为"/":反斜杠的符号为"\". 斜杠(/)在JAVA中没有什么特别的意义,就是代表一个字符 ...
- mysql逻辑删除的区别_不能和逻辑删除一起配置,不然报错。
源自:8-1 SQL注入器简介及自定义方法实现 不能和逻辑删除一起配置,不然报错. 逻辑删除的配置:@Bean public ISqlInjector sqlInjector(){ return ne ...
最新文章
- 关于for中思维卡机的小悲剧
- 程序员锁死服务器致公司倒闭当事人逐条反驳:这锅我不背
- AtCoder Beginner Contest 215 E - Chain Contestant
- SAP Fiori Tools 和对应的 CLI (Command Line Interface)
- python断言失败_python异常处理、断言
- 【IDEA】Cause: invalid type code: 8D
- html java简单示例,HtmlUnit的简单例子
- 织梦自定义html文本,织梦内容模型自定义字段及调用方法
- 服务器状态码502什么意思,Http状态码502问题复盘
- Loadrunner11安装_简单使用基础教程
- 股票模拟交易软件之手机炒股软件排行榜
- android键盘坏了怎么办,手机虚拟键盘失灵怎么办
- Excel如何快速提取单元格括号内数据
- Excel学习日记:L33-二八法则的神奇图表-柏拉图(帕累托图)
- QT---实现舒尔特方格(零基础入门)
- Java正则表达式提取字符的方法实例
- 把开发板挂载到Ubuntu
- 数字图像处理实验——图片压缩与解压(opencv)
- 完美立方数生理周期假币问题熄灯问题阶乘汉诺塔N皇后问题
- 图像去雾算法--暗通道先验去雾算法
热门文章
- android 评价 星星大小,Android RatingBar 评价栏 星星 大小 样式 设置
- 大表与大表join数据倾斜_技术分享|大数据技术初探之Spark数据倾斜调优
- 新浪云python示例_Python Web框架Flask中使用新浪SAE云存储实例
- linux 分区 文件,Linux的分区与文件结构
- delphi xe2 project菜单怎么没有加组件功能_交互设计:让人困惑的三大交互组件及用法...
- 【转】ADFS 概念与基本开发介绍
- css 块元素、内联元素、内联块元素
- 异步、多线程、任务、并行编程之一:选择合适的多线程模型
- 选址问题java_学习使用分治算法来解决邮局选址问题(Java实现)
- idea提示“ cannot access xxxxxxxx.class“的解决方法,idea的bug