我对于爆发和继续循环等有点困惑。我有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'语句,但不知道在哪里。
答案 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