我有问题,PHP用POST和GET变量中的下划线替换所有空格.
例如,如果我有URL:http://localhost/proxy.php?user name = Max,浏览器会将其转换为http://localhost/proxy.php?user%20name = Max.
但是如果我给出$ _GET参数,那么键不是用户名而是user_name!
有没有可能改变这种行为?
Gre*_*reg 34
从PHP手册:
输入变量名称中的点
通常,PHP在传递到脚本时不会更改变量的名称.但是,应该注意,点(句点,句号)不是PHP变量名中的有效字符.出于这个原因,看看它:
Run Code Online (Sandbox Code Playgroud)<?php $varname.ext; /* invalid variable name */ ?>
现在,解析器看到的是一个名为$ varname的变量,后跟字符串连接运算符,后跟barestring(即不带引号的字符串,它与任何已知的密钥或保留字不匹配)'ext'.显然,这没有预期的结果.
因此,请务必注意PHP会自动使用下划线替换传入变量名中的任何点.
并在页面上发表评论:
PHP转换为_(下划线)的字段名称字符的完整列表如下(不仅仅是点):
Run Code Online (Sandbox Code Playgroud)chr(32) ( ) (space) chr(46) (.) (dot) chr(91) ([) (open square bracket) chr(128) - chr(159) (various)
PHP不可逆地修改包含这些字符的字段名称,以尝试保持与已弃用的register_globals功能的兼容性.
我认为获得所需参数的唯一可能性是使用$_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];
}
Run Code Online (Sandbox Code Playgroud)