![](/img/trans.png)
[英]How to get multiple values from a single <select> variable in HTML/PHP?
[英]How to get multiple values from a single variable?
我正在嘗試為我的網站構建一個朋友系統。 表結構設置如下:
CREAT TABLE users (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL
) Engine=InnoDB;
CREATE TABLE friendship (
member1 INT UNSIGNED NOT NULL, -- user's ID
member2 INT UNSIGNED NOT NULL, -- friend's ID
FOREIGN KEY (member1) REFERENCES users (id),
FOREIGN KEY (member2) REFERENCES users (id),
UNIQE (member1, member2)
) Engine=InnoDB;
樣本友情數據:
INSERT INTO friendship
VALUES
(1, 2),
(1, 3),
(1, 5);
通過使用以下命令,我可以獲取用戶的所有ID(在此示例中為ID 1):
$query = mysql_query("SELECT * FROM friendship_table WHERE member1='1'");
while($row = mysql_fetch_assoc($query)) {
$memberid = $row['member2'];
}
我現在想做的是獲得朋友的名字。 在示例中,memberid(表中的member2列)變量的值為2,3和5。 我想做一個if / elseif類型的語句,以查看成員ID是什么。 有點像這樣:
if($memberid == "2") {
echo "Bob is your friend";
} elseif($memberid == "3") {
echo "Joe is your friend";
} elseif($memberid == "3" && $memberid == "2") {
//This line is the problem, the variable has multiple values in it (2,3,5) so I think it doesn't understand that and just uses one value
echo "Bob and Joe are your friends!";
} else {
//...
}
因此,問題在於,當我要檢查是否為該變量分配了兩個特定值時,它不會檢查所有其值。 我怎樣才能使它檢查其所有值(2,3,5)?
請注意,示例代碼中的$memberid
不包含多個ID。 該值將在每個循環中被覆蓋,以便在循環退出時僅存儲最后一個值。
通過將友誼表與朋友的用戶ID上的user表聯接,可以在查詢中獲得朋友的名字:
SELECT name
FROM friendship
JOIN user ON friendship.friend=user.id
WHERE friendship.user=?
在這里,我將“ member1”和“ member2”列分別重命名為“ user”和“ friend”,因為更清楚了這些列的含義。 如果您希望友誼成為對稱關系,請添加觸發器以確保這一點。 相反,如果您想保留當前的列名並使用它,以便用戶和朋友可以在任一列中,則比較麻煩,但是可能:
SELECT name
FROM friendship
JOIN user ON friendship.member1=user.id OR friendship.member2=user.id
WHERE (friendship.member1=:id OR friendship.member2=:id)
AND NOT user.id=:id
請注意,某些數據庫擴展(例如PDO)不支持多個具有相同名稱的命名參數,因此在實踐中,您需要使用帶有重復參數的位置參數。
如果只有幾個結果,則使用(例如) PDOStatement::fetchAll
將名稱作為數組獲取:
try {
$friendQuery = $db->prepare('...');
$friendQuery->execute(array($user->id, ...));
$friends = $friendQuery->fetchAll(PDO::FETCH_COLUMN, 0);
switch (count($friends)) {
case 0:
// How sad.
$message = "You have no friends.";
break;
case 1:
$message = $friends[0] . ' is your friend.';
default:
$last = array_pop($friends);
$message = implode(', ', $friends) . " and $last are your friends.";
break;
}
} catch (PDOException) {
...
}
請注意,該示例僅用作示例,而不是完整的解決方案。 在生產代碼中,處理數據庫訪問的部分應與處理應用程序邏輯和輸出的部分(在本示例中為switch
語句)分開。
這行:
$memberid == "3" && $memberid == "2"
應該:
$memberid == "3" || $memberid == "2" || $memberid == "5"
我還建議您考慮使用switch / case
代替if / elseif /else
等,如下所示:
switch ($memberid) {
case "2": // do something
break;
case "3": // do something
break;
case "5": // do something
break;
case "1":
case "4":
case "7": // do something
break;
default: // handle default case
break;
}
考慮更廣泛的用途
<?php
#you can have array of friends like this
$a1=array(2=>1,3=>1,5=>1,4=>1);
#perticular user's frieds array
$a2=array(2=>1,3=>1,5=>1);
$final_array=array_intersect($a1,$a2));
if(count($final_array) > 0)
{
# each friend in $final_array are frieds Implode names here
}
else
{
# Not Friend
}
?>
我不確定代碼只是我解釋過的方法。您可以使用PHP Array函數以更好的方式完成此工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.