1

我对打破和继续退出循环等感到有点困惑。我有 2 个 SQL 查询将用户权限与用户的实际权限与新的权限相匹配。但是,如果某些新权限与用户拥有的权限匹配,我想跳过 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')";
                  }             
             }
         }
     }
}

我几乎从来没有遇到需要在循环中匹配两个以上的东西的情况。我需要确保我不会为该用户获得双重特权。我知道在内循环的某处必须有一个“继续”语句,但不确定在哪里。

4

2 回答 2

3

在您的INSERT声明之后,您可以添加continue 2以将您带回到您的foreach ($ex as .... 您也可以break;在这种情况下使用,因为您的 inner 之后没有任何内容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由于竞争条件,您可以考虑使用,但是因为您没有检查语句返回值,所以在这里没关系:)

于 2012-12-15T05:34:27.530 回答
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

于 2012-12-15T05:28:37.460 回答