POST未正确解析为$ _POST

时间:2010-07-30 19:40:00

标签: php post

我有一个表单,然后将其输出到POST:

<?php print file_get_contents('php://input'); ?>

%2Ffaults%2Ffault%5B1%5D%2F%40signal = gnc.gnc_in.ttag_sec&安培;%2Ffaults%2Ffault%5B1%5D =增量&安培;%2Ffaults%2Ffault%5B1%5D%2Fboolean%2F%40value =假安培; %2Ffaults%2Ffault%5B1%5D%2Fincrement%2F%40value = 6677&安培;%2Ffaults%2Ffault%5B1%5D%2Fthreshold%2F%40condition =安培;%2Ffaults%2Ffault%5B1%5D%2Fthreshold%2F%40value =安培;%2Ffaults%2Ffault%5B1%5D%2Ftimestamp%2F%40value =

一旦urldecoded:

/faults/fault[1]/@signal=gnc.gnc_in.ttag_sec
/faults/fault[1]=increment
/faults/fault[1]/boolean/@value=false
/faults/fault[1]/increment/@value=6677
/faults/fault[1]/threshold/@condition=
/faults/fault[1]/threshold/@value=
/faults/fault[1]/timestamp/@value=

然而,当我查看$ _POST时,我得到的是:

   <?php print_r($_POST); ?>
Array ( [/faults/fault] => Array ( [1] => ) )

如您所见,该阵列中缺少一点点。有什么想法吗?

感谢。

3 个答案:

答案 0 :(得分:1)

您必须将表单重组为:

<input name="xpath_expre[]" type="text" value="/faults/fault[1]/@signal" />
<input name="xpath_resul[]" type="text" value="gnc.gnc_in.ttag_sec" />

或者您必须自己解析数据。

This is the code在fins [尝试构建数组时失败了。如您所见,您当前的方法还有其他失败点(这些是代码中的注释):

  
      
  • 忽略变量名称中的前导空格
  •   
  • 确保变量名称中没有空格或点
  •   
  • PHP变量的名称中不能包含'[',因此我们将字符替换为'_'
  •   
  • ...
  •   

答案 1 :(得分:0)

PHP在变量名中的[1]上窒息,它似乎在解释为数组元素。

我不认为这些是HTML中的有效字段名称吗?

根据你想要做的事情,我会删除[1]或将它放在每个变量名的末尾,这应该会产生许多数组,其第一个元素包含所需的值。

像这样的东西

faults/fault[1]/@signal=gnc.gnc_in.ttag_sec<br>
/faults/fault[1]=increment&/faults/fault[1]/boolean/@value=false<br>
/faults/fault/increment/@value[1]=6677<br>
/faults/fault/threshold/@condition[1]=<br>
/faults/fault/threshold/@value[1]=<br>
/faults/fault/timestamp/@value[1]/=<br>

答案 2 :(得分:0)

有时PHP需要我们:)


<?php
#$input = file_get_contents('php://input');
$input = urldecode( '%2Ffaults%2Ffault%5B1%5D%2F%40signal=gnc.gnc_in.ttag_sec&%2Ffaults%2Ffault%5B1%5D=increment&%2Ffaults%2Ffault%5B1%5D%2Fboolean%2F%40value=false&%2Ffaults%2Ffault%5B1%5D%2Fincrement%2F%40value=6677&%2Ffaults%2Ffault%5B1%5D%2Fthreshold%2F%40condition=&%2Ffaults%2Ffault%5B1%5D%2Fthreshold%2F%40value=&%2Ffaults%2Ffault%5B1%5D%2Ftimestamp%2F%40value=' );

$_POST = array();

foreach( explode( '&', $input ) as $entry ) {
    list( $key, $value )  = explode( '=', $entry );

    $_POST[ $key ] = $value;
}

echo $input, PHP_EOL;
print_r( $_POST );