매장 정보와 개인 거래로 가득 찬 데이터베이스가 있습니다. 두 개의 웹 페이지가 있습니다. 하나는 상점 이름에 대한 사용자 입력을 받고 해당 상점에 대한 모든 트랜잭션 정보를 가져 오는 쿼리를 실행합니다. 시작 날짜와 종료 날짜를 입력 한 다음 해당 날짜 사이의 트랜잭션에 대한 쿼리를 실행하는 거의 동일한 다른 페이지가 있습니다. 상점 이름에 대한 것은 완벽하게 작동하지만 날짜에 대한 것은 아무것도 표시하지 않습니다. 나는 여전히 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>
이러한 종류의 문제는 일반적으로 잘못된 형식의 날짜로 인해 발생합니다.
내가 제대로 읽고 있다면 쿼리는 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
.
귀하의 질문에 게르만은 이것이다 : MySQL은 %2016-5-5%
(퍼센트 기호로) 날짜 로 변환 할 수 없습니다 .
MySQL이 날짜를 변환 할 수 없으면 NULL이 표시됩니다. NULL 값과의 비교는 이상 합니다. 그리고, Hunter S. Thompson의 불멸의 말에서, "가는 것이 이상 해지면, 이상한 턴 프로" . NULL 기이함은 아마도 당신이 보여준 쿼리에서 빈 결과 집합의 근본 원인 일 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다