2014-10-16 3 views
0

Hy парней и девушек :). Вот моя проблема. У меня есть две таблицы в базе данных (пользователи и комментарии). Один пользователь может отправлять 1 или более комментариев. Я хочу получить данные из базы данных в формате JSON. Когда я retrive данные, я форматировать как этотСоздайте JSON в PHP

[{"username":"kurtMarko","message":"Kako si mama"},{"username":"kurtMarko","message":"kako si tata"},{"username":"kurtMarko","message":"kako si brate"},{"username":"kurtMarko","message":"kako si sestro"}] 

, но я хочу, чтобы retrive данные, такие как

[{"username":"kurtMarko","message":[{"Kako si mama"},{"kako si tata"},{"kako si brate"},{"kako si sestro"}]] 

У вас есть какие-либо идеи, предложения. Каждый комментарий мне поможет. Большое спасибо. Вот мой код

require("config.inc.php"); 
$query = "SELECT comments.message, users.username 
      FROM comments 
      LEFT JOIN users ON users.username = comments.username"; 

try { 

    $stmt = $db->prepare($query); 
    $result = $stmt->execute(); 

} catch(PDOException $ex){ 

    $response["success"] = 0; 
    $response["message"] = "Database Error!"; 
    die(json_encode($response)); 

} 

$rows = $stmt->fetchAll(); 
if ($rows) { 
    $response = array(); 
    foreach ($rows as $row) { 
     $post["username"]= $row["username"]; 
     $post["message"] = $row["message"]; 
     array_push($response, $post); 
    } 
    echo json_encode($response); 
} else { 
    $response["success"] = 0; 
    $response["message"] = "No Post Available!"; 
    die(json_encode($response)); 
} 
+2

'{" Kako si mama "}, {" kako si tata "}' это не json, и вы не можете создать его 'json_encode'. Только путем прямой манипуляции со строкой. – Cheery

+0

@Cheery Хороший улов. Вероятно, он имел в виду «Како си маму», «како си тать» как элементы массива строк, а не как объекты. ОП вы можете подтвердить/опровергнуть? – thatidiotguy

+0

JSON требует пару {ключ: значение}, поэтому {ключ} недействителен. Я хотел бы иметь ваши строки только в массиве: '[« Како си мама »,« како си тата »,« како си брата »,« како си сестро »]. Библиотека json должна быть в состоянии сделать это за вас. – NuclearPeon

ответ

1

Вы должны сделать различные массив для этого, как это показано ниже:

$response = array(); 
foreach ($rows as $row) { 
    $response[$row["username"]]['message'][] = $row["message"] 
} 
echo json_encode($response); 

Может быть, у вас есть для инициализации первый

+0

Выглядит хорошо, но что, если я хочу JSONArray, где у меня будет для каждого ключа сообщения для этого сообщения? Теперь он печатает «сообщение»: «message»: [«Kako si mama», «kako si tata», «kako si brate», «kako si sestro»]. Что вы измените в коде, чтобы печатать '' сообщения: [{"message": "Kako si mama"}, {"message": "kako si tata"}, {"message": "kako si brate"}, { «message»: «kako si sestro»}] '. У вас есть идеи? –

+0

Как вы можете видеть здесь: http: // ideone.com/fork/Mx3qGq, это работа, возможно, в вашем массиве $ rows есть что-то другое, используйте print_r(), чтобы проверить! –

0

желаемая структура БД делает это трудно. Поскольку имя пользователя не является ключом в массиве, вам придется многократно искать весь массив, чтобы найти WHERE конкретное имя пользователя, просто чтобы вы могли добавить новое сообщение под этим пользователем. Почему бы не иметь вместо этого:

$arr = array(); 
foreach($rows as $row) { 
    $user = $row['username']; 
    $msg = $row['message']; 
    $arr[$user][] = $msg; 
} 

Это даст вам:

Array (
    'Fred' => array('msg1', 'msg2', 'msg3'); 
    'Susie' => array('msg4', 'msg5', ....) 
); 
+0

возвращает null. Что-то вроде []. –

0

Честно говоря, первая версия, которая вам не нравится, на самом деле является лучшей.

Вы хотите группировать записи по объектам.

Если значения повторяются, это не проблема, это не повредит.

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

В этом весь смысл json (JavaScript Объект Обозначение), в вашем примере каждый комментарий представляет объект, и это идеальный граф объектов, не изменяйте его.

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