如何解决从直到日期和时间mysql的阅读?

问题描述 投票:0回答:1

在我的testpage上我有2个bootstrap日期时间选择器。当用户选择开始日期/时间和结束日期/时间并按下按钮时,屏幕将被来自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;
php html mysql
1个回答
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并将日期时间字符串作为参数传递。

© www.soinside.com 2019 - 2024. All rights reserved.