让 PHP 停止替换 '.' $_GET 或 $_POST 数组中的字符?

新手上路,请多包涵

如果我通过 $_GET 传递名称中带有 . 的 PHP 变量,PHP 会自动将它们替换为 _ 字符。例如:

 <?php
echo "url is ".$_SERVER['REQUEST_URI']."<p>";
echo "x.y is ".$_GET['x.y'].".<p>";
echo "x_y is ".$_GET['x_y'].".<p>";

…输出以下内容:

 url is /SpShipTool/php/testGetUrl.php?x.y=a.b
x.y is .
x_y is a.b.

…我的问题是:有 什么 办法可以阻止它吗?我这辈子都想不通我做了什么才配得上这个

我运行的 PHP 版本是 5.2.4-2ubuntu5.3。

原文由 Dave Carpeneto 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 475
2 个回答

以下是 PHP.net 对其原因的解释:

传入变量名称中的点

通常,当变量被传递到脚本中时,PHP 不会更改变量的名称。但是,应该注意点(句点、句点)在 PHP 变量名中不是有效字符。原因,看一下:

 <?php
$varname.ext;  /* invalid variable name */
?>

现在,解析器看到的是一个名为 $varname 的变量,后跟字符串连接运算符,然后是裸字符串(即不匹配任何已知键或保留字的未加引号的字符串)’ext’。显然,这没有预期的结果。

出于这个原因,请务必注意 PHP 会自动将传入变量名称中的任何点替换为下划线。

这是来自 http://ca.php.net/variables.external

此外,根据 此评论,这些其他字符将转换为下划线:

PHP 转换为 _(下划线)的字段名称字符的完整列表如下(不仅仅是点):

  • 字符 (32) ( ) (空格)
  • chr(46) (.) (点)
  • chr(91) ([)(左方括号)
  • chr(128) - chr(159)(各种)

所以看起来你坚持下去了,所以你必须使用 dawnerd 的建议 将下划线转换回脚本中的点(不过我只是使用 str_replace 。)

原文由 Paige Ruten 发布,翻译遵循 CC BY-SA 4.0 许可协议

很久以来回答的问题,但实际上有更好的答案(或解决方法)。 PHP 允许您使用 原始输入流,因此您可以执行以下操作:

 $query_string = file_get_contents('php://input');

这将为您提供查询字符串格式的 $_POST 数组,句号应该是这样。

然后您可以根据需要解析它(根据 POSTer 的评论

 <?php
// Function to fix up PHP's messing up input containing dots, etc.
// `$source` can be either 'POST' or 'GET'
function getRealInput($source) {
    $pairs = explode("&", $source == 'POST' ? file_get_contents("php://input") : $_SERVER['QUERY_STRING']);
    $vars = array();
    foreach ($pairs as $pair) {
        $nv = explode("=", $pair);
        $name = urldecode($nv[0]);
        $value = urldecode($nv[1]);
        $vars[$name] = $value;
    }
    return $vars;
}

// Wrapper functions specifically for GET and POST:
function getRealGET() { return getRealInput('GET'); }
function getRealPOST() { return getRealInput('POST'); }
?>

对于同时包含“.”的 OpenID 参数非常有用。和’_‘,每个都有一定的含义!

原文由 crb 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏