PHP中手动修改$_GET后filter_input始终返回NULL的问题求助
问题原因及解决办法
核心问题出在filter_input()的工作机制:它直接读取PHP接收到的原始请求数据,完全不受你手动修改$_GET/$_POST等超全局变量的影响。你在代码里给$_GET['c1']赋值,但这个操作不会同步到PHP的原始请求数据源,所以当你的请求本身没有携带c1参数时,所有filter_input调用都会返回空或NULL。
解决测试问题的两种方案
1. 改用filter_var()测试过滤逻辑
如果你只是想验证各种过滤器对不同字符的处理效果,直接用filter_var()替代filter_input()即可,它可以接收你传入的任意变量值:
for($i = 0; $i <= 255; ++$i) { if ($i == 0) { $c1 = "What@The@Heck"; } else { $c1 = chr($i); } // 直接用filter_var处理$c1 $c2 = filter_var($c1); $c3 = filter_var($c1, FILTER_SANITIZE_SPECIAL_CHARS); $c4 = filter_var($c1, FILTER_SANITIZE_ENCODED); $c5 = filter_var($c1, FILTER_SANITIZE_STRING, FILTER_FORCE_ARRAY); print "i=$i c1=$c1 c2=$c2 c3=$c3 c4=$c4 c5=$c5<br>"; print "c5=";var_dump($c5); print "<br>"; }
2. 模拟真实请求参数
如果你非要用filter_input测试,需要让请求本身携带c1参数:
- 浏览器访问时,在URL后加
?c1=xxx(可多次修改xxx测试不同值) - CLI模式下,通过
QUERY_STRING=c1=xxx php your_script.php模拟GET参数
为什么其他代码里能用filter_input?
你提到其他地方用filter_input没问题,是因为那些场景下请求本身确实携带了对应参数,filter_input能从原始数据源读到值,和你手动修改超全局变量的测试场景完全不同。
内容的提问来源于stack exchange,提问作者TomTerrific
相关产品推荐
相关产品推荐

