php - 如何修复mysql从till到日期和时间的读取?

标签 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(time) 它工作得很好,有 tijd(time) 我错过了数据。

我分割的日期和时间,如你所见,因为我要使用的数据库不是我制作的,所以日期是一个单独的列,时间也是一个单独的列,两者都是文本。

如果我回显爆炸日期/时间,请参阅:

Date: 15-02-2019
Time: 01:00:32
Date: 16-02-2019
Time: 22:55:33

但是我得到的数据是从2019年2月15日00:30:56到2019年2月15日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;

最佳答案

您不应将日期和时间作为单独的字段存储在数据库中。你应该将它们组合成一个 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

另一个问题是您注入(inject)发布到页面的字符串,因此它们是用户驱动的。这代表SQL Injection vulnerabilty 。相反,您应该使用 prepared statements并将日期时间字符串作为参数传递。

关于php - 如何修复mysql从till到日期和时间的读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54721775/

相关文章:

php - 搜索最多的词 MYSQL

php - 如何在 HTML 中显示日语字符串?

javascript - 如何定义CSS :hover state in a jQuery selector?

PHP 表。在新组之前显示总计

mysql - 从子查询中选择id,包含子查询永远耗时,而包含子查询的子查询速度很快

PHPExcel 发生超时

php - 我应该如何处理消息 "Deprecated: Function eregi() is deprecated..."?

css - 如何将第一个 div float 到左侧,将第二个 div float 到右侧?

html - 将文本与字形对齐

mysql - 将 Firebird 数据库导出到 sql