繁体   English   中英

while循环内foreach循环问题

[英]while loop inside foreach loop problems

我正在尝试使用Shift_ID更新日期范围,但是输入的Shift_ID取决于它是星期几。 因此,例如,如果我有一个日期范围$from = "2012-12-01" $to = "2012-12-28"我正在尝试设置它,以便选择一个复选框(例如: value="Fri" name = "offdays[]" )来指示星期offdays 如果offdays日与设置范围内的某天匹配,则Shift_ID = "6"否则为工作日,而Shift_ID = "3"

希望在一分钟之内一切都有意义,我正在尽力向您解释它,并为您提供一些有用的变量。

所以这是我的代码:

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
                        }               
                    }
                }       
            }
        }

当我查看打印的echo语句时,一切都完美无缺! 当某个日期到达星期五时,它表明它正在输入Shift_ID = "6"而其他任何一天都将显示Shift_ID = "3" 问题是这些表不能反映我的语句告诉我的内容,它们都只是更新为Shift_ID = "3"

最后,我希望能够选择多个offdays日,但是当我选择多个offdays日时,它将覆盖下一个循环中的前一天,这很有意义。

我不知道发生了什么,如果有人可以给我一个线索,我将不胜感激。

更新:当我添加exit; 在休息日更新之后,像这样:

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

它确实将休息日更新为Shift_ID = "6" ,因此在那之后一定有事情发生。

编辑:好像问题出在用户权限。 我无法解释原因,但是在删除用户并创建具有完全权限的新用户之后,事情开始起作用。 我选择@andho的答案是因为他帮助我在聊天论坛中找到了答案,并且还添加了一种清理代码的方法。

这不能解决您的问题,但是可以简化解决方案!

如果您的offdays变量如下: $offdays = array('Fri', 'Sun');

您可以先在一个查询中将范围内的所有日期设置为$ shift:

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

然后,您可以foreach ($offdays as $offday) {并更新这些offdays:

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

这将减少循环和查询,从而使代码更精简。

 $sql = ("SELECT `Date` FROM schedule WHERE (`Date` BETWEEN '$from' AND '$to') AND (Emp_ID = '$emp_id')");

对所有字段名称日期使用backtick(`),因为它是在mysql中保留的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM