一、问题来源
使用serialize()组织form表单数据,得到的数据形式是:id=1&name=”lishi”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<div class="le-quantity"> <form> <input type="hidden" name="id" value="1"> <input type="hidden" name="name" value="lishi"> </form> </div> <button id="addto-cart" type="button" >提交表单按钮</button> <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function() { var cart = $('#addto-cart'); cart.click(function(event) { var data = $('.le-quantity form').serialize();//组织表单数据,形式为 id=1&name='lishi' $.post('接收数据url', {data: data}, function(data, textStatus, xhr) { console.log(data);//php处理后,返回的结果竟然是{"id":"1","amp;name":"lishi"},这里的amp;是什么鬼? }); }); }); </script> |
再来看php
1 2 3 4 5 |
function deal(){ $str = $_POST[data];//得到的结果是:id=1&name="lishi",这里多了个amp; parse_str($str,$data);//本该把id=1&name="lishi"转化成数组,但是$str错误,导致得不到想要的结果 return json_encode($data); } |
二、解决方法
parse_str() 函数
定义和用法
parse_str() 函数把查询字符串解析到变量中。
注释:如果未设置 array 参数,则由该函数设置的变量将覆盖已存在的同名变量。
注释:php.ini 文件中的 magic_quotes_gpc 设置影响该函数的输出。如果已启用,那么在 parse_str() 解析之前,变量会被 addslashes() 转换。
1 2 3 4 |
<?php parse_str("name=Bill&age=60",$myArray); print_r($myArray); ?> |
得到的结果:
Array ( [name] => Bill [age] => 60 )
所以 amp; 这货为什么会出现,那是因为 & 被转义了
三、救星 — htmlspecialchars_decode()
既然某些字符被转义了,把它转回来就行了,于是尝试了htmlspecialchars_decode(),结果问题解决。
1 2 3 4 5 6 |
function deal(){ $str = $_POST[data];//得到的结果是:id=1&name="lishi",这里多了个amp; $str = htmlspecialchars_decode( $str);//得到的结果是:id=1&name="lishi",这次正常了 parse_str($str,$data);//得到了正确的结果,问题解决 return json_encode($data); } |