2013-04-18 95 views
0

所以我有一個switch語句,我想要顯示一種形式或另一種基於如果一個表中的id在另一個表中具有匹配的外鍵。switch語句基於兩個表中的變量是否匹配

到目前爲止,我試過的是將一個聲明嵌套到另一個不工作的聲明中。

$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; 
    } 
} 

所以這段代碼運行時,它只返回切換「不」,除了它會返回一個開關「是」,這恰好是一個包含外鍵的第二個表的最後一個記錄。當我考慮它時,這是有道理的,因爲它將繼續運行這個循環,直到它在表中的記錄用完。所以我花了大約六分鐘時間到達這一點,並且我花了最後6個小時試圖讓它在沒有任何運氣的情況下正常工作。

所以,再次,在這麼好的人,救救我吧!請和謝謝:)

所以我的問題是:這將如何正確完成?

+3

我不明白你爲什麼while循環(一個或多個),而不是做比較的數據庫查詢 – 2013-04-18 23:47:44

+0

如果我做了查詢,將只返回什麼查詢比較比較。如果它比較或不,但如果比較爲真,則我想要返回所有內容,顯示的內容與比較爲假時不同。 – ButterDog

+0

在這一個上丟失了一種,祝你好運:-) – 2013-04-18 23:53:55

回答

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

+0

因此,這將顯示Tag表中的所有內容,並在涉及到訂閱標記表中匹配的記錄時進行切換?對不起,要問一個可能很明顯的問題,但這個語法對於我來說完全是一個新的php mysql noob。 – ButterDog

+0

謝謝。我正在消化信息,並會盡快應用。我很感激這種幫助,看起來像我所需要的。 – ButterDog

+0

那麼,我一直無法得到這個工作。雖然不是你的錯,但顯然是我的錯,因爲我現在無法將頭包裹在這裏。我想我只是將我的腳本的這一部分擱置一會兒,直到我更熟悉PHP和mysql,然後運行一個不同的,用戶友好的腳本,然後將數據拆分爲兩個html表格而不是嘗試把它放在一個整體。感謝百萬@showdev,我會把你的答案標記爲正確,因爲我確定它是正確的,我目前沒有足夠的知識使它與我的劇本相處得很好。再次感謝! – ButterDog

0

此代碼只檢查是否檢查了最後一個標記是否已訂閱 - 要檢查每個標記是否需要將switch語句移動到外部while循環中,之後設置$ subbedup變量的if..else位當前標籤。

或者,如果您因某種原因需要將開關保持分開,您可以使$ subbedup成爲一個數組,由標籤id索引。

+0

它設置在外部while循環不是嗎? – ButterDog

+0

哦,對不起,縮進令我困惑。 –

+0

也許if語句應該在inner while循環內? –

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";} 
} 
+0

謝謝丹。我並不真正熟悉PDO,我接受你的道歉:)我感謝你花時間寫出來,並教我一些新的東西。一旦我更熟悉PHP和MYSQL,我計劃更好地熟悉PDO。我正在編寫一個腳本來應用我迄今爲止學到的知識,然後做完這些工作之後,我打算在掌握基礎知識後再學習一些更高級的PHP,以便對其進行大量編輯,這樣我就可以回到這個問題上了。 - 稍後寫腳本。感謝一羣人! – ButterDog

+0

非常歡迎 – Dan

+0

這很不錯。另外,您最終將獲得「所有標籤」和「當前用戶的所有訂閱」的數據集,稍後可能會有所幫助。還爲PDO +1。 – showdev