PHP中断,继续2循环

时间:2012-12-15 05:24:01

标签: php loops foreach break continue

我对于爆发和继续循环等有点困惑。我有2个SQL查询,它们将用户权限与用户的实际权限相匹配,并将其与新用户进行匹配。但是,如果某些新的priveleges与用户拥有的priveleges匹配,我想跳过SQL插入并转到下一个:

public static function insertPriveleges($user_id,$priveleges)
{
    $ex = explode(",",$priveleges); // separated by commas
    if(count($ex)>0)
    {
         $x = false;
         foreach($ex as $i => $priv)
         {
             $check_user = mysql_query("SELECT * FROM users_access_codes WHERE user_id='$user_id'") or die(mysql_error()); // get user's current priveleges
             while($check_data = mysql_fetch_array($check_user))
             {
                  if($check_data['access_code']!=$priv)
                  {
                      //if it doesn't match, insert 
                      $sql = "INSERT INTO users_access_codes (uaID,user_id,access_code) VALUES (NULL,'".$user_id."','$priv')";
                  }             
             }
         }
     }
}

我几乎从来没有一种情况需要在循环中匹配两个以上的东西。我需要确保我不会为该用户提供双重权限。我知道内循环中必须有一个'continue'语句,但不知道在哪里。

2 个答案:

答案 0 :(得分:3)

在您的INSERT语句后,您可以添加continue 2,以便将您带回foreach ($ex as ...的顶部。在这种情况下,您也可以使用break;因为内部while之后没有任何内容。

但是,如果您采用不同的方式,实际上并不需要它。而不是为每个权限读取表格,只需阅读所有这些权限,然后进行比较。

此代码将从数据库中获取所有权限,然后仅根据$ex插入缺少的权限;它使用array_diff()来计算两者之间的差异。

public static function insertPriveleges($user_id, $priveleges)
{
    $ex = explode(",", $priveleges); // separated by commas
    if (count($ex) > 0) {
         // get user's current priveleges
         $check_user = mysql_query("SELECT * FROM users_access_codes 
             WHERE user_id='$user_id'") or die(mysql_error()); 
         $actual = array();
         while ($row = mysql_fetch_array($check_user)) {
             $actual[] = $row['access_code'];
         }

         foreach (array_diff($ex, $actual) as $priv) {
             //if it doesn't match, insert 
             $sql = "INSERT INTO users_access_codes (uaID,user_id,access_code) VALUES (NULL,'".$user_id."','$priv')";
             mysql_query($sql);
         }
     }
}

顺便说一下,你可以考虑因为竞争条件而使用INSERT IGNORE INTO,但因为你没有检查语句的返回值,所以这里没关系:)

答案 1 :(得分:1)

只需在INSERT后添加一个中断:

public static function insertPriveleges($user_id,$priveleges)
{
    $ex = explode(",",$priveleges); // separated by commas
    if(count($ex)>0)
    {
         $x = false;
         foreach($ex as $i => $priv)
         {
             $check_user = mysql_query("SELECT * FROM users_access_codes WHERE user_id='$user_id'") or die(mysql_error()); // get user's current priveleges
             while($check_data = mysql_fetch_array($check_user))
             {
                  if($check_data['access_code']!=$priv)
                  {
                      //if it doesn't match, insert 
                      $sql = "INSERT INTO users_access_codes (uaID,user_id,access_code) VALUES (NULL,'".$user_id."','$priv')";
                      break;
                  }             
             }
         }
     }
}

要完成,我建议您阅读以下链接: http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated