JSON_decode проблема с массивом, размещенным в CodeIgniter - PullRequest
0 голосов
/ 01 марта 2011

Я уверен, что совершаю простую ошибку ... но просто не могу ее найти.

В конечном итоге я публикую JSON-массив из приложения для Android (эта часть работает), но пока я просто тестирую между двумя страницами PHP (1: тестирование страницы PHP с базовой формой и 2: финал CodeIgniter пункт назначения) Вот что у меня есть:

На странице формы:

<form action="bambooinvoice/index.php/api2/newinvoice/4/0/0" method="post">
    <?php 
        $array = array("items"=>array(
            "taxable"=>1, 
            "quantity"=>1, 
            "amount"=>123.99, 
            "work_description"=>"this is a test"));
        $json = json_encode($array);
    ?>
    <input type="hidden" name=json value=<?php $json ?> />
    <input type="submit" name="btnSendForm" value="Send" />
</form>

Это создает (что выглядит хорошо для меня):

{"items":{"taxable":1,"Quantity":1,"amount":123.99,"work_description":"this is a test"}}

На стороне CodeIgniter у меня есть:

$input = $this->input->post('json');
$items = json_decode($input, TRUE);

$amount = 0;
foreach ($items as $item) // In case there are multiple 'items'
{
    $taxable = (isset($item['taxable']) && $item['taxable'] == 1) ? 1 : 0;

    $invoice_items = array(
        'quantity' => $item['quantity'],
        'amount' => $item['amount'],
        'work_description' => $item['work_description'],
        'taxable' => $taxable
    );

    $this->_addInvoiceItem($invoice_items); //simply adding contents to DB
}

В конце я получаю ошибку: (я получил множество ошибок на самом деле во всех моих настройках, но это та, которую я не могу поколебать)

Message: Invalid argument supplied for foreach()

Отредактировано - чтобы исправить опечатку.

Ответы [ 4 ]

3 голосов
/ 01 марта 2011

Вы используете $this->input->post('items'), когда ваша форма публикует скрытое значение с именем json.

Если вы var_dump($this->input->post('items')), это должно быть FALSE или NULL.

Вместо этого попробуйте это в вашем скрипте CI:

$input = $this->input->post('json'); // not 'items'
$items = json_decode($input, TRUE);

// Rest of your code...

Это должно исправить этопроблема, но вы также должны убедиться, что ваши данные JSON отправляются правильно для начала!var_dump($_POST) должен показать вам, если он делает это для вашего сценария в одной части.

0 голосов
/ 01 марта 2011

Вы можете изменить и не использовать json_encode и использовать serialize в вашем массиве.

Как в вашей форме:

<form action="bambooinvoice/index.php/api2/newinvoice/4/0/0" method="post">
    <?php 
        $array = array("items"=>array(
            "taxable"=>1, 
            "quantity"=>1, 
            "amount"=>123.99, 
            "work_description"=>"this is a test"));
        $json = serialize($array);
    ?>
    <input type="hidden" name=json value="<?php echo $json ?>" />
    <input type="submit" name="btnSendForm" value="Send" />
</form>

Эта функция сериализации создаст этот вывод:

a:1:{s:5:"items";a:4:{s:7:"taxable";i:1;s:8:"quantity";i:1;s:6:"amount";d:123.9899999999999948840923025272786617279052734375;s:16:"work_description";s:14:"this is a test";}}

Тогда на стороне кодигнитора вы можете сделать это:

<?php
$input = $this->input->post('json');
$items = unserialize($input);

$amount = 0;
foreach ($items as $item) // In case there are multiple 'items'
{
    $taxable = (isset($item['taxable']) && $item['taxable'] == 1) ? 1 : 0;

    $invoice_items = array(
        'quantity' => $item['quantity'],
        'amount' => $item['amount'],
        'work_description' => $item['work_description'],
        'taxable' => $taxable
    );

    $this->_addInvoiceItem($invoice_items); //simply adding contents to DB
}
?>

но будьте осторожны, потому что когда вы используете foreach с массивом, который содержит больше 1 уровня. Я надеюсь, что это поможет вам.

0 голосов
/ 01 марта 2011

При кодировании доц.массив как JSON становится объектом и больше не является массивом.Теперь, когда вы декодируете ваш JSON, php создает объекты вашего JSON, а не ассоциациюмассив.

0 голосов
/ 01 марта 2011

Попробуйте это<input type="hidden" name=json value='<?=$json?>' /> или это<input type="hidden" name=json value='<?=str_replace('\'', '&#039;', $json)?>' />См htmlspecialchars

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...