Как получить несколько значений из одной переменной? - PullRequest
1 голос
/ 31 декабря 2011

Я пытаюсь создать систему друзей для моего сайта.Структура таблицы настроена примерно так:

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)идентификаторы, используя следующие:

$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)?

Ответы [ 3 ]

1 голос
/ 31 декабря 2011

Обратите внимание, что $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).

0 голосов
/ 31 декабря 2011

Думайте шире, используйте массив

<?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

0 голосов
/ 31 декабря 2011

Эта строка:

$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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...