这是标准的 PHP 行为。当在 POST 请求中用作数组键时,点将转换为下划线。
来自文档 https://www.php.net/manual/it/language.variables.external.php:
变量名中的点和空格将转换为下划线。为了
例如 变为 $_REQUEST["a_b"]。
唯一的解决方案是:在 POST 请求中使用数组键时,停止在数组键中使用空格和/或点,或者对收到的每个数组键进行字符串替换。
$post = array();
foreach ($_POST as $key => $value)
$post[str_replace("_", ".", $key)] = $value;
请注意,上面的代码只能解决以下问题.
(转换成_
) 但不包括空格。另外,如果你有任何_
在你的原始密钥中,这将被转换为.
以及(正如评论中指出的)。
如您所见,唯一真正的解决方案是避免.
和空间$_POST
键。它们只是无法被接收,不能使用 PHP(也不能使用我所知道的其他服务器端解决方案):您将丢失该信息。
不,这不是限制或垃圾功能:这是编程指南。如果您使用数组键名称执行的操作超出了通常使用变量名称执行的操作,那么您很可能在概念上做错了一些事情(我也这样做过很多次)。
只是给你一个例子来说明这是多么错误:在一些编程解决方案中,例如ASP.NET-MVC /questions/tagged/asp.net-mvc(而且,我认为,代码点火器 /questions/tagged/codeigniter也)POST/GET 请求应该映射到所谓的“控制器”中的函数。这意味着如果您发送一个类似于["myKey" => "myValue", "myOtherKey" => "someValue"]
然后你应该有一个以键作为参数的函数。
function(String myKey, String myOtherKey){ }
PHP 没有默认的“顶层”框架(据我所知)可以执行此操作:它允许您直接访问 $_POST。很酷:但是这个玩具很容易坏。请谨慎使用。