0

日付の範囲をで更新しようとしていますShift_IDが、Shift_ID入力される日付は曜日によって異なります。したがって、たとえば、日付の範囲がある場合は、チェックボックス(例:)を選択して、何日であるかを示すこと$from = "2012-12-01" $to = "2012-12-28"ができるようにしようとしています。が設定範囲内の日と一致する場合、それ以外の場合は就業日であり、value="Fri" name = "offdays[]"offdaysoffdaysShift_ID = "6"Shift_ID = "3"

うまくいけば、これはすべて1分で意味があります。私はそれを説明し、いくつかの有用な変数を提供するために最善を尽くしています。

だからここに私のコードがあります:

if(isset($_POST['submit']))
    {
    if(isset($_POST['offdays']))
        {
        //$off is set through the config settings//
        $shift = mysqli_real_escape_string($_POST['shift']);
        $from = mysqli_real_escape_string($_POST['from']);
        $to = mysqli_real_escape_string($_POST['to']);
        $emp_id = mysqli_real_escape_string($_POST['emp_id']);

        foreach($_POST['offdays'] as $checkbox)
            {
            echo "Checkbox: " . $checkbox . "<br>";//error checking
            $sql = ("SELECT Date FROM schedule WHERE (Date BETWEEN '$from' AND '$to') AND (Emp_ID = '$emp_id')");

            if(!$result_date_query = $mysqli->query($sql))
                {
                echo "INSERT ERROR 1 HERE";
                }
                echo "SELECT SQL: " . $sql . "<br>";//error checking

                while($row = $result_date_query->fetch_assoc())
                    {
                    echo "Date: " . $row['Date'] . "<br>";//error checking
                    $date = date('D',strtotime($row['Date']));

                    if($date == $checkbox)
                        {
                        echo "MATCHED! Date: " . $date . " Checkbox: " . $checkbox . "<br>";//error checking
                        $sql = ("UPDATE schedule SET Shift_ID = '$off' WHERE Date = '" . $row['Date'] . "' AND Emp_ID = '$emp_id'");

                        if(!$result_update_offdays_query = $mysqli->query($sql))
                            {
                            echo "INSERT ERROR 2 HERE";
                            }
                            echo "UPDATE DAYS OFF SQL: " . $sql . "<br><br>";//error checking
                        }
                    else
                        {
                        echo "NOT MATCHED! Date: " . $date . " Checkbox: " . $checkbox . "<br>";//error checking
                        $sql = ("UPDATE schedule SET Shift_ID = '$shift' WHERE Date = '" . $row['Date'] . "' AND Emp_ID = '$emp_id'");

                        if(!$result_update_shift_query = $mysqli->query($sql))
                            {
                            echo "INSERT ERROR 3 HERE";
                            }
                            echo "UPDATE SHIFT SQL: " . $sql . "<br><br>";//error checking
                        }               
                    }
                }       
            }
        }

印刷されたエコーステートメントを見ると、すべてが完璧です。日付が金曜日に到着すると、それはそれが入っていることを示し、Shift_ID = "6"他の日はを示しますShift_ID = "3"。問題は、テーブルが私のステートメントが私に言っていることを反映していないことです。それらはすべてに更新されるだけですShift_ID = "3"

最終的には複数を選択できるようにしたいのですが、複数offdaysを選択すると、次のループで前日が上書きされてしまいます。これは理にかなっています。

何が起こっているのかわからないので、誰かが手がかりをくれたら本当にありがたいです。

更新:休日の更新後に追加exit;すると、次のようになります。

echo "UPDATE DAYS OFF SQL: " . $sql . "<br><br>";//error
exit;

休日をに更新するShift_ID = "6"ので、その後に何かが起こっているに違いありません。

編集:問題はユーザー権限にあるように見えます。理由は説明できませんが、ユーザーを削除し、完全な権限を持つ新しいユーザーを作成した後、問題が発生し始めました。@andhoの回答を選んだのは、彼がチャットフォーラムで回答を得るのを手伝ってくれ、コードをクリーンアップする方法も追加したからです。

4

2 に答える 2

1

これはあなたの問題を解決しませんが、解決策を単純化します!

offdays変数が次の場合:$offdays = array('Fri', 'Sun');

最初に、範囲内のすべての日付を1つのクエリで$shiftに設定できます。

UPDATE Schedule SET Shift_ID = '$shift' WHERE Date BETWEEN '$from' AND '$to' AND Emp_ID = '$emp_id'

次に、をループして、foreach ($offdays as $offday) {それらの休日を更新できます。

UPDATE Schedule SET Shift_ID = '$off' WHERE Date BETWEEN '$from' AND '$to' AND Emp_ID = '$emp_id' AND DATE_FORMAT(Date, '%a') = '$offday'

$offday'sこれにより、範囲内のすべてがに更新され$offます。

これにより、ループとクエリが減り、よりスリムなコードが得られます。

于 2012-11-29T06:18:38.417 に答える
0
 $sql = ("SELECT `Date` FROM schedule WHERE (`Date` BETWEEN '$from' AND '$to') AND (Emp_ID = '$emp_id')");

mysqlで予約されているため、すべてのフィールド名の日付にbacktick( `)を使用します。

于 2012-11-28T12:33:47.507 に答える