2015-12-07 1 views
0

Идея здесь в том, чтобы автоматически загружать (или загружать) мою индексную страницу с некоторыми продуктами из таблицы базы данных MySQL.JavaScript не может найти данные JSON от PHP json_encode

Во-первых, мой PHP.

<?php 
header('Content-Type: application/json'); 
require_once 'classloader.php'; 
$db = new Database(); 

$items = $db->getRows('SELECT * FROM products'); 

foreach($items as $eachItem){ 
    $itemsJSON = new Item($eachItem->product_name, $eachItem->product_quantity, $eachItem->product_cost); 
    echo json_encode($itemsJSON); 
} 

Это, кажется, отлично работает и дает мне два правильно закодированных объекта JSON моего класса Item.

{"name":"Slippers","quantity":"3","cost":"4.00"} 
{"name":"Gloves","quantity":"5","cost":"9.00"} 

My JavaScript выглядит следующим образом (и многие другие подобные вариации)

$(document).ready(function() { 
    $.post("productloader.php", function(data) { 
     $("#result").html(data); 
    }); 
}); 

Я не знаю, почему он не работает. Я не хотел использовать $.getJSON(), потому что нет строки запроса для работы, поэтому я предполагаю, что мне понадобится $.post().

Кажется, что это довольно распространенная проблема, но я пока не нашел решение. Любая помощь будет оценена по достоинству. Спасибо.

+0

Вы смотрели AJAX запрос/ответ в консоли браузера? Есть ли ошибки? –

+0

Как только запрос AJAX получает первый успешный результат из 'echo json_encode ($ itemsJSON);', он перестает прослушивать ответ, и все последующие итерации вашего цикла foreach будут проигнорированы (в JavaScript). Вам нужно добавить каждый элемент в массив, а затем вернуть полный массив 'json_encode()' ed. – War10ck

+0

Я не думаю, что вы должны иметь это внутри цикла: 'json_encode ($ itemsJSON)' - он должен быть снаружи. – andre3wap

ответ

5

Вы не можете json_encode() каждый товар отдельно. Данные, которые вы отправляете в браузер, недействительны JSON, всего несколько небольших кусков действительного JSON один за другим. Создайте массив внутри вашего цикла, а затем закодируйте все это. Смотрите также http://jsonlint.com/

<?php 
header('Content-Type: application/json'); 
require_once 'classloader.php'; 
$db = new Database(); 

$items = $db->getRows('SELECT * FROM products'); 

foreach($items as $eachItem){  
    $itemsJSON[] = new Item($eachItem->product_name, $eachItem->product_quantity, $eachItem->product_cost); 
} 

echo json_encode($itemsJSON); 
2

В вашем методе AJAX, вы выводите множественным JSON строк в то время как сторона JS ожидает 1 строку (data). Попробуйте удалить ваш цикл просто:

echo json_encode($items); 
1

Вы создаете JSON для каждой строки, так что вы получаете отдельные объекты JSON для каждой строки в передней части.

Вы должны поместить всю строку в массив и создать и создать объект JSON вне цикла, а также эхо кодировать строку JSON.

<?php 
    $allitem = $db->getRows('SELECT * FROM products'); 
    $itemArr=array(); 
    foreach($allitem as $item){  
     array_push($itemArr , new Item($item->product_name, $item->product_quantity, $item->product_cost)); 
    } 

    echo json_encode($itemArr); 
?> 

или

$allitem = $db->getRows('SELECT * FROM products'); 
    echo json_encode($allitem); 
Смежные вопросы