簡體   English   中英

如何從單個變量獲取多個值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM