关于php序列化的问题 将post的数据使用addcslashes后存入数据库,读取的时候再用stripcslashes 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 同样 如果post过来的内容中包含“\”反斜线,也会存在这种问题。总之,一旦post过来的内容中包含需要转义的字符,那么,序列化后的字符串存入数据库中后就跟存入前不同了,因此取出来之后也不能反序列化了。 TO: cnredarrow(红箭) 不行,试过了。addcslashes后无非是多家了一个“\”但序列化后,在存入数据库中就与存储前不一样了。(少一个“\”)因此不能发序列化了 次序问题<form method=post><input type=text name=txt value="''"><input type=submit></form><?phpif(get_magic_quotes_gpc()) $_POST = array_map('stripcslashes',$_POST);echo $s = serialize($_POST);print_r(unserialize($s));?> to: xuzuning(唠叨) 直接在逻辑中 serialize 或 unserialize都没有问题的。即使不stripcslashes也可以正常进行序列化操作。但是蒋序列化后的字符串往数据库中一存,采取出来就不能unserialize了 检查你的magic_quotes_runtime 开关状态(可用get_magic_quotes_runtime()函数)如是打开的则取出后要用stripcslashes函数祛除转义再反序列化 xuzuning(唠叨)我的magic_quotes_runtime是关闭的。尝试过打开。但他会将数据库中双引号、单引号、反斜线都加上转义斜线,这样一来序列化后的字符串结构就被破坏了,更不能正确反序列化了。并且将magic_quotes_runtime打开后,smarty模板引擎工作不正常了。这是打开magic_quotes_runtime后得到的结果。O:14:\"itt003question\":4:{s:15:\"questionContent\";s:2:\"\\\'\";s:14:\"questionAnswer\";s:1:\"B\";s:12:\"questionItem\";a:4:{i:0;s:2:\"\\\'\";i:1;s:2:\"\\\'\";i:2;s:2:\"\\\'\";i:3;s:2:\"\\\'\";}s:12:\"AnswerNumber\";i:4;} 序列化后的对象是这样的。(请注意s:2:"\'";)s后面的这个数字代表的就是后面双引号中间的字符数。O:14:"itt003question":4:{s:15:"questionContent";s:2:"\'";s:14:"questionAnswer";s:1:"B";s:12:"questionItem";a:4:{i:0;s:2:"\'";i:1;s:2:"\'";i:2;s:2:"\'";i:3;s:2:"\'";}s:12:"AnswerNumber";i:4;}可是存入数据库后就变为O:14:"itt003question":4:{s:15:"questionContent";s:2:"'";s:14:"questionAnswer";s:1:"B";s:12:"questionItem";a:4:{i:0;s:2:"'";i:1;s:2:"'";i:2;s:2:"'";i:3;s:2:"'";}s:12:"AnswerNumber";i:4;}因为s后面的数字没变,但入库操作却将转义字符“\”给去掉了。因此再去出来之后就不能反序列化了。 真有你的,谁让你打开magic_quotes_runtime开关啦?!请测试如下代码。然后你就知道你的问题在哪了。(表test中有一text类型的txt字段)<form method=post><input type=text name=txt value="''"><input type=submit></form><?phpif($_SERVER['REQUEST_METHOD'] == "POST") { if(get_magic_quotes_gpc()) $_POST = array_map('stripcslashes',$_POST); $s = serialize($_POST); $s = mysql_escape_string($s); mysql_connect(); mysql_select_db('test'); mysql_query("insert into test (txt) values ('$s')"); $rs = mysql_query("select txt from test"); list($t) = mysql_fetch_row($rs); print_r(unserialize($t));}?>入库时你若不做转义处理当然就一塌糊涂了 谢谢!唠叨兄,我真够唠叨的了。将原始信息序列化后再整体作转义,而不是对单个input元素作转义。谢谢谢谢!! php开发 好奇问一下 获取网页中全部超链接 linux系統下socket配置 怎样获得JS链接的网页地址? 如何实现php批量上传?要鼠标一扫一批文件地上传! 用户登陆后,每页左上角的欢迎信息是怎么弄的? iis问题,帮小妹请求援助,SOS! php安装的一些问题!谢了先! 关于一个发信的问题 请问这是什么意思? 谁能给我一个确实能用的防刷新的计算器,是文本类型的。
总之,一旦post过来的内容中包含需要转义的字符,那么,序列化后的字符串存入数据库中后就跟存入前不同了,因此取出来之后也不能反序列化了。
不行,试过了。
addcslashes后无非是多家了一个“\”但序列化后,在存入数据库中就与存储前不一样了。(少一个“\”)因此不能发序列化了
<input type=text name=txt value="''">
<input type=submit>
</form>
<?php
if(get_magic_quotes_gpc())
$_POST = array_map('stripcslashes',$_POST);echo $s = serialize($_POST);
print_r(unserialize($s));
?>
直接在逻辑中 serialize 或 unserialize都没有问题的。即使不stripcslashes也可以正常进行序列化操作。
但是蒋序列化后的字符串往数据库中一存,采取出来就不能unserialize了
如是打开的则取出后要用stripcslashes函数祛除转义再反序列化
我的magic_quotes_runtime是关闭的。尝试过打开。但他会将数据库中双引号、单引号、反斜线都加上转义斜线,这样一来序列化后的字符串结构就被破坏了,更不能正确反序列化了。并且将magic_quotes_runtime打开后,smarty模板引擎工作不正常了。这是打开magic_quotes_runtime后得到的结果。
O:14:\"itt003question\":4:{s:15:\"questionContent\";s:2:\"\\\'\";s:14:\"questionAnswer\";s:1:\"B\";s:12:\"questionItem\";a:4:{i:0;s:2:\"\\\'\";i:1;s:2:\"\\\'\";i:2;s:2:\"\\\'\";i:3;s:2:\"\\\'\";}s:12:\"AnswerNumber\";i:4;}
O:14:"itt003question":4:{s:15:"questionContent";s:2:"\'";s:14:"questionAnswer";s:1:"B";s:12:"questionItem";a:4:{i:0;s:2:"\'";i:1;s:2:"\'";i:2;s:2:"\'";i:3;s:2:"\'";}s:12:"AnswerNumber";i:4;}可是存入数据库后就变为
O:14:"itt003question":4:{s:15:"questionContent";s:2:"'";s:14:"questionAnswer";s:1:"B";s:12:"questionItem";a:4:{i:0;s:2:"'";i:1;s:2:"'";i:2;s:2:"'";i:3;s:2:"'";}s:12:"AnswerNumber";i:4;}
因为s后面的数字没变,但入库操作却将转义字符“\”给去掉了。因此再去出来之后就不能反序列化了。
请测试如下代码。然后你就知道你的问题在哪了。(表test中有一text类型的txt字段)<form method=post>
<input type=text name=txt value="''">
<input type=submit>
</form>
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
if(get_magic_quotes_gpc())
$_POST = array_map('stripcslashes',$_POST); $s = serialize($_POST);
$s = mysql_escape_string($s);
mysql_connect();
mysql_select_db('test');
mysql_query("insert into test (txt) values ('$s')"); $rs = mysql_query("select txt from test");
list($t) = mysql_fetch_row($rs);
print_r(unserialize($t));
}
?>入库时你若不做转义处理当然就一塌糊涂了
将原始信息序列化后再整体作转义,而不是对单个input元素作转义。谢谢谢谢!!