在这里,我得到了答案。
我只需将track_reports.php更改为:
if (isset($_POST['chkOtdate']))
{
$date_from = $_POST['date_from'];
$date_to = $_POST['date_to'];
if (empty($bagianWhere))
{
$bagianWhere .= "ot_date between '$date_from' and '$date_to'";
}
else
{
$bagianWhere .= " AND ot_date between '$date_from' and '$date_to'";
}
}
现在没有任何问题,代码可以顺利运行。 谢谢你的帮助朋友。 感谢您的建议和意见。
我的代码出现问题:
我们可以根据badge_id,employee_name和ot_date(带范围)查看报告。
当我试图找到使用badge_id和employee_name没问题时,数据显示。但是当我试图找到使用日期范围时,发现错误。错误是:: mysql_fetch_array() expects parameter 1 to be resource, boolean given in on line WarningC:\xampp\htdocs\siix_dev\overtime\track_reports.php327
<form method="post" action="track_reports.php" name="form">
<table id="mytable">
<tr>
<td>
<input type="checkbox" name="chkBadge" onClick="apply(this.checked, 'textBox')"> <font class="category">Badge ID</font>
</td>
<td>
<input id="textBox" class="text sign" type="text" name="badge_id">
</td>
</tr>
<tr>
<td>
<input type="checkbox" name="chkEmp" onClick="apply(this.checked, 'textBox2')"> <font class="category">Employee Name</font>
</td>
<td>
<input id="textBox2" class="text sign" type="text" name="employee_name">
</td>
</tr>
<tr>
<td>
<input id="myCheckBox" type="checkbox" name="chkOtdate" onClick="apply(this.checked, 'textBox3')" onChange="apply(this.checked, 'textBox4')"> <font class="category">OT Date</font>
</td>
<td>
<font class="category">From</font> <input id="textBox3" class="text sign" type="text" name="date_from" ><font class="category"> To</font> <input id="textBox4" class="text sign" type="text" name="date_to" >
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" name="submit" value="Submit">
</td>
</tr>
</table>
</form>
track_reports.php
$bagianWhere = "";
if (isset($_POST['chkBadge']))
{
$badge_id = $_POST['badge_id'];
if (empty($bagianWhere))
{
$bagianWhere .= "badge_id = '$badge_id'";
}
}
if (isset($_POST['chkEmp']))
{
$employee_name = $_POST['employee_name'];
if (empty($bagianWhere))
{
$bagianWhere .= "employee_name LIKE '$employee_name'";
}
else
{
$bagianWhere .= " AND employee_name LIKE '$employee_name'";
}
}
if (isset($_POST['chkOtdate']))
{
$date_from = $_POST['date_from'];
$date_to = $_POST['date_to'];
$query=mysql_query("select badge_id, employee_name from t_submissions where ot_date between '$date_from' and '$date_to'");
while($row=mysql_fetch_array($query)){
echo $row['badge_id'];
echo $row['employee_name'];
}
}
$query = "SELECT * FROM t_submissions WHERE ".$bagianWhere;
$hasil = mysql_query($query);
echo "
<div id='main' class='wrapper'>
<div class='content-area'>
<table cellspacing='0' class='font'>";
echo "<tr><th class='th'>Badge ID</th><th class='th'>Employee Name</th><th class='th'>OT Date</th><th class='th'>Department</th><th class='th'>OT From</th><th class='th'>OT To</th><th class='th'>Remarks</th><th class='th'>Submissions By</th><th class='th'>Acknowledged By</th><th class='th'>Approved By</th></tr>";
while ($data = mysql_fetch_array($hasil))
{
echo "<tr><td class='td'>".$data['badge_id']."</td><td class='td'>".$data['employee_name']."</td><td class='td'>".$data['ot_date']."</td><td class='td'>".$data['dept_name']."</td><td class='td'>".$data['ot_from']."</td><td class='td'>".$data['ot_to']."</td><td class='td'>".$data['remarks']."</td><td class='td'>".$data['submission_by']."</td></tr>";
}
echo "</table>
<br>
<input type='button' VALUE='Back' onClick='history.go(-1);return true;'>
</div>
</div>
";
?>
答案 0 :(得分:0)
确保ot_date的数据类型是否为 datetime ?也许您使用了 varchar
答案 1 :(得分:0)
在上面的评论中,您声明存储“日期”的ot_date
列的类型为VARCHAR
。因此,MySQL根本不会将其内容识别为日期,而是将它们视为一系列无意义的(对象)字符(例如单词)。
您可以做的最好的事情是更改数据库,以便这些日期以MySQL识别为日期的格式存储,例如DATE
数据类型。要做到这一点而不丢失现有数据:
重命名现有列并在其位置添加新列:
ALTER TABLE t_submissions
CHANGE ot_date ot_date_old VARCHAR(size),
ADD ot_date DATE [NOT NULL] AFTER ot_date_old;
将旧列的内容复制到新列中,作为日期:
UPDATE t_submissions SET ot_date = STR_TO_DATE(ot_date_old, '%d-%b-%Y');
验证新列是否包含预期数据:
SELECT ot_date, ot_date_old FROM t_submissions;
删除旧列(可选):
ALTER TABLE t_submissions DROP ot_date_old;
接下来,为了使您的查询有效,MySQL需要知道如何将提交的日期转换为日期而不是将它们视为字符串:
SELECT badge_id, employee_name FROM t_submissions
WHERE ot_date BETWEEN STR_TO_DATE('%d-%b-%Y', ?) AND STR_TO_DATE('%d-%b-%Y', ?)
请注意,我已使用?
代替日期变量,因为正如我在上面的评论中所提到的,您的代码目前受SQL注入,而您真的应该通过这样的MySQL的变量作为预处理语句的参数(因此,它们不会被SQL评估)。有关详细信息,请参阅Bobby Tables。
另请注意,您当前的表单要求用户在指定格式的文本框中输入日期,否则查询将失败。您最好要求用户从下拉列表(或某种形式的日历控件)中选择日期部分和/或执行验证,以确保提交的日期格式正确。
最后,在尝试读取可能不存在的记录集之前,您应该测试查询的结果以查看它是否成功(实际上在这种情况下它不是这样)。