社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

如何修复mysql从头到尾的读取?

Pascal • 5 年前 • 1131 次点击  

当用户选择开始日期/时间和结束日期/时间并按下按钮时,屏幕将由来自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");

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

如果我回显爆炸日期/时间:

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;
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53953
 
1131 次点击  
文章 [ 1 ]  |  最新文章 5 年前
trincot
Reply   •   1 楼
trincot    6 年前

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