Логический порядок запросов PHP - PullRequest
0 голосов
/ 18 ноября 2010

Я только что написал некоторый код для базовой схемы страницы.Это для игры, которую я запускаю, но, глядя на код, я чувствую, что написал его в неправильном порядке, и что я выполняю больше запросов, чем мне нужно.


    $query = mysql_query("SELECT * FROM bodyguards WHERE username='$u'");

    if($bg = mysql_fetch_assoc($query)) { // if you have a bg
        if($bg[status] == "active") {
            echo "your bodyguard is $bg[bodyguard], kick him?";
        } else {
            echo "invite a bg?";
        }
    } else {
        $query = mysql_query("SELECT * FROM bodyguards WHERE bodyguard='$u' AND status='active'");

        if($bg = mysql_fetch_assoc($query)) { // if you are a bg
            echo "you are the bodyguard of $bg[username]";
        } else {
            //otherwise check if anyone has invited you

            $query = mysql_query("SELECT * FROM bodyguards WHERE bodyguard='$u' AND status='invited'");

            while($temp = mysql_fetch_assoc($query)) {
                echo "$temp[username] has invited you to be their bodyguard, accept or decline?";
            }
        }
    }

Я толькоиспользуя одну таблицу базы данных.если бы у player1 был подтвержденный телохранитель (player2), строка выглядела бы следующим образом:

username => player1, bodyguard => player2, status => active.

если бы кто-нибудь здесь написал кодпо-другому?

Ответы [ 2 ]

3 голосов
/ 18 ноября 2010

Я бы сделал это за один запрос:

$query = mysql_query("SELECT * FROM bodyguards WHERE username='$u' OR (bodyguard='$u' AND (status='active' OR status='invited')");

$bg = mysql_fetch_assoc($query);

if ($bg) { // check for empty result first, to prevent E_NOTICE
    if ($bg['username'] == $u) {
        if($bg['status'] == "active") {
            echo "your bodyguard is {$bg['bodyguard']}, kick him?";
        } else {
            echo "invite a bg?";
        }
    } else if ($bg['bodyguard'] == $u) {
        if ($bg['status'] == "active") {
            echo "you are the bodyguard of {$bg['username']}";
        } else if ($bg['status'] == "invited") {
            echo "{$bg['username']} has invited you to be their bodyguard, accept or decline?";
        }
    }
}

ПРИМЕЧАНИЕ. Убедитесь, что вы экранируете $u, если данные предоставлены пользователем с использованием mysql_real_escape_string. Кроме того, убедитесь, что вы заключили в кавычки ваши индексы массива, чтобы предотвратить уведомления PHP (т. Е. Использовать $bg['username'] вместо $bg[username]).

0 голосов
/ 18 ноября 2010

Всякий раз, когда у меня возникает связь между двумя сущностями в таблице, я обычно создаю другую таблицу для хранения отношений.

Моя BodyGuardRelations таблица может выглядеть как

[id] [userId] [bodyGuardUserId] [status]
1    27       55                Active
2    43       89                Invited
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...