我正在尝试为我的网站建立一个朋友系统。表结构设置如下:
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 1)朋友的ID:
$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类型的语句来查看memberid是什么。有点像这样:
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)?
答案 0 :(得分:1)
请注意,示例代码中的$memberid
并不包含多个ID。每个循环都会覆盖该值,因此当循环退出时,只存储最后一个值。
通过将友谊表加入到朋友的用户ID上的用户表中,在查询中获取朋友姓名:
SELECT name
FROM friendship
JOIN user ON friendship.friend=user.id
WHERE friendship.user=?
在这里,我重新命名了" member1"和"会员2"列为"用户"和"朋友"分别,因为它更清楚列是什么意思。如果您希望友谊是对称关系,请添加触发器以确保这一点。如果你想要保留当前的列名并让它保持用户和朋友可以在任何一列中,那么它可能更加混乱但是可能:
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
语句)。
答案 1 :(得分:0)
这一行:
$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;
}
答案 2 :(得分:0)
想想更广泛的使用数组
<?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数组函数以更好的方式完成这项工作