У меня есть логин 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);
}
=
вместо ===
(или, если нужно, ==
). =
- оператор присваивания в 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-адрес кому-то другому, а затем ввести новый пользователь в игру (возможно, после того, как его попросят).
Я бы использовал запрос, чтобы проверять имя пользователя и пароль на такую таблицу за один раз, а не получать таблицу, прокручивать и тестировать каждое поле.
Что делать, если у вас есть 100 000 пользователей, использующих ваш метод? это будет медленным, неэффективным, и что, если кто-то изменит свой пароль, пока ваш script будет бить через 100 000 пользователей, проверяющих их? они смогут подключаться к большему количеству машин, потому что проверка аппаратных средств уже имела старые данные в памяти.
Если вам разрешено входить только на один компьютер, и это остается верным, вы можете добавить отметки времени входа/выхода из системы, статус и поля имени компьютера, чтобы управлять остальными. Лично я бы сохранил эту таблицу отдельно.
Но я думаю, вы также должны спросить себя, как вы собираетесь бороться с выходом из системы и выхода из системы.
В таблице users есть два поля: один для указания, если он зарегистрирован, и другой, который указывает ip, используемый для входа.
Когда пользователь входит в систему, также сохраняйте эту информацию в переменной сеанса.
Затем, когда пользователь делает какое-либо действие в игре, сравните то, что находится в сеансе, с тем, что находится в базе данных. Если он отличается, пользователь вошел в систему на другом компьютере, и вы должны вывести его из текущего местоположения.
Чтобы проверить, используют ли несколько пользователей один и тот же компьютер, проверьте, что они использовали для входа в систему. Конечно, они могли бы работать с nat или прокси, и в этом случае вы могли бы просто предотвратить взаимодействие между игроками с тем же ip запретить их/вывести их из строя.