2015-10-31 2 views
1

У меня есть таблица в моей базе данных сервера со следующими столбцами:Создание JSON с конкретным форматом, используя PHP

|---category--|---name---|---description---| 

Таким образом, позволяет сказать, например, что мы имеем следующие данные внутри таблицы:

|---CategoryA--|---name1---|---description1---| 
|---categoryB--|---name2---|---description2---| 
|---categoryA--|---name3---|---description3---| 
|---categoryA--|---name4---|---description4---| 

Я хотел бы создать .php-файл, и когда я позвоню ему из своего Android-приложения, я бы хотел получить JSON в качестве ответа. Файл JSON хотел бы иметь следующий формат:

{ 
"CategoryA":[ 
{"name":"name1","description":"description1"}, 
{"name":"name3","description":"description3"}, 
{"name":"name4","description":"description4"} 
], 
"KatigotiaB":[ 
{"name":"name2","description":"description2"} 
] 
} 

Я создал .php файл, который возвращает мне данные в формате JSON, но не в определенном формате, я хочу. Вот мой .php файл:

<?php 
    header('content-type: text/html; charset=utf-8'); 
    try { 
     $pdo = new PDO('mysql:host=****;dbname=****', '****', '****', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 
     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } catch(PDOException $e) { 
     echo 'ERROR: ' . $e->getMessage(); 
    } 

    $stmt = $pdo->prepare("SELECT * FROM `db`.`table`;"); 
    $stmt->execute(); 

    $results = array(); 

    while ($obj = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     array_push($results, $obj); 
    } 

    function replace_unicode_escape_sequence($match) { 
     return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UTF-16BE'); 
    } 

    $str = preg_replace_callback('/\\\\u([0-9a-f]{4})/i', 'replace_unicode_escape_sequence', json_encode($results)); 


    echo $str; 
?> 

и результат:

[{"category":"CategoryA","name":"name1","description":"description1"}, 
{"category":"CategoryB","name":"name2","description":"description2"}, 
{"category":"CategoryA","name":"name3","description":"description3"}, 
{"category":"CategoryA","name":"name4","description":"description4"}] 

Как я в Android разработчик и мой PHP знание ограничено, как я мог бы воссоздать свой файл .php в порядке получить правильный формат JSON?

UPDATE: , который работает

foreach ($nameDescriptionPairs as $nameDescriptionPair) { 
      $result[$row['category']][] = array(
       'name'   => $nameDescriptionPair['name'], 
       'description' => $nameDescriptionPair['description'] 
      ); 

     } 

ответ

0

Решение # 1 (простой):

<?php 
$host = 'localhost'; 
$database = '******'; 
$user = '******'; 
$password = '******'; 

$result = []; 
try { 
    $pdo = new PDO(
     "mysql:host=$host; dbname=$database;", 
     $user, 
     $password, 
     [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"] 
    ); 

    $stmt = $pdo->prepare("SELECT category, name, description FROM `YOUR_TABLE_HERE`"); 
    $stmt->execute(); 

    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     $result[$row['category']][] = [ 
      'name'   => $row['name'], 
      'description' => $row['description'], 
     ]; 
    } 
} catch (Exception $e) { 
    echo 'ERROR: ' . $e->getMessage(); 
} 

header('content-type: application/json; charset=utf-8'); 
echo json_encode($result); 

Решение # 2 (вызывающая):

Одно примечание к моему коду: Я использовал преобразование шестигранного, чтобы предотвратить проблемы с кавычками. Таким образом, даже если любой столбец имеет любое число ", код будет работать нормально.

<?php 

function hexToStr($hex) { 
    $string = ''; 
    for ($charIter = 0; $charIter < strlen($hex) - 1; $charIter += 2) { 
     $string .= chr(hexdec($hex[$charIter] . $hex[$charIter + 1])); 
    } 
    return $string; 
} 

//---------------------- 

$host = 'localhost'; 
$database = '******'; 
$user = '******'; 
$password = '******'; 

$result = [];  
try { 
    $pdo = new PDO(
     "mysql:host=$host; dbname=$database;", 
     $user, 
     $password, 
     [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"] 
    ); 

     $query = <<<QUERY 
    SELECT category, CONCAT('[', GROUP_CONCAT(CONCAT('{"name":"', hex(name) , '", "description":"', hex(description) , '"}')), ']') raw_json 
    FROM `YOUR_TABLE_HERE` 
    GROUP BY category 
QUERY; 

    $stmt = $pdo->prepare($query); 
    $stmt->execute(); 

    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     $nameDescriptionPairs = json_decode($row['raw_json'], true); 
     foreach ($nameDescriptionPairs as $nameDescriptionPair) { 
      $result[$row['category']][] = [ 
       'name'   => hexToStr($nameDescriptionPair['name']), 
       'description' => hexToStr($nameDescriptionPair['description']) 
      ]; 
     } 
    } 
} catch (Exception $e) { 
    echo 'ERROR: ' . $e->getMessage(); 
} 

header('content-type: application/json; charset=utf-8'); 
echo json_encode($result); 
+0

Спасибо mate, это действительно хороший кусок кода, но, к сожалению, я получаю ошибку сервера 500. –

+0

В какой строке? будьте уверены, 'QUERY;' не имеет отступа. – Axalix

+0

Синтаксическая ошибка FATAL ERROR, неожиданная '[' на строке номер 13 [PDO :: MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"] –

0

Одной из основных проблем является вы устанавливаете тип содержимого в текст/html. Вы не печатает HTML, это должно быть установлено в формате JSON:

header('content-type: application/json; charset=utf-8'); 

Не уверен, если это имеет какой-либо эффект, но ваш обратный вызов не нужен:

$str = preg_replace_callback('/\\\\u([0-9a-f]{4})/i', 'replace_unicode_escape_sequence', json_encode($results)); 

Если вы действительно не хотите json_encode чтобы избежать юникод, используйте параметр JSON_UNESCAPED_UNICODE здесь: http://php.net/manual/en/function.json-encode.php

$str = json_encode($results, JSON_UNESCAPED_UNICODE); 

Кроме того, вы можете также использовать JSON_PRETTY_PRINT форматировать его, но разрывы строк и s uch не имеет значения для приложения, интерпретирующего JSON, если ему известно, что это JSON (какой должна быть правильная настройка типа контента).

+0

Я очень рад за ваш ответ, я исправлю свой .php-файл, поскольку я не очень хорошо знаком с использованием PHP. У вас есть идея, как я получу конкретный формат, который хотел бы иметь в качестве ответа? Спасибо –

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