我有一个充满商店信息和个人交易的数据库。我有两个网页。一个用户输入商店名称并运行查询,提取该商店的所有交易信息。我有另一个页面几乎完全相同,它接受开始日期和结束日期的输入,然后运行查询该日期之间的事务。商店名称的一个完美,但日期的那个不显示任何东西。我还在学习html / php / sql,但我确切知道第一页是如何工作的,所以我不明白为什么同样不能用于第二页。如果有人可以帮助我,我会很感激。
这是我的第一个商店名称搜索页面。
<?php
$transaction = $_REQUEST["StoreName"];
require_once 'login.php';
$connection = mysqli_connect(
$db_hostname, $db_username,
$db_password, $db_database);
$sql = "SELECT * FROM PURCHASE WHERE StoreName LIKE '%".$transaction."%'";
$result = $connection->query($sql);
?>
Purchases Made From <?php echo $transaction ?>
<table border="2" style="width:100%">
<tr>
<th width="15%">Item Name</th>
<th width="15%">Item Price</th>
<th width="15%">Purchase Time</th>
<th width="15%">Purchase Date</th>
<th width="15%">Category</th>
<th width="15%">Rating</th>
</tr>
</table>
<?php
if($result->num_rows > 0){
// output data of each row
while($rows = $result->fetch_assoc()){ ?>
<table border="2" style="width:100%">
<tr>
<td width="15%"><?php echo $rows['ItemName']; ?></td>
<td width="15%"><?php echo $rows['ItemPrice']; ?></td>
<td width="15%"><?php echo $rows['PurchaseTime']; ?></td>
<td width="15%"><?php echo $rows['PurchaseDate']; ?></td>
<td width="15%"><?php echo $rows['PurchaseCategory']; ?></td>
<td width="15%"><?php echo $rows['Rating']; ?></td>
</tr>
<?php
}
}
?>
这是日期搜索的页面,不返回任何数据。
<?php
$startDate = $_REQUEST["StartDate"];
$endDate = $_REQUEST["EndDate"];
require_once 'login.php';
$connection = mysqli_connect(
$db_hostname, $db_username,
$db_password, $db_database);
$sql = "SELECT * FROM PURCHASE WHERE PurchaseDate BETWEEN '%".$startDate."%' and '%".$endDate."%'";
$result = $connection->query($sql);
?>
Purchases Made Between <?php echo $startDate ?> and <?php echo $endDate ?>
<table border="2" style="width:100%">
<tr>
<th width="15%">Item Name</th>
<th width="15%">Item Price</th>
<th width="15%">Purchase Time</th>
<th width="15%">Purchase Date</th>
<th width="15%">Category</th>
<th width="15%">Rating</th>
</tr>
</table>
<?php
if($result->num_rows > 0){
// output data of each row
while($rows = $result->fetch_assoc()){ ?>
<table border="2" style="width:100%">
<tr>
<td width="15%"><?php echo $rows['ItemName']; ?></td>
<td width="15%"><?php echo $rows['ItemPrice']; ?></td>
<td width="15%"><?php echo $rows['PurchaseTime']; ?></td>
<td width="15%"><?php echo $rows['PurchaseDate']; ?></td>
<td width="15%"><?php echo $rows['PurchaseCategory']; ?></td>
<td width="15%"><?php echo $rows['Rating']; ?></td>
</tr>
<?php
}
}
?>
显然,链接到这两个输出页面的初始搜索页面有所不同,但我可以确认日期输出页面正在从搜索页面接收正确的日期。
编辑:这是日期的搜索页面。
<!DOCTYPE html>
<html>
<head>
<title>Output 2</title>
</head>
<body>
<h1>Required Output 2</h1>
<h2>Transaction Search By Date</h2>
<br/>
<br/>
<form action="outputout2.php" method="get">
Start Date: <input type="date" name="StartDate">
End Date: <input type="date" name="EndDate">
<input name="Add Merchant" type="submit" value="Search">
</form>;
</body>
</html>
答案 0 :(得分:1)
这类问题通常是错误格式化日期的结果。
您的查询,如果我正确读取它,当您在php中完成组装并将其发送到SQL服务器时说:
SELECT *
FROM PURCHASE --wrong!
WHERE PurchaseDate BETWEEN '%5/1/2016%' and '%5/8/2016%'
这不起作用。
首先,%
符号仅适用于LIKE
运算符,而不适用于相等和不等运算符。
另一方面,数据库服务器软件的不同品牌和型号使用不同格式的日期字符串。 MySQL和SQL Server可以使用2016-05-01
等字符串格式正常工作。但是,您必须为您正在使用的SQL软件产品查找适当的方法。这种东西不是供应商可移植的。
第三:您的表中的PurchaseDate
列需要具有类似日期的数据类型才能使用此类事物。
第四:如果您的PurchaseDate
项是时间戳 - 也就是说,如果它有日期和时间 - 则无法可靠地使用BETWEEN
运算符。原因如下:假设您的值为2016-05-08 11:50:00
当您将其与结束日期2016-05-08
进行比较时,它会超出结束日期。所以,你真正需要的是:
WHERE PurchaseDate >= '2016-05-01'
AND PurchaseDate < '2016-05-09' -- the day AFTER your end date
该构造与BETWEEN
的执行方式相同,并且不会搞砸最后几天的数据。
编辑所以这是你正在使用的MySQL。
Workbench是一个客户端程序。 PHP也是如此。服务器是MySQL。当您执行类似
的操作时 DateColumn < 'string constant'
MySQL隐式地将string constant
转换为日期。如果字符串常量的格式足够接近ISO 8601,服务器可以找出它的含义,它将转换它。 2016-12-13
完全正确。 2016-5-31
足够接近MySQL,2016-5-5
也是如此。 2016/12/31
不起作用。 5/5/16
也没有。
Germane对你的问题是:MySQL无法将%2016-5-5%
(百分号)转换为日期。
当MySQL无法转换日期时,它会出现NULL。 Comparisons with NULL values are weird。并且,在Hunter S. Thompson的不朽言辞中,"when the going gets weird, the weird turn pro"。 NULL怪异可能是您显示的查询中空结果集的根本原因。