在我的MySQL数据库中,我有许多日期格式为08/31/2017的记录,在MySQL列中保存为“text”。
在我的html& PHP脚本,我使用所有这些日期作为下拉选择在HTML中使用以下脚本工作正常,我将其保存在
<select name='day'>
并且在我的php脚本中,如果最初没有设置,我使用以下内容来选择日期..
$day = isset($_GET['day']) ? $_GET['day']:'08/31/2017';
在mysql查询中,我使用以下内容并且查询无法正常工作..
$result=$dbconnect->query("SELECT * FROM testtable where (`HR` = $hr and `DAY` = $day) ORDER BY `HR` DESC");
请帮助什么是不对的..如果我不在查询中使用日期,我的脚本工作正常..
答案 0 :(得分:0)
尝试在查询中的'
变量周围添加引号($day
),因为它是字符串值,
如下所示: -
$result=$dbconnect->query("SELECT * FROM testtable where (`HR` = $hr and `DAY` = '$day') ORDER BY `HR` DESC");
答案 1 :(得分:0)
将数据类型更改为date
以查找MySQL中的日期条目。
然后在您的PHP代码中,执行以下操作:
$date1 = date_create($_GET['day']);
$date = date_format($date1, 'm/d/Y');
然后将其传递给您的查询。
强烈建议使用预先准备好的陈述
答案 2 :(得分:0)
尝试此查询
SELECT * FROM testtable where (`HR` = $hr and `DAY` = DATE('$day')) ORDER BY `HR` DESC
答案 3 :(得分:0)
问题在于SQL查询,因此$ hr和$ day需要被转义引号括起来。
注意,您不应该信任用户提供的数据。处理此类数据的一种方法是使用预准备语句来避免SQL注入,但是应该根据Manual仔细考虑它们的用法:
使用预准备语句并不总是最有效的方法 执行一份声明。准备好的语句只执行一次导致 比未准备好的声明更多的客户端 - 服务器往返。
尽管如此,按OWASP:
在极少数情况下,准备好的陈述会损害绩效。什么时候 面对这种情况,最好是a)强烈 验证所有数据或b)使用a来转义所有用户提供的输入 如下所述,转义特定于您的数据库供应商的例程, 而不是使用准备好的声明。
因此,您应该验证数据,然后至少使用mysqli_real_escape_string,如下所示:
<?php
$hr = mysqli_real_escape_string($con, $_GET['hr']);
$day = mysqli_real_escape_string($con, $_GET['day']);
然后,在查询中转义包含变量$ hr和$ day的引号,如下所示:
$sql = "SELECT * FROM `date_hr` WHERE (HR=\"$hr\" and date=\"$day\") ORDER BY HR DESC";
$result = $dbconnect->query( $sql );