PHP 2 человека одновременно входят в систему с одного компьютера - PullRequest
0 голосов
/ 01 декабря 2010

У меня есть сценарий входа, который должен проверять вход двух человек одновременно, он сравнивает имена пользователей и пароль на сервере MySQL, если пользователь существует

//Player 1 Login username and password
$p1name = $_POST['p1name'];
$p1pass = $_POST['p1pass'];

//player 2 Login username and password
$p2name = $_POST['p2name'];
$p2pass = $_POST['p2pass'];






$connection = mysql_connect("db_host", "db_user", "db_pass");
mysql_select_db("db_name", $connection);





 get_user($p1name, $p1pass);
 get_user($p2name, $p2pass);

$row = $result;
$found = false;

    if(($row["username"] == $p1name && $row["password"] == sha1("$p1pass")) && ($row["username"] == $p2name && $row["password"] == sha1("$p2pass"))){
            $found = true;
            break;
        }


function get_user($username, $password) {
    $query = 'SELECT * FROM users';
    $query .= ' WHERE username = ' . mysql_real_escape_string($username);
    $query .= ' AND password = ' . mysql_real_escape_string(sha1($password));
    $result = mysql_query($query);
    return mysql_fetch_assoc($result);
}

Ответы [ 3 ]

4 голосов
/ 01 декабря 2010
  1. Вы используете = вместо === (или, если необходимо, ==).= - оператор присваивания в PHP;=== и == являются операторами равенства.
  2. Вы сравниваете одно и то же имя пользователя с $p1name и $p2name.Если эти две переменные не совпадают, выражение (после исправления (1) выше) никогда не будет иметь значения true.
  3. Вы используете цикл вместо того, чтобы использовать SQL для цикла.Например:

    function get_user($username, $password) {
        $query = 'SELECT * FROM users';
        $query .= ' WHERE username = ' . mysql_real_escape_string($username);
        $query .= ' AND password = ' . mysql_real_escape_string(sha1($password));
        $result = mysql_query($query);
        return mysql_fetch_assoc($result);
     }
    

Что касается знания, когда два человека "на одном компьютере" пытаются присоединиться к одной и той же игре (или что-то еще), то вместо этого обычно дают идентификатор игры .Затем пользователи могут присоединиться к игре, подключившись с использованием этого идентификатора игры, часто используя определенный URL-адрес.

После того, как пользователь войдет в систему, ему будет предоставлена ​​возможность начать игру.Когда это произойдет, укажите идентификатор игры в URL-адресе в качестве параметра GET (например, mysite/game.php?gameid=2153259).(Возможно, вы захотите использовать случайные идентификаторы или что-то другое для идентификатора игры, чтобы другие игроки не могли присоединиться к игре «случайно».) Затем «хост» может передать URL кому-то другому, а затем в игру вступает новый пользователь(возможно, после того, как его спросили).

1 голос
/ 01 декабря 2010

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

Что если у вас есть 100 000 пользователей, использующих ваш метод? это будет медленно, неэффективно, и что, если кто-то изменит свой пароль, пока ваш скрипт проверяет 100 000 пользователей, проверяющих их? они смогут войти на большее количество компьютеров, потому что проверяющие машины уже будут иметь старые данные в памяти.

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

Но я думаю, вам также следует спросить себя, как вы будете справляться с тайм-аутами выхода из системы и выхода из нее.

0 голосов
/ 01 декабря 2010

В таблице users есть два поля: одно для указания того, вошел ли пользователь, а другое для указания ip, используемого для входа в систему.

Когда пользователь входит в систему, также сохраните эту информацию в переменной сеанса.

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

Чтобы проверить, используют ли несколько пользователей один и тот же компьютер, проверьте IP-адрес, который они использовали для входа в систему. Конечно, они могут использовать nat или прокси-сервер, в этом случае вы можете просто предотвратить взаимодействие между игроками с одним и тем же ip забанить их / выйти из системы.

...