0

我有一个登录脚本,它应该同时检查 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);
}
4

3 回答 3

4
  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);
     }
    

至于知道“在同一台计算机上”的两个人何时尝试加入同一个游戏(或其他),通常提供一个游戏 ID。然后,用户可以通过使用该游戏 ID 连接来加入游戏,通常是通过访问某个 URL。

用户登录后,他们将获得开始游戏的选项。当他们这样做时,在 URL 中提供游戏 ID 作为 GET 参数(例如mysite/game.php?gameid=2153259)。(您可能想为游戏 ID 使用随机 ID 或其他东西,以防止其他玩家“意外”加入游戏。)“主机”然后可以将 URL 提供给其他人,然后新用户进入游戏(也许在被问到之后)。

于 2010-12-01T09:59:41.763 回答
1

我会使用查询来一次性检查这样一个表的用户名和密码,而不是通过获取表、循环和测试每个字段。

如果您有 100,000 个用户使用您的方法怎么办?这会很慢,效率低下,如果有人在您的脚本正在检查 100,000 个用户时更改了他们的密码怎么办?他们将能够登录更多的机器,因为检查机器的内存中已经有旧数据。

如果您只被允许登录一台计算机并且这保持不变,您可以添加登录/注销时间戳、状态和计算机名称字段来管理其余部分。就我个人而言,我会将这些数据单独保存在表格中。

但我认为你也应该问问自己你将如何处理注销和注销超时。

于 2010-12-01T10:29:27.310 回答
0

在 users 表上,有两个字段,一个指定是否已登录,另一个指定用于登录的 ip。

当用户登录时,还将该信息保存到会话变量中。

然后,当用户对游戏执行某些操作时,将会话中的内容与数据库中的内容进行比较。如果不同,则用户已登录另一台计算机,您应该将他从当前位置注销。

要检查多个用户是否使用同一台计算机,请检查他们用于登录的 ip。当然,他们可能是 nat 或代理,在这种情况下,您可以阻止具有相同 ip 的玩家之间的交互,而不是禁止他们/ 注销它们。

于 2010-12-01T12:28:40.560 回答