2015-03-01 3 views
0

Я пытаюсь использовать JSON w/PHP для извлечения данных из базы данных MySQL и столкнулся с проблемой. Я возвращаю свою таблицу с сервера, за исключением тех случаев, когда я включаю поле «Комментарии» в свой запрос. Я проверил JSON в JSON LInt и вернулся. Запрос MySQL проверяется самостоятельно. И, глядя в firebug, я вижу SyntaxError: JSON.parse: плохой управляющий символ в строковом литерале в строке 1 столбца 184 данных JSON. Я просто получаю свой заголовок на странице. код: example.phpПроблема с получением данных MySQL с использованием JSON

<?php 

ini_set('display_errors',1); 
ini_set('display_startup_errors',1); 
error_reporting(-1); 
header("Access-Control-Allow-Origin: *"); 
header("Content-Type: application/json; charset=UTF-8"); 

$conn = new mysqli("localhost", "*****", "*****", "inventory_form"); 

$result = $conn->query("SELECT Comments, FName, LName, Eqpmnt_Brwd, Date_Taken, Brwd_Rsn, Service_Tag FROM Inventory"); 

$outp = "["; 
while($rs = $result->fetch_array(MYSQLI_ASSOC)) { 
    if ($outp != "[") {$outp .= ",";} 
    $outp .= '{"Comments":"' . $rs["Comments"] . '",'; 
    $outp .= '"FirstName":"' . $rs["FName"] . '",'; 
    $outp .= '"Eqpmnt_Brwd":"'. $rs["Eqpmnt_Brwd"]  . '",'; 
    $outp .= '"Date_Taken":"'. $rs["Date_Taken"]  . '",'; 
    $outp .= '"Brwd_Rsn":"'. $rs["Brwd_Rsn"]  . '",'; 
    $outp .= '"ServiceTag":"'. $rs["Service_Tag"]  . '"}'; 
} 
$outp .="]"; 

$conn->close(); 

echo($outp); 
?> 

index.html:

<!DOCTYPE html> 
<html> 

<head> 
<style> 
h1 { 
    border-bottom: 3px solid #cc9900; 
    color: #996600; 
    font-size: 30px; 
} 
table, th , td { 
    border: 1px solid grey; 
    border-collapse: collapse; 
    padding: 5px; 
} 
table tr:nth-child(odd) { 
    background-color: #f1f1f1; 
} 
table tr:nth-child(even) { 
    background-color: #ffffff; 
} 
</style> 
</head> 

<body> 

<h1>SHS Inventory Form</h1> 
<div id="id01"></div> 

<script> 
var xmlhttp = new XMLHttpRequest(); 
var url = "inventory_table.php"; 

xmlhttp.onreadystatechange=function() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
     myFunction(xmlhttp.responseText); 
    } 
} 
xmlhttp.open("GET", url, true); 
xmlhttp.send(); 

function myFunction(response) { 
    var arr = JSON.parse(response); 
    var i; 
    var out = "<table>"; 

    for(i = 0; i < arr.length; i++) { 
     out += "<tr><td>" + 
     arr[i].Comments + 
     "</td><td>" + 
     arr[i].FirstName + 
     "</td><td>" + 
     arr[i].Eqpmnt_Brwd + 
     "</td><td>" + 
     arr[i].Date_Taken + 
     "</td><td>" + 
     arr[i].Brwd_Rsn + 
     "</td><td>" + 
     arr[i].ServiceTag + 
     "</td></tr>"; 
    } 
    out += "</table>" 
    document.getElementById("id01").innerHTML = out; 
} 
</script> 

</body> 
</html> 

и образец текста ответа является:

"[{"Comments":"","FirstName":"Nadine","Eqpmnt_Brwd":"Apple Video Dongle","Date_Taken":"2014-09-05","Brwd_Rsn":"Returned","ServiceTag":""},{"Comments":"Wants to check out hovercam. Can retrieve it if anyone needs a hovercam.","FirstName":"Nicole ","Eqpmnt_Brwd":"Hovercam","Date_Taken":"2014-09-04","Brwd_Rsn":"Borrowed","ServiceTag":"075642"},{"Comments":"with SD card All six cameras borrowed on 9/8/14 will be used throughout that school week.Expected return date is Monday 9/15/14","FirstName":"George","Eqpmnt_Brwd":"Nikon D3100 Camera","Date_Taken":"2014-09-08","Brwd_Rsn":"Borrowed","ServiceTag":"074753"},{"Comments":"w/ SD card " 

Есть ли проблема с некоторыми из текста в поле «Комментарии» требуется экранирование? Я смотрел онлайн, но не мог найти много на эту тему. Поймите, вы, вероятно, должны использовать PDO для этого, но примеры удачи. Я буду работать над этим, как только я вернусь к этому примеру.

+2

Не пытайтесь создавать JSON вручную, вот что 'json_encode' для. Поместите все в массив и закодируйте его. – Barmar

+0

не могли бы вы привести пример, пожалуйста. – alan

+0

Возможный дубликат [Удаление последней запятой внутри цикла while - PHP] (http://stackoverflow.com/questions/25676956/removing-last-comma-within-while-loop-php) – Barmar

ответ

1

Как @Barmar сказал использовать json_encode вместо того, чтобы пытаться построить строку JSON вручную. Например:

$data = array(); 
while($rs = $result->fetch_array(MYSQLI_ASSOC)) { 
    $data[] = $rs; 
} 
$conn->close(); 

echo json_encode($data); 

В ответ на Ваш комментарий/вопрос о PDO ... С PDO вы можете упростить это с помощью PDOStatement::fetchAll:

$pdo = new PDO($dsn, $user, $pass); 
$stmt = $pdo->query("SELECT Comments, FName, LName, Eqpmnt_Brwd, Date_Taken, Brwd_Rsn, Service_Tag FROM Inventory"); 

$data = $stmt->fetchAll(PDO::FETCH_ASSOC); 
echo json_encode($data); 
+0

Спасибо. Почти готово. Я получаю поле комментариев ok и большинство других, но поля FName & Service_Tag возвращаются не определены. Не обращайте внимания на имена полей на странице индекса html. Следует ли это реализовать с помощью PDO? или это не имеет значения. – alan

+0

Вообще говоря, я всегда лоббировал «PDO», потому что его проще в использовании. Если вы все еще находитесь в стадии своего проекта, где вы можете переключиться, то я бы порекомендовал его. Но я бы не использовал «PDO» для некоторых вещей, а «Mysqli» для других - оставался последовательным. – prodigitalson

Смежные вопросы