http_build_query()点转换为下划线


http_build_query() dot is converted to underscore

请检查以下数组:

Array([bunrey] => Array ([0] => 20130730181908615391000000)
      [mt.shasta] => Array ( 
        [0] => 20130708203742347410000000
        [1] => 20130213201456984069000000
        [2] => 20130712144459481348000000
      )
      [shingletwon] => Array
      (
        [0] => 20130801233842122771000000
      )
)

我想使用CCD_ 1将此数组作为查询字符串发送,使用http_build_query():后,我得到了以下字符串

bunrey%5B0%5D=20130730181908615391000000&mt.shasta%5B0%5D=20130708203742347410000000&mt.shasta%5B1%5D=20130213201456984069000000&mt.shasta%5B2%5D=20130712144459481348000000&shingletwon%5B0%5D=20130801233842122771000000

正如您所看到的,在将这个查询字符串发送到其他文件后,我正在尝试检索。我已经回显了$_REQUEST对象:

Array (
[bunrey] => Array
    (
        [0] => 20130730181908615391000000
    )
[mt_shasta] => Array
    (
        [0] => 20130708203742347410000000
        [1] => 20130213201456984069000000
        [2] => 20130712144459481348000000
    )
[shingletwon] => Array
    (
        [0] => 20130801233842122771000000
    )
)

请检查其中一个密钥mr.shasta已更改为mr_shasta。你们能为此提供任何解决方案吗。

这是标准的PHP行为。点在POST请求中用作数组键时会转换为下划线。

来自文件:

变量名称中的点和空格将转换为下划线。对于示例<input name="a.b"/>变为$_REQUEST["a_b"]。

唯一的解决方案是:在POST请求中使用数组键时,停止在数组键中使用空格和/或点,否则,对接收到的每个数组键进行字符串替换。

$post = array();
foreach ($_POST as $key => $value)
$post[str_replace("_", ".", $key)] = $value;

请注意,上面的代码将只修复.(转换为_)的问题,而不修复空格。此外,如果您的原始密钥中有任何_,它也将转换为.(如注释中所指出的)。

正如您所看到的,唯一真正的解决方案是避免http_build_query()0和$_POST密钥中的空格。它们就是无法接收,PHP也无法接收(据我所知,其他服务器端解决方案也无法接收):您会丢失这些信息。

不,这不是一个限制或垃圾特性:这是一个编程指南。如果您使用数组键名称的方式超出了通常使用变量名称的方式,那么您很可能在概念上做了错误的事情(我也做过很多次)。

举个例子说明这有多错误:在一些编程解决方案中,比如asp.net-mvc(我认为还有codeigniter),POST/GET请求应该映射到所谓的"控制器"中的函数上。这意味着,如果您发送一个看起来像["myKey" => "myValue", "myOtherKey" => "someValue"]的POST,那么您应该有一个将键作为参数的函数。

function(String myKey, String myOtherKey){ }

PHP没有默认的"顶级"框架(据我所知)可以做到这一点:它允许您直接访问$_POST。酷:但是这个玩具很容易坏。小心使用。

我可能错了,但我已经复制了你正在做的事情,并发现这取决于你如何分配数组,以及它是否像这样更改密钥:

//doesn't change to mt_shasta 
$array['bunrey'][0] = 20130730181908615391000000;
$array['bunrey']['mt.shasta'][0] = 20130708203742347410000000;
$array['bunrey']['mt.shasta'][1] = 20130708203742347410000000;
$array['bunrey']['mt.shasta'][2] = 20130708203742347410000000;
$array['bunrey']['shingletwon'][0] = 20130708203742347410000000;
//does change to mt_shasta
$array = array ( 
  '0'  => 20130730181908615391000000,
  'mt.shasta' => array ( 
    0 => 20130708203742347410000000,
    1 => 20130213201456984069000000,
    2 => 20130712144459481348000000,
  ),
  'shingletwon' => array
  (
    0 => 20130801233842122771000000,
  ),
);