php - while循环内foreach循环问题

标签 php mysql foreach while-loop

我正在尝试使用 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"。问题是这些表格没有反射(reflect)我的陈述所告诉我的内容,它们都只是更新为 Shift_ID = "3"。

最后,我希望能够选择多个休息日,但是当我选择多个休息日时,它会在下一个循环中覆盖我的前一天,这是有道理的。

我不知道发生了什么,如果有人能给我线索,我将非常感激。

更新:当我在休息日更新后添加 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) { 并更新这些休息日:

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

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

关于php - while循环内foreach循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13605066/

相关文章:

java - JPA 中的 EntityManager 表不可见

javascript - 为什么 Array.forEach 比 Javascript 中的 for() 循环慢?

c# - LINQ vs foreach vs for性能测试结果

php - 表单上的 token 方法、双重提交问题

php - 无法在 php 和 mysqli_query 上提交表单

mysql - SQL - 返回与所有输入匹配的记录

php - 当循环的一部分时,仅将唯一值插入 MySQL

php - 使用 fastcgi 在 Apache 上配置两个虚拟主机

php - 在 PHP 中格式化电话号码

PHP PDO 不更新表并且不产生任何错误