mysql php 动态 sql 查询
mysql php dynamic sql query
编辑:编辑我的问题,因为问题自最初发布以来已经发生变化。
根据 Rajesh 的建议。我现在已经修改了 php 代码。
这是新的代码,但是还是不行。
基本上我想运行同一个查询多次,但每次都会按不同的列分组。
这是我正在使用的代码。
<?php
$servername = "localhost";
$username = "user";
$password = "pass";
try {
$objDatabase = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
$objDatabase->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
?>
<?php
//Process the GET data received from the previous page.
$custo = $_GET["Customer"];
$startdate = $_GET["fromdate"];
$enddate = $_GET["enddate"];
$stdate = date("Y-m-d", strtotime($startdate));
$endate = date("Y-m-d", strtotime($enddate));
$basequery = "SELECT cust, manu, model, serial, capacity, firmware, method, date, stime, etime, wks, result, COUNT(*) AS total FROM hdds WHERE cust = '".$custo."' and `date` >= '".$stdate."' and `date` <= '".$endate."'";
$retval = mysql_query( $basequery, $conn );
if(! $retval )
{
die('Could not get data: ' . mysql_error());
}
?>
<? php
$type="capacity";
$typeQuery = $basequery." GROUP BY ".$type;
// Perform the Query
$objDbResultByType = $objDatabase->Query($typeQuery);
echo '<div id="1000" style="display: none;">';
echo "<h3>Quality Control Checked by<br></h3><strong>";
$capacity = array();
while ($row = $objDbResultByType->FetchArray()) {
echo $row['capacity']. " = " .$row['total'];
echo "<br><strong>";
$result = "{ label: \"".$row['capacity']."\", y: " .$row['total']." },";
array_push($capacity,$result);
}
//echo $result;
$lastIndex = count($capacity)-1;
$lastValue = $capacity[$lastIndex];
$testedby[$lastIndex] = rtrim($lastValue, ',');
//Echo the capacity from array to the monitor screen.
foreach ($capacity as $result){
echo $result, '<br>';
}
?>
此代码仍然无效。它给了我一个空白屏幕。
但是如果我运行这个查询对mysql它returns的数据,查询是没有问题的。
mysql> SELECT cust, manu, model, serial, capacity, firmware, method, date, stime, etime, wks, result, COUNT(*) AS total from hdds where cust = 'Imran-ABC' and date >= '2015-08-01' and '2015-09-14' group by date;
+-----------+------------------------------------------+------------+----------+-----------------------------+----------+--------+------------+----------+----------+------+-----------+-------+
| cust | manu | model | serial | capacity | firmware | method | date | stime | etime | wks | result | total |
+-----------+------------------------------------------+------------+----------+-----------------------------+----------+--------+------------+----------+----------+------+-----------+-------+
| ABC | Seagate Barracuda 7200.7 and 7200.7 Plus | ST340014AS | 5MQ3DJPM | 40000000000 bytes [40.0 GB] | 8.12 | zero | 2015-08-26 | 18:56:29 | 18:56:29 | 89 | Succeeded | 1 |
| ABC | Seagate Barracuda 7200.7 and 7200.7 Plus | ST340014AS | 5MQ3DJPM | 40000000000 bytes [40.0 GB] | 8.12 | zero | 2015-09-01 | 18:56:29 | 18:56:29 | 89 | Succeeded | 27 |
| ABC | Seagate Barracuda 7200.7 and 7200.7 Plus | ST340014AS | 5MQ3DJPM | 40000000000 bytes [40.0 GB] | 8.12 | zero | 2015-09-02 | 20:04:19 | 20:04:19 | 36 | Succeeded | 2 |
+-----------+------------------------------------------+------------+----------+-----------------------------+----------+--------+------------+----------+----------+------+-----------+-------+
3 rows in set, 1 warning (0.00 sec)
mysql>
感谢您的帮助。提前致谢。
像下面这样定义$objDatabase
<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
try {
$objDatabase = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
$objDatabase->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
?>
使用下面的查询字符串
$basequery = "SELECT cust, manu, model, serial, capacity, firmware, method, date, stime, etime, wks, result, COUNT(*) AS total FROM hdds WHERE cust = '".$custo."' and `date` >= '".$stdate."' and `date` <= '".$endate."'";
然后你可以得到下面的$typeQuery
$type="capacity";
$typeQuery = $basequery." GROUP BY ".$type;
试一试
使用foreach
代替while
获取结果
$objDbResultByType = $objDatabase->query($typeQuery);
foreach ($objDbResultByType as $row) {
/*your code here*/
}
如果有帮助请告诉我
您需要在日期前后加上引号。你应该使用 BETWEEN
,而不是 >=
,来测试日期是否在开始日期和结束日期之间。
在AS total
之后还需要一个space;否则,查询最终会成为 COUNT(*) AS totalFROM hdds
,这会导致语法错误。
$basequery = "SELECT cust, manu, model, serial, capacity, firmware, method, date, stime, etime, wks, result, COUNT(*) AS total ".
"FROM hdds ".
"WHERE cust = '$custo' and date BETWEEN '$stdate' AND '$endate' ";
确实没有必要在每一行结束字符串。 PHP 允许您在字符串中使用换行符,因此您可以在所有行中继续字符串:
$basequery = "SELECT cust, manu, model, serial, capacity, firmware, method, date, stime, etime, wks, result, COUNT(*) AS total
FROM hdds
WHERE cust = '$custo' and date BETWEEN '$stdate' AND '$endate' ";
编辑:编辑我的问题,因为问题自最初发布以来已经发生变化。
根据 Rajesh 的建议。我现在已经修改了 php 代码。
这是新的代码,但是还是不行。
基本上我想运行同一个查询多次,但每次都会按不同的列分组。
这是我正在使用的代码。
<?php
$servername = "localhost";
$username = "user";
$password = "pass";
try {
$objDatabase = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
$objDatabase->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
?>
<?php
//Process the GET data received from the previous page.
$custo = $_GET["Customer"];
$startdate = $_GET["fromdate"];
$enddate = $_GET["enddate"];
$stdate = date("Y-m-d", strtotime($startdate));
$endate = date("Y-m-d", strtotime($enddate));
$basequery = "SELECT cust, manu, model, serial, capacity, firmware, method, date, stime, etime, wks, result, COUNT(*) AS total FROM hdds WHERE cust = '".$custo."' and `date` >= '".$stdate."' and `date` <= '".$endate."'";
$retval = mysql_query( $basequery, $conn );
if(! $retval )
{
die('Could not get data: ' . mysql_error());
}
?>
<? php
$type="capacity";
$typeQuery = $basequery." GROUP BY ".$type;
// Perform the Query
$objDbResultByType = $objDatabase->Query($typeQuery);
echo '<div id="1000" style="display: none;">';
echo "<h3>Quality Control Checked by<br></h3><strong>";
$capacity = array();
while ($row = $objDbResultByType->FetchArray()) {
echo $row['capacity']. " = " .$row['total'];
echo "<br><strong>";
$result = "{ label: \"".$row['capacity']."\", y: " .$row['total']." },";
array_push($capacity,$result);
}
//echo $result;
$lastIndex = count($capacity)-1;
$lastValue = $capacity[$lastIndex];
$testedby[$lastIndex] = rtrim($lastValue, ',');
//Echo the capacity from array to the monitor screen.
foreach ($capacity as $result){
echo $result, '<br>';
}
?>
此代码仍然无效。它给了我一个空白屏幕。
但是如果我运行这个查询对mysql它returns的数据,查询是没有问题的。
mysql> SELECT cust, manu, model, serial, capacity, firmware, method, date, stime, etime, wks, result, COUNT(*) AS total from hdds where cust = 'Imran-ABC' and date >= '2015-08-01' and '2015-09-14' group by date;
+-----------+------------------------------------------+------------+----------+-----------------------------+----------+--------+------------+----------+----------+------+-----------+-------+
| cust | manu | model | serial | capacity | firmware | method | date | stime | etime | wks | result | total |
+-----------+------------------------------------------+------------+----------+-----------------------------+----------+--------+------------+----------+----------+------+-----------+-------+
| ABC | Seagate Barracuda 7200.7 and 7200.7 Plus | ST340014AS | 5MQ3DJPM | 40000000000 bytes [40.0 GB] | 8.12 | zero | 2015-08-26 | 18:56:29 | 18:56:29 | 89 | Succeeded | 1 |
| ABC | Seagate Barracuda 7200.7 and 7200.7 Plus | ST340014AS | 5MQ3DJPM | 40000000000 bytes [40.0 GB] | 8.12 | zero | 2015-09-01 | 18:56:29 | 18:56:29 | 89 | Succeeded | 27 |
| ABC | Seagate Barracuda 7200.7 and 7200.7 Plus | ST340014AS | 5MQ3DJPM | 40000000000 bytes [40.0 GB] | 8.12 | zero | 2015-09-02 | 20:04:19 | 20:04:19 | 36 | Succeeded | 2 |
+-----------+------------------------------------------+------------+----------+-----------------------------+----------+--------+------------+----------+----------+------+-----------+-------+
3 rows in set, 1 warning (0.00 sec)
mysql>
感谢您的帮助。提前致谢。
像下面这样定义$objDatabase
<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
try {
$objDatabase = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
$objDatabase->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
?>
使用下面的查询字符串
$basequery = "SELECT cust, manu, model, serial, capacity, firmware, method, date, stime, etime, wks, result, COUNT(*) AS total FROM hdds WHERE cust = '".$custo."' and `date` >= '".$stdate."' and `date` <= '".$endate."'";
然后你可以得到下面的$typeQuery
$type="capacity";
$typeQuery = $basequery." GROUP BY ".$type;
试一试
使用foreach
代替while
$objDbResultByType = $objDatabase->query($typeQuery);
foreach ($objDbResultByType as $row) {
/*your code here*/
}
如果有帮助请告诉我
您需要在日期前后加上引号。你应该使用 BETWEEN
,而不是 >=
,来测试日期是否在开始日期和结束日期之间。
在AS total
之后还需要一个space;否则,查询最终会成为 COUNT(*) AS totalFROM hdds
,这会导致语法错误。
$basequery = "SELECT cust, manu, model, serial, capacity, firmware, method, date, stime, etime, wks, result, COUNT(*) AS total ".
"FROM hdds ".
"WHERE cust = '$custo' and date BETWEEN '$stdate' AND '$endate' ";
确实没有必要在每一行结束字符串。 PHP 允许您在字符串中使用换行符,因此您可以在所有行中继续字符串:
$basequery = "SELECT cust, manu, model, serial, capacity, firmware, method, date, stime, etime, wks, result, COUNT(*) AS total
FROM hdds
WHERE cust = '$custo' and date BETWEEN '$stdate' AND '$endate' ";