Получить данные из базы данных и создать необходимый формат JSON

0

У меня есть этот php-код, который извлекает данные из activity базы данных:

try {

$dateString = '09.03.2014';
$startDate = new DateTime($dateString);
$endDate = clone $startDate;
$startDate = $startDate->format("U") . PHP_EOL;
$period = new DateInterval('P1M');

$endDate->add($period);
$endDate = $endDate->format("U") . PHP_EOL;

$interval = new DateInterval('P1D');
$sql = <<<EOD
SELECT timestamp_day,name FROM activity WHERE timestamp_day BETWEEN $startDate AND $endDate
ORDER BY timestamp_day
EOD;
$data = $db->query($sql)->fetchAll(PDO::FETCH_ASSOC);
$output = ['data' => $data];
$jsonTable = json_encode($output); //$date->format("U") . PHP_EOL;//format your date to timestamp here


    } catch(PDOException $e) {
        echo 'ERROR: ' . $e->getMessage();
    }
    echo $jsonTable;

Этот код дает мне данные с даты на сегодняшний день, и я получаю этот JSON:

data: [{timestamp_day:1394319600, name:Meeting}, {timestamp_day:1394319600, name:Car repair},…]
0: {timestamp_day:1394319600, name:Meeting}
1: {timestamp_day:1394319600, name:Car repair}
2: {timestamp_day:1394406000, name:Travel}
3: {timestamp_day:1394492400, name:Work}
4: {timestamp_day:1394578800, name:Vacation}

(скопировано из консоли Chrome Chrome)

Теперь вы можете видеть, что у меня есть от нескольких дат две записи (0-1), и я хочу разместить один и тот же объект, чтобы это было так:

 {timestamp_day:1394319600, name:Meeting, Car repair}
 {timestamp_day:1394406000, name:Travel}
 {timestamp_day:1394492400, name:Work}
 {timestamp_day:1394578800, name:Vacation}

Также у меня есть еще один вопрос, как я могу теперь работать с этим элементом, потому что мне нужно ввести html-код: timestamp_day?

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

 {timestamp_day:1394406000, name:'<a>No data</a>'}

Некоторые идеи?

Теги:
pdo

1 ответ

2

Используйте GROUP_CONCAT для объединения значений из записей с одинаковой меткой времени:

SELECT timestamp_day, GROUP_CONCAT(name SEPARATOR ', ') AS name 
FROM activity 
WHERE timestamp_day BETWEEN $startDate AND $endDate
GROUP BY timestamp_day
ORDER BY timestamp_day

PS вы должны использовать подготовленные инструкции вместо переменной подстановки.

Здесь, как использовать подготовленный оператор и группировать его по дням:

$stmt = $db->prepare("
    SELECT DATE(FROM_UNIXTIME(timestamp_day)) AS date, GROUP_CONCAT(name SEPARATOR ', ' ORDER BY timestamp_day) AS name 
    FROM activity 
    WHERE timestamp_day BETWEEN :startDate AND :endDate
    GROUP BY date
    ORDER BY date");
$stmt->bindParam(':startDate', $startDate);
$stmt->bindParam(':endDate', $endDate);
$stmt->execute();
$data = $stmt->fetchAll();
  • 0
    Пожалуйста, покажите здесь в ответе, как использовать подготовленные операторы, а также подскажите, как добавить пустые строки, если для этого дня нет данных: {timestamp_day: 1394406000, name: '<a> Нет данных </a>'}
  • 0
    Могу ли я использовать здесь Интервал, чтобы проверить timestamp_day по дневному интервалу не каждую секунду ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню