php mysql 字符转义问题

chinayuy 2012-06-03 11:59:06
<input type=name value='this's a apple' />
后台处理
$name=addslashes($_POST['name']);//转义单引号

insert的时候,是不是带着转义符号一起存到数据库里?还是去掉转义符号存进去?

如果是带着转义符号存入到数据库,这就出现了一个小问题

如果我要查义name是不是重复,就需要对$name进行比较

依然进行转义 $name=addslashes($_POST['name']);

SELECT count(*) AS num FROM talbe WHERE name = $name

num显示的是0,也就是说找不到相同的,

打印sql语句为 SELECT count(*) AS num FROM talbe WHERE name = 'this/'s a apple'

num的值为零,我打开数据库发现,name这个字段的值是 this/'s a apple,这样肯定不能找到

如果将$name,再转义一次才能找到,$name的值就是 this///'s a apple 才能找到纪录

也就是说用两次addslashes函数

请问大家是如何处理这样的问题?如果要用两次不是很麻烦吗?
...全文
498 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinayuy 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 6 楼 的回复:

楼上,我弄好了,是自己的类写的有问题

现在看到大家的解答,也算是又上了课。。。

我现在在数据中的记录是:this\'s a apple

取出来的是不是还要反转一下?把\去掉?还是直接将this's a apple存入数据库呢?


不需要,都说了入库不会有\了,那是转义给mysql看的。
[/Quote]

已经成功解决了,谢谢。。。
xuzuning 2012-06-03
  • 打赏
  • 举报
回复
出于安全的考虑,magic_quotes_gpc 的默认值是 on
也就是说,直接将传入的数据入库的话,是不需要在做转义(addslashes)处理的

如果你还需要对传入的数据作进一步加工,或是入库时还有非传入的字符串介入
那么你应该在接收传入数据的地方做去转义(stripslashes)处理
然后在入库前统一做转移处理

freedom_gooboy 2012-06-03
  • 打赏
  • 举报
回复
<input type=name value='this's a apple' /> //这个很不规范,这样$_POST['name']?能取到值?
改成下面这样
<input name="thisName1" id="thisName1" type=text value="'this's a apple'" />

//用个判断
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST['thisName1']);
} else {
$lastname = $_POST['thisName1'];
}

magic_quotes_gpc//魔术引用发生作用是在传递$_GET,$_POST,$_COOKIE时,这个在php.ini中设置.有以下两种情况

1. 对于magic_quotes_gpc=on的情况,
我们可以不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。

如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

2. 对于magic_quotes_gpc=off 的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行

参考 这两个地方 php中magic_quotes_gpc的作用 PHP magic_quotes_gpc的正确处理方式


ming0753 2012-06-03
  • 打赏
  • 举报
回复
设置php.ini文件中的magic_quotes_gpc=Off
qq120848369 2012-06-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

楼上,我弄好了,是自己的类写的有问题

现在看到大家的解答,也算是又上了课。。。

我现在在数据中的记录是:this\'s a apple

取出来的是不是还要反转一下?把\去掉?还是直接将this's a apple存入数据库呢?
[/Quote]

不需要,都说了入库不会有\了,那是转义给mysql看的。
chinayuy 2012-06-03
  • 打赏
  • 举报
回复
问题解决了。。。我转义了两次

在$_POST的时候已经addslashes了,结果inster的时候,又mysql_real_escape_string了一次

结果本来this\'s 是给mysql看的,结果我自己的类把this\'s当成字符串又转义了一次,结果存到库中就变成了this\'s了。。。。痛苦。。。谢谢楼上的兄弟们解答
chinayuy 2012-06-03
  • 打赏
  • 举报
回复
楼上,我弄好了,是自己的类写的有问题

现在看到大家的解答,也算是又上了课。。。

我现在在数据中的记录是:this\'s a apple

取出来的是不是还要反转一下?把\去掉?还是直接将this's a apple存入数据库呢?
qq120848369 2012-06-03
  • 打赏
  • 举报
回复
再就是如果Php.ini开启了magic_quotes_gpc,那么cookie啊,post,get啊,都会默认就addslashes过了,比如用户上传的是li'lei,那么你$_POST['name']得到就是li\'lei, 这样直接拼接到sql里:

select * from table where name='li\'lei'就行了,不需要addslashes了。
如果你给它addslashes了,那就变态了,因为\也会影响mysql解析命令,所以addslashes也会转移它,结果就真的变态了:

addslashes("li\'lei");将生成li\\\'lei, 拼成sql:

select * from table where name='li\\\'lei',入库后实际就是li\'lei,多了一个\。


再另外,stripslashes很少使用,因为一般只有php.ini默认开启了magic_quotes_gpc(get,post,cookie的意思)的情况下,如果我们希望使用到用户真正提交的值,比如li'lei,那么需要做stripslashes($_POST['name']); 而这里的name是被自动addslahes过的li\'lei, strip后就是li'lei了。
如果不strip,那么输出到页面上,用户看到的会是li\'lei。
qq120848369 2012-06-03
  • 打赏
  • 举报
回复
楼主迷惑很大啊, addslashes不会添加多余的字符入库噢, 那个转移符号是给mysql看的, 比如你执行语句:

select * from table where name='li'lei';

这样mysql怎么解析, 引号不匹配啊, 所以对li'lei做addslashes转移掉那个'。

select * from table where name='li\'lei';

mysql执行这条语句就没问题了,中间的'是转移掉的,不会当做边界符号,而是当做普通字符,入库的内容还是li'lei,而不是li\'lei。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧