1

来了,我有答案了。

我只是将 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'";
                        }
                    }

现在没有问题代码可以顺利运行了。感谢各位朋友的帮助。感谢您的建议和意见。


我的代码有问题:

  1. view_report.php

我们可以根据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>
  1. 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>
                    ";
    
                    ?>
    

有人可以帮助我吗?感谢您的帮助。

4

2 回答 2

0

确保 ot_date 的数据类型是否为datetime?也许你用过varchar

于 2012-05-03T08:22:39.090 回答
0

在上面的评论ot_date中,您声明存储“日期”的列具有 type VARCHAR。因此 MySQL 根本不将其内容识别为日期,而是将它们视为一系列无意义的(对它而言)字符(例如单词)。

您可以做的最好的事情是更改您的数据库,以便以 MySQL 识别为日期的格式存储此类日期,例如DATE数据类型。要在不丢失现有数据的情况下执行此操作:

  1. 重命名现有列并在其位置添加一个新列:

    ALTER TABLE t_submissions
      CHANGE ot_date ot_date_old VARCHAR(size),
      ADD    ot_date DATE [NOT NULL] AFTER ot_date_old;
    
  2. 将旧列的内容复制到新列中,作为日期:

    UPDATE t_submissions SET ot_date = STR_TO_DATE(ot_date_old, '%d-%b-%Y');
    
  3. 验证新列是否包含预期数据:

    SELECT ot_date, ot_date_old FROM t_submissions;
    
  4. 删除旧列(可选):

    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了解更多信息。

另请注意,您当前的表单要求用户以指定格式在文本框中输入日期,否则查询将失败。您最好要求用户从下拉列表(或某种形式的日历控件)中选择日期部分和/或执行验证,以确保提交的日期格式正确。

最后,在尝试读取可能不存在的记录集之前,您应该测试查询结果是否成功(因为在这种情况下确实没有)。

于 2012-05-03T08:43:00.687 回答