проблема логики цикла php - PullRequest
1 голос
/ 02 февраля 2012

Я работаю над функцией типа списка друзей, которая будет отображать друзей пользователя, и у меня возникли некоторые логические проблемы.Как устроена таблица для хранения друзей, есть 3 столбца;userid1, userid2 и friendstatus.Friendstatus, равное 1, означает, что пользователи являются друзьями, а состояние, равное 0, означает, что запрос находится на рассмотрении.Когда пользователь добавляет другого пользователя в качестве своего друга, пользователь, отправляющий запрос, помещается в userid1, а пользователь, который получает запрос, помещается в userid2.

Итак, проблема, с которой я сталкиваюсь, заключается вПолучение функции для правильного выбора друзей пользователя, а не самого пользователя.По сути, я пытаюсь заставить эту функцию определить, какой столбец является пользователем (например, я), а какой - другом.

Первоначально у меня был первый SQL-оператор, но он тоже не работал.

 $friends = mysql_query("Select * from friends where (userid1 = $myUsername OR userid2=$myUsername) AND friendstatus = '1'");

Вот логика, которую я пытаюсь создать.

  1. Получить идентификатор пользователя (мой)
  2. Поиск в столбце 1 для моего идентификатора: если найдено, отобразитьстолбец 2 (который будет моим другом)
  3. поиск столбца 2 для моего идентификатора: если найден, отобразить столбец 1 (который будет моим другом)

Функция friendslookup просто отображаетинформация и тянет информацию пользователя.Это не добавляет к логике.

$myUsername = $_GET['myFriends'];
if(isset($myUsername)){
        $friends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
        $friends2 = mysql_query("Select * from friends where userid2 = $myUsername AND friendstatus = '1'");
        if(mysql_num_rows($friends) > 0 OR mysql_num_rows($friends2) >0 ) {

echo '<table><tr><td>Username </td><td> Location</td></tr>';
        $col1rows = mysql_num_rows($friends);
        $col2rows = mysql_num_rows($friends2);
            }
        for ($i=0; $i<$col1rows;$i++){
            $myFriends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
                $friend = mysql_fetch_array($myFriends);
                $friend_1 = $friend['userid2'];
                friendsLookup($friend_1,$myUsername);
            }
        for ($i=0; $i<$col2rows;$i++){
            $myFriends_2 = mysql_query("Select * from friends where userid2 = $myUsername AND friendstatus = '1'");
                $friend = mysql_fetch_array($myFriends_2);
                $friend_2 = $friend['userid1'];
                friendsLookup($friend_2,$myUsername);
                }
            }

Ответы [ 3 ]

2 голосов
/ 02 февраля 2012

Я бы посоветовал вам делать все в одном SQL (включая функцию friendsLookup, потому что я уверен, что для этого есть еще один запрос mysql), потому что он станет очень медленным.Предположим, что Таблица для ваших пользователей - это «пользователь».Используйте этот SQL:

$sql = "SELECT * FROM user u, friend f WHERE f.userid1 = $myUsername AND f.friendstatus = '1' AND u.userid = f.userid2
UNION
SELECT * FROM user u, friend f WHERE f.userid2 = $myUsername AND f.friendstatus = '1' AND u.userid = f.userid1";

Это позволит получить всех ваших друзей (включая информацию о них).Более того, если вы хотите отсортировать или ограничить (или что-то еще, что вы хотели сделать с вашими результатами), вы можете сделать это:

Например, вы хотите отсортировать своих друзей по имени в порядке возрастания:1006 *

$sql = "SELECT * FROM (
SELECT * FROM user u, friend f WHERE f.userid1 = $myUsername AND f.friendstatus = '1' AND u.id = f.userid2
UNION
SELECT * FROM user u, friend f WHERE f.userid2 = $myUsername AND f.friendstatus = '1' AND u.id = f.userid1 ) tblResult r
ORDER BY r.first_name ASC";

Затем вы можете получить окончательные результаты, выполнив следующее:

$query = mysql_query( $sql );
while ( $col = mysql_fetch_array( $query ) ){
  ?>
  <!-- DO YOUR THING HERE WITH PHP -->
  <?php
}

Наконец, я хотел бы прокомментировать ваш цикл.Обратите внимание, что внутри ваших циклов у вас есть этот код:

$myFriends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
$friend = mysql_fetch_array($myFriends);

Это на самом деле не нужно.Первая строка просто сбрасывает ваш запрос каждый цикл.Удалите первую строку, а во второй строке вместо $ myFriends используйте $ friends (это первый запрос, который у вас вверху).Таким образом, это должно выглядеть так для первых двух строк в вашем первом цикле:

$friend = mysql_fetch_array($friends);

Сделайте то же самое для второго цикла.

1 голос
/ 02 февраля 2012

Это может помочь:

SELECT (CASE $myUsername
    WHEN `userid1` THEN `userid2`
    WHEN `userid2` THEN `userid1`
END) AS `friend_ids`
FROM `friends`
WHERE $myUsername IN (`userid1`, `userid2`)
AND `friendstatus` = 1;

Мало проблем с вашей логикой -

  1. вам не нужно запускать один и тот же запрос несколько раз.

  2. используя только первые 2 запроса, вы можете прочитать всех друзей, выбрав столбец "userid2" из запроса 1 и столбец "userid1" из запроса 2.

  3. В ваших циклах for вы всегда читаете первую запись. Таким образом, в каждой итерации вы снова вызываете один и тот же запрос и всегда читаете только первую запись. Вместо этого вы должны выполнить запрос один раз и вызвать mysql_fetch_array () в цикле.

Например, здесь:

$myFriends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
while ($friend = mysql_fetch_array($myFriends) {
    $friend_1 = $friend['userid2'];
    friendsLookup($friend_1,$myUsername);
}

Надеюсь, что вышесказанное поможет!

1 голос
/ 02 февраля 2012

Я бы использовал один SQL-запрос UNION:

$myUsername = $_GET['myFriends'];
if(isset($myUsername)){
        $friends = mysql_query("
        SELECT userid1 as friendId
        FROM friends
        WHERE userid2 = $myUsername AND friendstatus = 1
        UNION
        SELECT userid2 as friendId
        FROM friends
        WHERE userid1 = $myUsername AND friendstatus = 1
        ");

        if(mysql_num_rows($friends) > 0) {
            echo '<table><tr><td>Username </td><td> Location</td></tr>';
            while($friend = mysql_fetch_array($friends)) {
                $friend_data = friendsLookup($friend['friendId'],$myUsername);
                //display friend data here
            }
            echo '</table>';
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...