PHP 2人同时从同一台计算机登录

时间:2010-12-01 09:57:28

标签: php mysql login-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);
}

3 个答案:

答案 0 :(得分: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);
     }
    
  4. 至于知道两个人“在同一台计算机上”何时尝试加入相同的游戏(或其他),通常会提供游戏ID 。然后,用户可以通过使用该游戏ID进行连接来加入游戏,通常是通过访问某个URL。

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

答案 1 :(得分:1)

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

如果您有100,000名用户使用您的方法怎么办?它将是缓慢,低效的,如果有人更改了他们的密码,而你的脚本正在通过100,000个用户检查它们呢?他们可以登录更多的机器,因为机器检查已经在内存中有旧数据了。

如果您只允许登录到一台计算机,并且这种情况仍然存在,则可以添加登录/注销时间戳,状态和计算机名称字段来管理其余计算机。我个人会将这些数据保存在单独的表格中。

但我认为您还应该问问自己如何处理注销和注销超时。

答案 2 :(得分:0)

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

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

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

要检查多个用户是否使用同一台计算机,请检查他们用于登录的IP。当然,他们可能会在nat或代理服务器上进行异议,在这种情况下,您可以阻止具有相同IP的玩家之间的交互禁止他们/登出他们。