如果我通过$_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。
发布于 2008-09-16 02:01:36
以下是PHP.net对其原因的解释:
传入变量名中的
点
通常,当变量被传递到脚本中时,PHP不会更改它们的名称。但是,需要注意的是,点(句点,句号)不是PHP变量名中的有效字符。出于这个原因,看看它:现在,解析器看到的是一个名为$varname的变量,后跟字符串连接运算符,后跟不带引号的字符串(即不匹配任何已知关键字或保留字的字符串) 'ext‘。显然,这并没有达到预期的效果。
因此,需要注意的是,PHP会自动将传入变量名中的任何点替换为下划线。
这是来自http://ca.php.net/variables.external的。
此外,根据this comment的说法,这些其他字符将转换为下划线:
将字段名字符转换为_(下划线)的完整列表如下(不仅仅是点):
(space)
)
因此,看起来您不得不使用它,因此您必须使用dawnerd's suggestion (我只使用str_replace )将脚本中的下划线转换回点。
发布于 2009-12-21 20:47:22
回答了很久的问题,但实际上有一个更好的答案(或变通方法)。PHP让你在raw input stream,所以你可以这样做:
$query_string = file_get_contents('php://input');
这将为您提供查询字符串格式的$_POST数组,句号是它们应该的格式。
然后,如果需要,您可以解析它(根据POSTer's comment)
<?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参数非常有用。和“_”,每个都有特定的含义!
发布于 2013-12-04 09:36:13
在上面的评论中突出显示了Johan的实际答案-我只是将我的整个帖子包装在一个顶级数组中,它完全绕过了这个问题,不需要大量的处理。
在你所做的表格中
<input name="data[database.username]">
<input name="data[database.password]">
<input name="data[something.else.really.deep]">
而不是
<input name="database.username">
<input name="database.password">
<input name="something.else.really.deep">
在post处理程序中,只需将其解包:
$posdata = $_POST['data'];
对我来说,这是两行代码的更改,因为我的视图完全是模板化的。
仅供参考。我在我的字段名中使用圆点来编辑分组数据的树。
https://stackoverflow.com/questions/68651
复制相似问题