Обратите внимание, что $memberid
в примере кода не содержит несколько идентификаторов. Значение перезаписывается каждым циклом, поэтому при выходе из цикла сохраняется только последнее значение.
Получите имя друга в запросе, присоединив таблицу дружбы к таблице пользователя по идентификатору пользователя друга:
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
).