0

所以我有一个 switch 语句,我想根据一个表中的 id 是否在另一个表中具有匹配的外键来显示一种或另一种形式。

到目前为止,我尝试过的是将一个 while 语句嵌套到另一个不起作用的语句中。

$subresult = mysqli_query($con,"SELECT * FROM tags GROUP BY tag");
$subresult2 = mysqli_query($con,"SELECT * FROM tag_subscribe WHERE uid = $uid");

while ($row = mysqli_fetch_array($subresult)) {
    $tid = $row['tid'];

    while ($row2 = mysqli_fetch_array($subresult2)) {
        $tid2 = $row2['tid'];
    }
    if ($tid2 == $tid) {
        $subbedup = 'yes';
    } else {
        $subbedup = 'no';
    }

    switch ($subbedup) {
    case ('yes'):
        echo "alternate html form goes here because $tid2 == $tid";
        break;
    case ('no'):
        echo "html form goes here";
        break;
    }
}

所以当这段代码运行时,它只返回开关“no”,除了它会返回一个开关“yes”,它恰好是包含外键的第二个表的最后一条记录。当我考虑它时,这是有道理的,因为它会一直运行这个循环,直到它用完表中的记录。因此,我花了大约 6 分钟的时间到达这一点,并且在过去的 6 个小时里,我一直在试图让它正常工作,但没有任何运气。

所以再一次,SO的好人,救救我!谢谢,麻烦您了 :)

所以我的问题是:这将如何正确完成?

4

3 回答 3

4

我不太确定你的数据库结构,所以我会即兴发挥。

给定这些示例表和列:

tags
id name

tag_subscriptions
user_id tag_id

下面的查询将遍历所有标签。每个标签都包含一个subscribed设置为“是”或“否”的列,具体取决于当前用户是否订阅了该特定标签。

$sql="SELECT t.`id`, t.`name`, IF (ISNULL(ts.`tag_id`),'no','yes') AS `subscribed`
  FROM `tags` t
  LEFT JOIN `tag_subscriptions` ts ON (ts.`user_id`=$uid AND ts.`tag_id`=t.`id`)
  WHERE 1;"

然后遍历所有标签:

$q=mysql_query($sql) or die(mysql_error());

while ($row=mysql_fetch_assoc($q)) {
    switch ($row['subscribed']) {
      case 'yes'
        // user is subscribed to this tag
        break;
      default:
        // user is not subscribed to this tag
    }
}

我认为(希望)这更接近你正在寻找的东西。

http://sqlfiddle.com/#!2/58684/1/0

于 2013-04-19T00:16:38.003 回答
2

很抱歉,我所知道的那样使用 PDO,您可以肯定地将这个想法转换为 MYSQLi。

$db = new PDO($hostname,$username,$password);

$arraySubTags = array();

$query = "SELECT tagID FROM tag_subscribe WHERE uid = :uid";
$statement = $db->prepare($query);
$statement->bindValue(':uid', $uid);
$statement->execute();
$subscribedTags = $statement->fetchAll(PDO::FETCH_ASSOC); //or loop with a while using fetch()
$statement->closeCursor();

foreach($subscribedTags as $sTag)
{
    array_push($arraySubTags,$sTag);
}

$query = "SELECT * FROM tags GROUP BY tag";
$statement = $db->prepare($query);
$statement->execute();
$allTags = $statement->fetchAll(PDO::FETCH_ASSOC); //or loop with a while using fetch()
$statement->closeCursor();

foreach($allTags as $tag)
{
    if(in_array($tag['tagID'], $arraySubTags))
    {
        echo "person is subscribed";
    }else{ echo "person not subscribed";}
}
于 2013-04-19T00:28:07.137 回答
0

此代码仅检查检查的最后一个标签是否已订阅 - 要检查每个您需要将 switch 语句移动到外部 while 循环中的标签,位于为当前标签设置 $subbedup 变量的 if..else 位之后。

或者,如果您出于某种原因需要将开关分开,您可以使 $subbedup 成为一个数组,由标签 id 索引。

于 2013-04-19T00:04:01.437 回答