“的foreach +如果”只适用于最后一个元素

问题描述:

语境:“的foreach +如果”只适用于最后一个元素

我有一个复选框,一个PHP页面来处理数据的形式。我检查我的数据:一切正常。

要管理复选框,我会根据表单中选中的复选框执行一个“FOREACH”,其中包含指令和sql查询的几个“IF”循环。

我尝试在我的数组上循环输入适合用户检查的每个框的循环“IF”。

问题:

当我运行该脚本,我检查3或5盒,只有最后一个循环“IF”是考虑到... :(

我检查了侧HTML表单和PHP测试POST:一切正常

所以我的问题是:

哪儿了我搞砸了,这样在foreach只能通过T的最后一个元素他排列在“IF”循环?

下面的代码:

if (isset($_POST['ModalMultipleColorEdit']) && !empty($_POST['Planning_ID2']) && !empty($_POST['CaseColor2']) && !empty($_POST['CaseWeek2'])) 
{ 
    //------- Extract Needed Posted Data 
    $TargetID = $_POST['Planning_ID2']; 
    $TargetColor = $_POST['CaseColor2']; 
    $TargetMonth = $_POST['CaseMonth2']; 


    //----- GET OLD DATA 
    $REQ = $DB->query("SELECT * FROM `Planning` WHERE `ID_Planning` = ".$TargetID." ;") 
    or die(var_dump($REQ->errorInfo())); 
    $DATA = $REQ->fetch(); 



    // Explore Targeted Weeks Array 
    foreach($_POST['CaseWeek2'] as $CheckedWeek) 
    { 
     //----------- IF TARGET MONTH IS JANUARY 
     if ($TargetMonth == "Janvier" && $CheckedWeek == "(S-1)") 
     {   
       //------- Extract Color String Period 
       $GetColor = explode("." , $DATA['Planning_M1']); 

       //------- Change Period Color 
       $GetColor[0] = $TargetColor; 

       //------- Build New Color String 
       $NewCaseMonth = $GetColor[0].".".$GetColor[1].".".$GetColor[2].".".$GetColor[3].".".$GetColor[4]; 

      // ------ UPDATE REQUEST 
      $REQ2 = $DB->prepare('UPDATE `Planning` SET Planning_M1 = ? WHERE `ID_Planning` = ?');       
      $REQ2->execute(array($NewCaseMonth, $TargetID)) or die(var_dump($REQ2->errorInfo())); 
      $REQ2 = NULL;   
     } 


     if ($TargetMonth == "Janvier" && $CheckedWeek == "(S-2)") 
     {  
      //------- Extract Color String Period 
      $GetColor = explode("." , $DATA['Planning_M1']); 

      //------- Change Period Color 
      $GetColor[1] = $TargetColor; 

      //------- Build New Color String 
      $NewCaseMonth = $GetColor[0].".".$GetColor[1].".".$GetColor[2].".".$GetColor[3].".".$GetColor[4]; 

      // ------ UPDATE REQUEST 
      $REQ2 = $DB->prepare('UPDATE `Planning` SET Planning_M1 = ? WHERE `ID_Planning` = ?'); 
      $REQ2->execute(array($NewCaseMonth, $TargetID)) or die(var_dump($REQ2->errorInfo())); 
      $REQ2 = NULL;  
     } 


     if ($TargetMonth == "Janvier" && $CheckedWeek == "(S-3)") 
     {   
      //------- Extract Color String Period 
      $GetColor = explode("." , $DATA['Planning_M1']); 

      //------- Change Period Color 
      $GetColor[2] = $TargetColor; 

      //------- Build New Color String 
      $NewCaseMonth = $GetColor[0].".".$GetColor[1].".".$GetColor[2].".".$GetColor[3].".".$GetColor[4]; 


      // ------ UPDATE REQUEST 
      $REQ2 = $DB->prepare('UPDATE `Planning` SET Planning_M1 = ? WHERE `ID_Planning` = ?'); 

      $REQ2->execute(array($NewCaseMonth, $TargetID)) or die(var_dump($REQ2->errorInfo())); 
      $REQ2 = NULL; 
     } 


     if ($TargetMonth == "Janvier" && $CheckedWeek == "(S-4)") 
     {  
      //------- Extract Color String Period 
      $GetColor = explode("." , $DATA['Planning_M1']); 

      //------- Change Period Color 
      $GetColor[3] = $TargetColor; 

      //------- Build New Color String 
      $NewCaseMonth = $GetColor[0].".".$GetColor[1].".".$GetColor[2].".".$GetColor[3].".".$GetColor[4]; 

      // ------ UPDATE REQUEST 
      $REQ2 = $DB->prepare('UPDATE `Planning` SET Planning_M1 = ? WHERE `ID_Planning` = ?');      
      $REQ2->execute(array($NewCaseMonth, $TargetID)) or die(var_dump($REQ2->errorInfo())); 
      $REQ2 = NULL;  
     } 


     if ($TargetMonth == "Janvier" && $CheckedWeek == "(S-5)") 
     { 
      //------- Extract Color String Period 
      $GetColor = explode("." , $DATA['Planning_M1']); 

      //------- Change Period Color 
      $GetColor[4] = $TargetColor; 

      //------- Build New Color String 
      $NewCaseMonth = $GetColor[0].".".$GetColor[1].".".$GetColor[2].".".$GetColor[3].".".$GetColor[4]; 

      // ------ UPDATE REQUEST 
      $REQ2 = $DB->prepare('UPDATE `Planning` SET Planning_M1 = ? WHERE `ID_Planning` = ?');       
      $REQ2->execute(array($NewCaseMonth, $TargetID)) or die(var_dump($REQ2->errorInfo())); 
      $REQ2 = NULL; 
     } 
    } 


    //------- REDIRECT WHEN SUCCESS AND NO MORE TARGETS 
    header('Location: PlanningNow.php?Process=Success'); 
    exit(); 

} 




else 
{ 
    header('Location: PlanningNow.php?Process=ErrorForm'); 
    exit(); 
} 

预先感谢您的帮助! :)

+0

看起来像你的逻辑问题。你得到最后一个元素更新,因为每次在循环中,你的先前值将被更新为最新值,所以最后你会得到最后更新的值 –

+0

这就是我的想法......但我无法弄清楚如何解决它?有什么建议么 ? –

+0

什么是自动递增的数组? – DarkBee

我不得不组成一些数据进行测试。考虑这个方法,以减少查询调用一个,并在很大程度上巩固你的代码...

代码:(Demo

$_POST['CaseWeek2']=['(S-2)','(S-3)','(S-5)']; // target checkboxes 
$_POST['CaseColor2']='purple'; // target color 
$_POST['CaseMonth2']='Janvier'; // target month 

$checkedWeeks=['(S-1)','(S-2)','(S-3)','(S-4)','(S-5)']; // possible checkboxes 

$DATA['Planning_M1']='red.orange.yellow.green.blue'; // old data from db 
$oldcolors=explode('.',$DATA['Planning_M1']); 

if($_POST['CaseMonth2']=='Janvier'){ 
    // var_export(array_intersect($checkedWeeks,$_POST['CaseWeek2'])); 
    $keys=array_keys(array_intersect($checkedWeeks,$_POST['CaseWeek2'])); // get appropriate keys 
    // var_export($keys); 
    $values=array_fill(0,sizeof($keys),$_POST['CaseColor2']); // generate equal number of values 
    // var_export($values); 
    $replacements=array_combine($keys,$values); // combine keys and values to make correct array 
    // var_export($replacements); 
    $newcolors=array_replace($oldcolors,$replacements); // replace old values with new values 
    var_export($newcolors); 
    //$REQ2=$DB->prepare('UPDATE `Planning` SET Planning_M1 = ? WHERE `ID_Planning` = ?');       
    //$REQ2->execute(array(implode('.',$newcolors), $TargetID));  
} 

输出:

array (
    0 => 'red', 
    1 => 'purple', 
    2 => 'purple', 
    3 => 'green', 
    4 => 'purple', 
) 

哦,对了记录,之前迭代被“忽略”的原因是因为:

$GetColor = explode("." , $DATA['Planning_M1']); 

每次调用UPDATE时,都会有效地拉动旧缓存的数据,交换单一颜色,并覆盖较早的迭代的UPDATE。



如果你想保持你的代码几乎相同,你可以写:

$GetColor = explode("." , $DATA['Planning_M1']); 

foreach()循环之前,则有条件地修改$GetColor你正在与$GetColor[n]做。然后在循环结束后,您可以使用完全修改的$GetColor数据对数据库进行单个UPDATE调用。

+0

哦,是的!你是对的,现在我明白了,它的工作就像魅力!非常感谢 ! ;) –