如何解决从时至今日的mysql读取问题?

时间:2019-02-16 09:45:35

标签: php html mysql

在我的测试页上,我有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;

1 个答案:

答案 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并将日期时间字符串作为参数传递。