POST是没有得到正确地解析为$ _ 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 = 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 =

一旦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] =>)) 

正如你所看到的,一个公平位是从阵列丢失。任何想法为什么?

谢谢。

+1

这是因为这不是表单数据被张贴。 – Fosco 2010-07-30 19:43:49

+1

它是表单数据。我将它输入表单并点击提交。为什么它不是表格数据? – Peter 2010-07-30 20:01:04

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

它们是有效的字段名称(不是ids,但名称很好),并且在名称中使用'[foo]'处理表单控件是正常的PHP表单解析行为。 – Quentin 2010-07-30 19:47:44

+1

不仅正常,而且对于例如'

+0

一位精明的观察者可能注意到这些名字实际上是XPaths;) 它可以在另一个页面上工作, ] 在名字里。我不确定为什么它在这个页面上窒息。解析为$ _POST时,PHP会在输入时窒息吗? – Peter 2010-07-30 19:58:55

你必须要么重组形式是这样的:

<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这是失败的如何通过尝试建立一个数组,当它finse [。正如你所看到的,还有你目前的做法失败的其他点(这些代码是注释):

  • 忽略的变量名
  • 前导空格确保我们没有空间或在变量名
  • PHP变量不能包含点“[”在他们的名字,所以我们用“_”替换字符
  • ...
+0

谢谢!自己解析它不应该太难,我只需用&和=来爆炸。 – Peter 2010-07-30 20:33:34

有时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);