0

ユーザーが存在する場合、mysqlサーバーでユーザー名とパスワードを比較すると同時に2人のログインをチェックするログインスクリプトがあります

//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。これらの 2 つの変数が同じでない限り、式 (上記 (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);
     }
    

「同じコンピューター上で」2 人が同じゲーム (またはその他のもの) に参加しようとしているときを知ることに関しては、代わりにゲーム IDを提供するのが一般的です。その後、ユーザーはそのゲーム ID を使用して接続することでゲームに参加できます。多くの場合、特定の URL にアクセスします。

ユーザーがログインすると、ゲームを開始するオプションが表示されます。その際、URL にゲーム ID を GET パラメータとして指定します (例: mysite/game.php?gameid=2153259)。(他のプレイヤーが「誤って」ゲームに参加するのを防ぐために、ゲーム ID にランダム ID などを使用することができます。) 「ホスト」は URL を他の誰かに渡すことができ、その後、新しいユーザーがゲームに参加します。 (おそらく尋ねられた後)。

于 2010-12-01T09:59:41.763 に答える
1

クエリを使用して、テーブルを取得し、ループして各フィールドをテストするのではなく、そのようなテーブルに対してユーザー名とパスワードを一度にチェックします。

メソッドを使用しているユーザーが100,000人いる場合はどうなりますか?それは遅く、非効率的であり、スクリプトが10万人のユーザーをチェックしている間に誰かがパスワードを変更した場合はどうなるでしょうか?チェックするマシンにはすでに古いデータがメモリにあるため、より多くのマシンにログオンできます。

1台のコンピューターへのログインのみが許可されていて、これが当てはまる場合は、ログイン/ログオフのタイムスタンプ、ステータス、およびコンピューター名のフィールドを追加して、残りを管理できます。個人的には、そのデータを別のテーブルに保持します。

ただし、ログオフとログオフのタイムアウトにどのように対処するかについても自問する必要があると思います。

于 2010-12-01T10:29:27.310 に答える
0

users テーブルには、2 つのフィールドがあります。1 つはログインしているかどうかを指定するフィールドで、もう 1 つはログインに使用する IP を指定するフィールドです。

ユーザーがログインするときに、その情報もセッション変数に保存します。

次に、ユーザーがゲームで何らかのアクションを行ったときに、セッションの内容とデータベースの内容を比較します。異なる場合、ユーザーは別のコンピューターにログインしているため、現在の場所からログアウトする必要があります。

複数のユーザーが同じコンピューターを使用しているかどうかを確認するには、ログインに使用した IP を確認します。もちろん、彼らは nat またはプロキシを使用している可能性があります。その場合、同じ IP を持つプレイヤー間の相互作用を禁止する代わりに防ぐことができます。 / ログアウトします。

于 2010-12-01T12:28:40.560 に答える