Почему json не действителен?

Я хочу сделать json-запрос с jquery для заполнения текстовой области wysihtml5, но она не работает

$("#calendarAnchor").click(function(event) {
$.getJSON( "php/databaseHandler.php?action=GET_DATE_DETAILS&day=1&month=11&year=2014&username=bd107a66ba", function( json ) {
alert( "JSON Data: " + json ); // not executed
});
});

Когда я помещаю свой JSON в JSONLint, то это не проверяет

({'id': '1124','day': '1','month': '11','year': '2014','red_day': 'ja','name_day': ['Allhelgona'],'images':[{'id': '2','url': 'svala_mini15.png','description': 'Idag är det soligt','category_id': '1','slot_id': '0'},{'id': '1','url': 'img/arstider/host/Flyttfagel_sadesarla_mini15.png','description': 'Idag regnar det, men vi har kul ändå!','category_id': '1','slot_id': '1'}],'holidays':[{'id': '1','name': 'Allhelgon','description': 'Nu firar man!'}],'dateDescription':[{'description': 'Idag!'}]})

Почему JSON не действителен? Должен ли я изменить вывод или использовать jquery каким-либо другим способом для чтения полей? PHP, который выводит JSON

function getDateDetails($day, $month, $year, $username, $db){
$sql = <<<SQL
SELECT calendar_dates.id,
calendar_dates.day,
calendar_dates.month,
calendar_dates.year,
calendar_dates.name_day,
calendar_dates.red_day
FROM calendar_dates
WHERE calendar_dates.day=$day
AND calendar_dates.month=$month
AND calendar_dates.year=$year
SQL;

$ret = "{";
$isFirst = true;

if(!$result = $db->query($sql)){
die('There was an error running the query [' . $db->error . ']');
}

while($row = $result->fetch_assoc()){
if($isFirst){
$names = join("','", array_filter(explode(";", "'" . $row['name_day'] . "'")));
$imagesJson = getImagesJson($row['id'], $username, $db);
$holidaysJson = getHolidaysJson($row['id'], $username, $db);
$dateDescriptionJson = getDateDescriptionJson($row['id'], $username, $db);

$ret .= "'id': '" . $row['id'] . "',";
$ret .= "'day': '" . $row['day'] . "',";
$ret .= "'month': '" . $row['month'] . "',";
$ret .= "'year': '" . $row['year'] . "',";
$ret .= "'red_day': '" . $row['red_day'] . "',";
$ret .= "'name_day': [";$ret .= $names;
$ret .= "],";
$ret .= "'images':";
$ret .= $imagesJson . ",";
$ret .= "'holidays':";
$ret .= $holidaysJson . ",";
$ret .= "'dateDescription':";
$ret .= $dateDescriptionJson . ",";
$isFirst = false;
}

}

$ret = rtrim($ret, ",");
$ret .= "}";

return($ret);
}

Обновить

С помощью Дейва это действительно JSON

{
"id": "1124",
"day": "1",
"month": "11",
"year": "2014",
"red_day": "ja",
"name_day": [
"Allhelgon "],
"images": [
{
"id": "2",
"url": "mini15.png",
"description": "Idag är det soligt!",
"category_id": "1",
"slot_id": "0"},
{
"id": "1",
"url": "sadesarla_mini15.png",
"description": "Idag regnar det!",
"category_id": "1",
"slot_id": "1"}
],
"holidays": [
{
"id": "1",
"name": "Allhelgon",
"description": "Nu!"}
],
"dateDescription": [
{
"description": "Idag!"}
]
}

Мой новый PHP (все еще инъекция уязвима от users.username = '$username' ?) является

function getDateDescription($dateId, $username, $db){
$sql = <<<SQL
SELECT calendar_date_description.description
FROM calendar_date_description
INNER JOIN calendar_users
ON calendar_users.username = '$username'
WHERE calendar_date_description.user_id= calendar_users.id
AND calendar_date_description.date_id = $dateId
SQL;

$ret = "[";
$description ="";
if(!$result = $db->query($sql)){
die('There was an error running the query [' . $db->error . ']');
}

while($row = $result->fetch_assoc()){
$description = $row['description'];
}

return($description);
}

function getDateDetails($day, $month, $year, $username, $db){

$sql = <<<SQL
SELECT calendar_dates.id,
calendar_dates.day,
calendar_dates.month,
calendar_dates.year,
calendar_dates.name_day,
calendar_dates.red_day
FROM calendar_dates
WHERE calendar_dates.day=$day
AND calendar_dates.month=$month
AND calendar_dates.year=$year
SQL;

//$ret = "{";
$isFirst = true;

if(!$result = $db->query($sql)){
die('There was an error running the query [' . $db->error . ']');
}

$ret = array();

while ($row = $result->fetch_assoc()) {
$names               = array_filter(explode(";", $row['name_day']));
$dateDescriptionJson = getDateDescription($row['id'], $username, $db);

$ret = array(
'id'              => $row['id'],
'day'             => $row['day'],
'month'           => $row['month'],
'year'            => $row['year'],
'red_day'         => $row['red_day'],
'name_day'        => $names,
'dateDescription' => $dateDescriptionJson
);
}

$ret = json_encode($ret);

return ($ret);
}

0

Решение

Я рад, что помог, но на самом деле я рекомендовал json_encode. Проблема заключается в одинарных кавычках, но основная проблема заключается в том, что вы создаете эту сложную строку JSON вручную. Иногда я делаю это, но только в крайне редких случаях, таких как строки одного уровня JSON, {"error":"true"}, но это не так для вас.

Пожалуйста, попробуйте этот метод вместо:

$ret = array();

while ($row = $result->fetch_assoc()) {
$names               = array_filter(explode(";", $row['name_day']));
$imagesJson          = getImages($row['id'], $username, $db);
$holidaysJson        = getHolidays($row['id'], $username, $db);
$dateDescriptionJson = getDateDescription($row['id'], $username, $db);

$ret = array(
'id'              => $row['id'],
'day'             => $row['day'],
'month'           => $row['month'],
'year'            => $row['year'],
'red_day'         => $row['red_day'],
'name_day'        => $names,
'images'          => $imagesJson,
'holidays'        => $holidaysJson,
'dateDescription' => $dateDescriptionJson
);
}

$ret = json_encode($ret);

return ($ret);

я мог бы высоко рекомендуем хранить все в формате массива PHP, затем, когда данные будут готовы для вывода клиенту, затем выполнить окончательный код json_encode.

Так что это будет означать:

getImagesJson       -> getImages
getHolidaysJson     -> getHolidays
dateDescriptionJson -> dateDescription

Затем эти функции будут возвращать массивы PHP вместо JSON. Это позволит вам легче манипулировать данными между функциями. Просто примените те же методы к этим функциям, и это сделает вашу жизнь намного проще.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]