我遇到问题,PHP用POST和GET变量中的下划线替换所有空格。
例如,如果我有网址:http://localhost/proxy.php?user name = Max 浏览器会将其转换为http://localhost/proxy.php?user%20name=Max。
但是如果我输出$ _GET参数,则键不是用户名,而是 user_name !
是否有可能改变这种行为?
答案 0 :(得分:34)
来自PHP manual:
传入变量名称中的点
通常,PHP不会改变 变量的名称 传入剧本。但是,它 应该注意点(期间, 完全停止)不是一个有效的角色 一个PHP变量名。由于这个原因, 看看它:
<?php $varname.ext; /* invalid variable name */ ?>
现在,什么 解析器看到的是一个名为的变量 $ varname,后跟字符串 连接运算符,后跟 barestring(即未加引号的字符串 与任何已知密钥或 保留字)'ext'。显然,这个 没有预期的结果。
因此,重要的是 请注意PHP将自动 替换传入变量中的任何点 带下划线的名字。
并在页面上发表评论:
PHP转换为_(下划线)的字段名称字符的完整列表如下(不仅仅是点):
chr(32) ( ) (space) chr(46) (.) (dot) chr(91) ([) (open square bracket) chr(128) - chr(159) (various)
PHP不可逆转地修改包含这些字符的字段名称,以保持与不推荐使用的register_globals功能的兼容性。
答案 1 :(得分:5)
我认为获得所需参数的唯一可能性是使用$_SERVER['QUERY_STRING']
自行解析它们:
$a_pairs = explode('&', $_SERVER['QUERY_STRING']);
foreach($a_pairs AS $s_pair){
$a_pair = explode('=', $s_pair);
if(count($a_pair) == 1) $a_pair[1] = '';
$a_pair[0] = urldecode($a_pair[0]);
$a_pair[1] = urldecode($a_pair[1]);
$GLOBALS['_GET'][$a_pair[0]] = $a_pair[1];
$_GET[$a_pair[0]] = $a_pair[1];
}
答案 2 :(得分:3)
在register_globals的旧时代,查询字符串被PHP解压缩为全局变量,但变量标识符的格式受到限制,因此显然空格不起作用。这种限制仍然存在,老实说,我认为保持这种方式是一个好主意。
如果您确实无法在URL中将空格更改为下划线,则只需在处理请求时将$ _GET数组置换,并用空格替换每个下划线。
答案 3 :(得分:1)
据我所知,我从未在URL参数名称中看到空格......
我认为,将参数名称的所有空格转换为“_”会更好。