首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >让PHP停止替换“”$_GET或$_POST数组中的字符?

让PHP停止替换“”$_GET或$_POST数组中的字符?
EN

Stack Overflow用户
提问于 2008-09-16 01:47:44
回答 12查看 45.5K关注 0票数 86

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

代码语言:javascript
复制
<?php
echo "url is ".$_SERVER['REQUEST_URI']."<p>";
echo "x.y is ".$_GET['x.y'].".<p>";
echo "x_y is ".$_GET['x_y'].".<p>";

..。输出以下内容:

代码语言:javascript
复制
url is /SpShipTool/php/testGetUrl.php?x.y=a.b
x.y is .
x_y is a.b.

..。我的问题是:有什么方法可以让这一切停止吗?我无论如何也想不出我做了什么让我活该

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

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2008-09-16 02:01:36

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

传入变量名中的

通常,当变量被传递到脚本中时,PHP不会更改它们的名称。但是,需要注意的是,点(句点,句号)不是PHP变量名中的有效字符。出于这个原因,看看它:现在,解析器看到的是一个名为$varname的变量,后跟字符串连接运算符,后跟不带引号的字符串(即不匹配任何已知关键字或保留字的字符串) 'ext‘。显然,这并没有达到预期的效果。

因此,需要注意的是,PHP会自动将传入变量名中的任何点替换为下划线。

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

此外,根据this comment的说法,这些其他字符将转换为下划线:

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

(space)

  • chr(46) (.)
  • chr(32) (.)(dot)
  • chr(91) ([) (开方bracket)
  • chr(128) - chr(159) (各种)

)

因此,看起来您不得不使用它,因此您必须使用dawnerd's suggestion (我只使用str_replace )将脚本中的下划线转换回点。

票数 77
EN

Stack Overflow用户

发布于 2009-12-21 20:47:22

回答了很久的问题,但实际上有一个更好的答案(或变通方法)。PHP让你在raw input stream,所以你可以这样做:

代码语言:javascript
复制
$query_string = file_get_contents('php://input');

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

然后,如果需要,您可以解析它(根据POSTer's comment)

代码语言:javascript
复制
<?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参数非常有用。和“_”,每个都有特定的含义!

票数 62
EN

Stack Overflow用户

发布于 2013-12-04 09:36:13

在上面的评论中突出显示了Johan的实际答案-我只是将我的整个帖子包装在一个顶级数组中,它完全绕过了这个问题,不需要大量的处理。

在你所做的表格中

代码语言:javascript
复制
<input name="data[database.username]">  
<input name="data[database.password]">  
<input name="data[something.else.really.deep]">  

而不是

代码语言:javascript
复制
<input name="database.username"> 
<input name="database.password"> 
<input name="something.else.really.deep">  

在post处理程序中,只需将其解包:

代码语言:javascript
复制
$posdata = $_POST['data'];

对我来说,这是两行代码的更改,因为我的视图完全是模板化的。

仅供参考。我在我的字段名中使用圆点来编辑分组数据的树。

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档