PHP 2 человека одновременно входят в систему с одного компьютера

0

У меня есть логин script, который должен проверять наличие входа 2 человек в то же время, когда он сравнивает имена пользователей и пароль на сервере 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);
}
  • 0
    @ Пол: О, верно / лицевая сторона лица
  • 0
    Почему вы должны справиться с этим?
Показать ещё 4 комментария
Теги:
login-script

3 ответа

4
Лучший ответ
  • Вы используете = вместо === (или, если нужно, ==). = - оператор присваивания в PHP; === и == являются операторами равенства.
  • Вы сравниваете одно и то же имя пользователя с $p1name и $p2name. Если эти две переменные не совпадают, выражение (после исправления (1) выше) никогда не будет оцениваться до true.
  • Вы зацикливаете вместо того, чтобы использовать 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-адресу.

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

  • 0
    3. Ничто в вашем состоянии не проверяет тот же компьютер
  • 0
    что вы имеете в виду?
Показать ещё 10 комментариев
1

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

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

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

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

  • 0
    «Я бы использовал запрос, чтобы проверить имя пользователя и пароль по такой таблице за один раз, не получая таблицу, просматривая и проверяя каждое поле». как пост постгер сделал
  • 0
    я забыл упомянуть, что пользователи входят в сеансы
Показать ещё 1 комментарий
0

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню