2016-08-16 19 views
0

谢谢你的时间。 我有两个问题,我很新。PHP MySQL计数如果谷歌图表和拉列/行数据

我想完成的是从一个统一数据库中提取数据,然后谷歌图表为我显示一个饼图。我可以得到代码来拉取数据,但它拉动了所有行,这对大多数列都是适用的,但是对于一列“isoverdue”,我只希望在行数为1时对其进行计数。我尝试过有几种不同的方式来添加if语句,但它们总是导致失败的MySQL错误。

我遇到的第二个问题是如何获得动态更新的Google代码?我已经用拉来的结果进行硬编码,但是我想知道我该怎么做,以便它不会被硬编码?也许我会需要一个新的变量,所以它会增加计数?

<?php 
$servername = "localhost"; 
$username = ""; 
$password = ""; 
$db = ""; 
$dbh = new PDO("mysql:host=$servername;dbname=$db", $username, $password); 

// Create connection 
$conn = new mysqli($servername, $username, $password, $db); 
// Check connection 
if ($conn->connect_error) { 
die("Connection failed: " . $conn->connect_error); 
} 
foreach($dbh->query('SELECT COUNT(created) FROM ost_ticket') as $opened); 
foreach($dbh->query('SELECT COUNT(closed) FROM ost_ticket') as $closed1); 
foreach($dbh->query('SELECT COUNT(isoverdue) FROM ost_ticket') as $overdue); 

echo "<tr>"; 
echo "<td>".$opened['COUNT(created)']."</td>", "<td>".$closed1['COUNT(closed)']."</td>", "<td>" .$overdue['COUNT(isoverdue)']."</td>"; 
echo "</tr>"; 

?> 


<html> 
    <head> 
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> 
<script type="text/javascript"> 
    google.charts.load('current', {'packages':['corechart']}); 
    google.charts.setOnLoadCallback(drawChart); 
    function drawChart() { 

    var data = google.visualization.arrayToDataTable([ 
     ['Status', 'Hours per Day'], 
     ['Opened', 8], 
     ['Closed', 5], 
     ['Overdue', 3], 

    ]); 

    var options = { 
     title: 'My Daily Activities' 
    }; 

    var chart = new google.visualization.PieChart(document.getElementById('piechart')); 

    chart.draw(data, options); 
    } 
    </script> 
    </head> 
    <body> 
    <div id="piechart" style="width: 900px; height: 500px;"></div> 
    </body> 
</html> 

再次感谢您抽空点评本文。

回答

0

isoverdue,尝试CASE声明...

SUM(CASE WHEN isoverdue = 1 THEN 1 ELSE 0 END)

也,你应该能够将其包含在相同的语句,
因此查询不会运行两个额外的时间。 ..

SELECT 
    COUNT(created) as created, 
    COUNT(closed) as closed, 
    SUM(CASE WHEN isoverdue = 1 THEN 1 ELSE 0 END) as isoverdue 
FROM 
    ost_ticket 

你也可以命名与as操作字段,然后使用名称来获得价值

foreach($dbh->query(...) as $results); 
$results['created'] 
+0

作为_Update dynamically_,推荐具有PHP构建JSON对象,这是从AJAX调用,然后被传递给一个谷歌的图表[数据表(https://developers.google.com/chart/interactive/docs/参考#constructor_1),类似于[最近的答案](http://stackoverflow.com/a/38955110/5090771) – WhiteHat

+0

如果在实际关闭票据之前闭列为“NULL”,那么这将起作用。由于'COUNT()'只会对非空的行进行计数,它会与'COUNT(已创建)'不同,它可能从未'NULL' – GentlemanMax

+0

谢谢,不是100%确定... – WhiteHat

0

@WhiteHat,根据关你的信息

,我应用了以下和它工作。现在我必须弄清楚谷歌图表的解析。感谢您帮忙解决问题。我添加了我的代码,以防其他人遇到类似的问题。

foreach($dbh->query('SELECT COUNT(created) FROM ost_ticket') as $opened); 
foreach($dbh->query('SELECT COUNT(closed) FROM ost_ticket') as $closed1); 
foreach($dbh->query('SELECT SUM(isoverdue) FROM ost_ticket') as $overdue) 

echo "<tr>"; 
echo "<td>".$opened['COUNT(created)']."</td>", "<td>".$closed1['COUNT(closed)']."</td>", "<td>".$overdue['SUM(isoverdue)']."</td>"; 
echo "</tr>"; 
+0

很好,_update动态部分非常简单。可能更容易将代码分离成单独的文件。让我知道你是否有麻烦... – WhiteHat

+0

谢谢。我遇到了一些麻烦,但我正在浏览您引用的链接。我创建了一个dbconnect文件并将其与其余文件分开。我从我的count.php中删除了谷歌代码,所以它也会自行运行,然后尝试使Google数据按照链接工作。 – 829