在我的测试页上,我有2个引导日期时间选择器。 当用户选择开始日期/时间和结束日期/时间并按下按钮时,屏幕将被来自sql数据库的数据填充。 但是我在正确的时间阅读有困难,日期没有问题。
我所拥有的代码是这个。
$date=$_POST['q'];
$date=explode(' ',$date);
echo "Date".': '.$date[0]."<br/>";
echo "Time".': '.$date[1]."<br/>";
$date1=$_POST['q1'];
$date1=explode(' ',$date1);
echo "Date".': '.$date1[0]."<br/>";
echo "Time".': '.$date1[1]."<br/>";
$a1 = $_POST['a1'];
$q = $date[0];
$q1 = $date1[0];
$q2 = $date[1];
$q3 = $date1[1];
$query = mysqli_query($conn,"SELECT *
FROM `metingen`
WHERE (Datum >= '$q' AND Datum <= '$q1')
and (Tijd >= '$q2' AND Tijd <= '$q3')
ORDER BY Id DESC");
它不是漂亮的,但是没有tijd(时间),它的工作很棒,因为tijd(时间)我想念数据。
我看到的日期和时间是分开的,因为我要使用的数据库不是我自己创建的,所以日期是一个单独的列,时间也是一个单独的,而且都是文本。
如果我回显爆炸日期/时间,请参阅:
Date: 15-02-2019
Time: 01:00:32
Date: 16-02-2019
Time: 22:55:33
但是我得到的数据是从15-2-2019 00:30:56到15-2-2019 22:11:08
我没有看到我错过的所有日期(从16开始),而且日期早于开始时间。
我认为我的sql规则有问题,但是,我不知道是什么。 有人可以帮我吗?
这是我在表中的创建和插入代码(我简短地将其简称)。:
CREATE TABLE `metingen` (
`Id` int(11) NOT NULL,
`Datum` varchar(255) DEFAULT NULL,
`Tijd` varchar(255) DEFAULT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Gegevens worden geëxporteerd voor tabel `metingen`
--
INSERT INTO `metingen` (`Id`, `Datum`, `Tijd`) VALUES
(1, '17-1-2019', '10:31:39'),
(4, '18-1-2019', '10:30:01'),
(40, '28-1-2019', '23:59:42'),
(41, '28-1-2019', '00:50:12'),
(42, '29-1-2019', '02:00:42'),
(49, '29-1-2019', '06:22:53'),
(56, '5-2-2019', '19:35:02'),
(236, '13-2-2019', '13:58:43')
ALTER TABLE `metingen`
ADD KEY `Id` (`Id`);
ALTER TABLE `metingen`
MODIFY `Id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=319;
答案 0 :(得分:1)
您不应将日期和时间存储为数据库中的单独字段。您应该将它们组合到数据库中的一个datetime
字段中。然后,您应该在supported literal formats之一(例如YYYY-MM-DD H:m:s
现在回到您的原始状态。问题在于,当表的日期严格位于两个极端日期(不等于它们中的任何一个)之间时,您还需要时间条件。在这种情况下,时间部分就没有限制:在这种日子,所有时间都可以。
这是SQL的外观:
SELECT *
FROM metingen
WHERE ( Datum > '$q' OR ( Datum = '$q' AND Tijd >= '$q2' ) )
AND ( Datum < '$q1' OR ( Datum = '$q1' AND Tijd <= '$q3' ) )
ORDER BY Id DESC
但是,这又不是最佳实践。
如果您使用varchar
格式将日期存储为date
(而不是D-M-YYYY
),而您的输入是DD-MM-YYYY
,则日期变得更加复杂(而且很慢):
SELECT *
FROM metingen
WHERE ( STR_TO_DATE(Datum, '%d-%m-%Y') > STR_TO_DATE('$q', '%d-%m-%Y')
OR ( STR_TO_DATE(Datum, '%d-%m-%Y') = STR_TO_DATE('$q', '%d-%m-%Y')
AND Tijd >= '$q2' ) )
AND ( STR_TO_DATE(Datum, '%d-%m-%Y') < STR_TO_DATE('$q1', '%d-%m-%Y')
OR ( STR_TO_DATE(Datum, '%d-%m-%Y') = STR_TO_DATE('$q1', '%d-%m-%Y')
AND Tijd <= '$q3' ) )
ORDER BY Id DESC
另一个问题是您插入了发布到页面的字符串,因此它们是用户驱动的。这代表SQL Injection vulnerabilty。相反,您应该使用prepared statements并将日期时间字符串作为参数传递。