2014-11-08 74 views
0

我有这样的PHP代码从数据库activity获取数据:获取数据,并创建所需的JSON格式

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浏览器控制台复制),你可以看到,我有一个从一些日期两条记录(0-1),我希望把同一个对象所以是这样的:

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

另外我还有一个问题,我现在可以如何使用这个元素becouse我需要在html代码中:timestamp_day?

而且日期是不要有我的东东摆在JSON所以记录是这样的:

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

一些想法?

回答

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 

附:您应该使用准备好的语句而不是变量替换。

下面介绍如何通过每天使用准备好的语句和组它:

$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,名称:'没有数据'} – 2014-11-08 17:59:48

+0

我可以在这里使用间隔,以检查timestamp_day的日间隔不是每一秒... – 2014-11-08 18:04:19