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のデータ型が日時であるかどうかを確認しますか?おそらくあなたはvarcharを使用しました

于 2012-05-03T08:22:39.090 に答える
0

上記のコメントでot_dateは、「日付」を保存している列のタイプが。であると述べていますVARCHAR。したがって、MySQLはその内容を日付としてまったく認識しませんが、意味のない(単語などの)文字のシーケンスのように扱います。

あなたができる最善のことは、そのような日付がDATEデータ型のように、MySQLが日付として認識する形式で保存されるようにデータベースを変更することです。既存のデータを失うことなくこれを行うには:

  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について評価されません)。詳細については、BobbyTablesについてお読みください。

また、現在のフォームでは、ユーザーが指定された形式でテキストボックスに日付を入力する必要があることに注意してください。そうしないと、クエリが失敗します。送信された日付が正しい形式であることを確認するために、ユーザーにドロップダウン(または何らかの形式のカレンダーコントロール)から日付部分を選択するように要求したり、検証を実行したりすることをお勧めします。

最後に、クエリの結果をテストして、存在しない可能性のあるレコードセットを読み取ろうとする前に、成功したかどうかを確認する必要があります(実際、この場合はそうではありませんでした)。

于 2012-05-03T08:43:00.687 に答える