PHP无法比较#字符且AJAX传递#时无输出的问题求助
PHP脚本无法处理以#开头的GET参数?看这篇解决
问题背景
你写了一个简单的PHP脚本,用来返回搜索输入文本的第一个字符,搭配AJAX实时更新页面。但发现只要输入以#开头的内容,页面就空白——既匹配不到#,也回显不出内容,哪怕用了strval()转换也没用。你的代码如下:
PHP代码
$data = strval($_GET['u']); $ss = substr($data, 0,1); if ($ss == "@") { echo("@"); } else if ($ss == "#") { echo("htttt"); } else { echo($ss); }
jQuery AJAX代码
$("#search").on('input', function(event) { event.preventDefault(); var sv = $("#search").val(); $.get('phpscripts/short/searchdata.php?u='+sv, function(data) { $("#s-h").text(data); }); });
问题根源
问题根本不在PHP,而是浏览器对URL中#的处理规则!#在URL里是「片段标识符(锚点)」,浏览器只会把#前面的内容发送给服务器,#及其后面的部分会被留在本地处理(比如跳转到页面内锚点)。
举个例子:当你输入#test时,实际发送给服务器的URL是phpscripts/short/searchdata.php?u=——u参数的值是空的!所以PHP里$data是空字符串,substr($data,0,1)自然拿不到内容,最后进入else分支输出空,页面就空白了。
解决方案:对GET参数进行URL编码
你需要在AJAX请求时,对sv的值做URL编码,把特殊字符转换成服务器能识别的编码格式。用JavaScript的encodeURIComponent()方法就可以搞定:
修改后的AJAX代码:
$("#search").on('input', function(event) { event.preventDefault(); var sv = $("#search").val(); // 对参数进行URL编码 var encodedSv = encodeURIComponent(sv); $.get('phpscripts/short/searchdata.php?u='+encodedSv, function(data) { $("#s-h").text(data); }); });
为什么这样有效?
encodeURIComponent('#')会把#转换成%23,当你输入#test时,发送的URL会变成phpscripts/short/searchdata.php?u=%23test。PHP接收到这个参数后,会自动把%23解码回#,这样$_GET['u']的值就是#test,substr($data,0,1)就能拿到#,进而匹配到对应的分支输出htttt啦。
额外小建议
- 如果你担心其他特殊字符(比如
&、=)也出问题,这个编码方法同样适用,它会把所有URL特殊字符都转成合法编码。 - 也可以用
$.get的第二个参数传对象,jQuery会自动帮你编码,写法更简洁:
这种方式不用手动调用$.get('phpscripts/short/searchdata.php', {u: sv}, function(data) { $("#s-h").text(data); });encodeURIComponent,jQuery内部会处理编码,更省心。
内容的提问来源于stack exchange,提问作者sandesh
相关产品推荐
相关产品推荐

