我有一个登录脚本应该检查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 :(得分: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);
}
至于知道两个人“在同一台计算机上”何时尝试加入相同的游戏(或其他),通常会提供游戏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的玩家之间的交互禁止他们/登出他们。