[英]Is this MySQL query valid?
因此,当我拜访朋友时遇到了这个问题。 他正试图在表中显示其创建的数据库中的数据。
这是他要求开始和结束日期的部分:
<form method="post">
<input type="date" name="Date1" value="<?php echo $_POST['StartD'] ?>" style="position:absolute; top:2em; left:7em;">
<p style="font-family:Calibri; color:green; font-size:15px; position: absolute; top: 1em; left: 18em;">to</p>
<input type="date" name="Date2" value="<?php echo $_POST['EndD'] ?>" style="position:absolute; top:2em; left:23em;"><br />
<input type="submit" id="Sbtn" style="cursor: pointer;" name="search_projects" value="Search">
</form>
现在这是他的MySQL查询:
$sql= "SELECT * FROM statisticData WHERE accessDate LIKE '%" . $_POST['StartD'] . "%' OR accessDate LIKE '%" . $_POST['EndD'] . "%' ORDER BY accessDate ASC";
每当他选择的明星日期: 09-13-13
和结束日期: 09-13-13
,日期,如09-12-13
也出现在表格中。 我告诉他去问专业人士,他说他太害羞了。 所以我要问。
这是他的代码:
<div class="scrollableTable">
<center><table class="font1" border="3px solid white" width="70%">
<thead>
<tr id="tblRow">
<th id="tblData" width="20%">Access Date</td>
<th id="tblData" width="15%">ID number</td>
<th id="tblData" width="35%">Name</td>
<th id="tblData" width="20%">Keyword</td>
</tr>
</thead>
<?php
if ($_POST['search_projects']){
$con= mysql_connect("...","...","...") or die ('Error: ' . mysql_error());
mysql_select_db("...");
$sql= "SELECT * FROM statisticData WHERE accessDate LIKE '%" . $_POST['StartD'] . "%' AND accessDate LIKE '%" . $_POST['EndD'] . "%' ORDER BY accessDate DESC";
$result= mysql_query($sql);
while($row= mysql_fetch_object($result))
{
$Date=$row->accessDate;
$ID=$row->IDnum;
$Name=$row->Sname;
$Key=$row->keyWord;
echo "<tr>";
echo "<td>" . $Date. " </td>" . " <td>" . $ID. " </td>" . " <td>" . $Name. " </td>". " <td>" . $Key. " </td>";
echo "</tr>";
}
echo "</table>";
echo "</center>";
}
?>
</div>
他希望允许用户使用这些日期输入来浏览数据库的内容。
问题是,即使选择开始日期和结束日期,所有内容也会显示在表格中。 他的查询根本不过滤结果。 我告诉他不要睡,但他一直在烦我。 那么,您认为他应该怎么做才能最终入睡?
人的问题是名字:
$sql= "SELECT * FROM statisticData WHERE accessDate LIKE '%" . $_POST['Date1'] . "%' OR accessDate LIKE '%" . $_POST['Date2'] . "%' ORDER BY accessDate ASC";
也:
<form method="post">
<input type="date" name="Date1" value="<?php echo $_POST['Date1'] ?>" style="position:absolute; top:2em; left:7em;">
<p style="font-family:Calibri; color:green; font-size:15px; position: absolute; top: 1em; left: 18em;">to</p>
<input type="date" name="Date2" value="<?php echo $_POST['Date2'] ?>" style="position:absolute; top:2em; left:23em;"><br />
<input type="submit" id="Sbtn" style="cursor: pointer;" name="search_projects" value="Search">
</form>
更新:
<?php
if ($_POST['search_projects']){
$startDate = date("Y-m-d", strtotime($_POST['Date1']));
$endDate = date("Y-m-d", strtotime($_POST['Date2']));
$con= mysql_connect("...","...","...") or die ('Error: ' . mysql_error());
mysql_select_db("...");
$sql= "SELECT * FROM statisticData WHERE accessDate BETWEEN '$startDate' AND '$endDate' ORDER BY accessDate DESC";
$result= mysql_query($sql);
...
使用BETWEEN 。
$sql= "
SELECT *
FROM statisticData
WHERE accessDate BETWEEN '{$_POST['StartD']}' AND '{$_POST['EndD']}
ORDER BY accessDate ASC
";
并且请阅读如何防止PHP中的SQL注入?
看起来不错尝试使用这个
$sql= "SELECT * FROM statisticData WHERE accessDate LIKE '" . $_POST['StartD'] . "' OR accessDate LIKE '" . $_POST['EndD'] . "' ORDER BY accessDate ASC";
或使用
$sql= "SELECT * FROM statisticData WHERE accessDate BETWEEN '" . $_POST['StartD'] . "' AND '" . $_POST['EndD'] . "' ORDER BY accessDate ASC";
用这个
$sql= "SELECT *
FROM `statisticData`
WHERE (accessDate BETWEEN '".$_POST['StartD']."' AND '" . $_POST['EndD'] . "') ORDER BY accessDate ASC";
我认为这是一种不良做法,原因有以下三个:
1)您这里有一个SQL注入漏洞-您必须转义输入
2)如果您在数据库中使用datetime格式,但想按日期选择而不带时间-您应该使用DATE()
类的函数转换类型
3)使用LIKE
语句比精确比较要慢得多,这是您需要的BETWEEN
语句。 LIKE
主要用于仅字符串类型的数据类型
是accessDate
列的数据类型是日期时间,还是字符串? 如果是日期时间,请尝试以下操作:
'SELECT * FROM `statisticData`
WHERE (accessDate BETWEEN ' . $_POST['StartD'] . ' AND ' . $_POST['EndD']) .
'ORDER BY accessDate ASC'
它应该工作,我现在是sql guru
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.