POST неправильно обрабатывается в $ _POST - PullRequest
0 голосов
/ 30 июля 2010

У меня есть форма, и она выводит это в 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 =

Однажды закодированный:

/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 ]

1 голос
/ 31 июля 2010

Вы должны либо изменить структуру формы на что-то вроде:

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

Или вам нужно проанализировать данные самостоятельно.

Это код , который не работаето том, как, пытаясь построить массив, когда он плавники [.Как видите, в вашем текущем подходе есть и другие точки сбоя (это комментарии в коде):

  • игнорировать начальные пробелы в имени переменной
  • обеспечитьчто у нас нет пробелов или точек в имени переменной
  • Переменные PHP не могут содержать в именах '[', поэтому мы заменяем символ на '_'
  • ...
0 голосов
/ 31 июля 2010

иногда 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 );


0 голосов
/ 30 июля 2010

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...