PHP使用日期范围显示数据

时间:2012-05-03 08:15:30

标签: php mysql

在这里,我得到了答案。

我只需将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
  2. 我们可以根据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>
                      ";
      
                      ?>
      
    2. 有人可以帮帮我吗? 感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

确保ot_date的数据类型是否为 datetime ?也许您使用了 varchar

答案 1 :(得分:0)

在上面的评论中,您声明存储“日期”的ot_date列的类型为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;
    
  5. 接下来,为了使您的查询有效,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

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

    最后,在尝试读取可能不存在的记录集之前,您应该测试查询的结果以查看它是否成功(实际上在这种情况下它不是这样)。