この記事では、特定の参考値を持つ PHP ユーザー ログイン検証モジュールを紹介します。必要な友達はそれを参照してください
ログインフォームのHTMLコードは次のとおりです:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>User Login</title> <style type="text/css"> <!— .alert {color: red} .textinput {width:160px} .btn {width:80px} table {border: 3px double;background-color:#eeeeee;} --> </style> </head> <body> <form name="frmLogin" method="post" action="login.php" onSubmit="return doCheck();"> <table border="0" cellpadding="8" width="350" align="center"> <tr><td colspan="2" align="center" class="alert"></td></tr> 用户名: <td><input name="username" type="text" id="username" class="textinput" /></td> </tr> <tr><td>密码:</td> <td><input name="pwd" type="password" id="password" class="textinput" /></td> </tr> <tr><td colspan="2" align="center"> <input type="submit" class="btn" value="登录"> <input type="reset" class="btn" value="重置"> </td> </tr> </form> </body> </html>
上記のコードをlogin.phpファイルとして保存し、ブラウザで実行します。
ユーザーがログイン フォームにログイン情報を入力すると、データが処理のためにこのページの login.php に送信されます。次に、検証を追加します。 login.php のヘッダー ユーザー名とパスワードが正しいかどうかを示すコード。 login.php コードの変更は次のとおりです:
<br/>
<?php require_once('common.php'); // 引入公共文件,其中实现了SQL注入漏洞检查的代码 $username = trim($_POST['username']); // 取得客户端提交的密码并用md5()函数时行加密转换以便后面的验证 $pwd = md5($_POST['pwd']); // 设置一个错误消息变量,以便判断是否有错误发生 // 以及在客户端显示错误消息。 其初值为空 $errmsg = ''; if (!empty($username)) { // 用户填写了数据才执行数据库操作 //--------------------------------------------------------- // 数据验证, empty()函数判断变量内容是否为空 if (empty($username)) { $errmsg = '数据输入不完整'; } //--------------------------------------------------------- if(empty($errmsg)) { // $errmsg为空说明前面的验证通过 // 调用mysqli的构造函数建立连接,同时选择使用数据库'test' $db = @new mysqli("127.0.0.1", "developer", "123456", "test"); // 检查数据库连接 if (mysqli_connect_errno()) { $errmsg = "数据库连接失败! \n"; } else { // 查询数据库,看用户名及密码是否正确 $sql = "SELECT * FROM t_user WHERE f_username='$username' AND f_password='$pwd'"; $rs = $db->query($sql); // $rs->num_rows判断上面的执行结果是否含有记录,有记录说明登录成功 if ($rs && $rs->num_rows > 0) { // 在实际应用中可以使用前面提到的重定向功能转到主页 $errmsg = "登录成功!"; } else { $errmsg = "用户名或密码不正确,登录失败!"; } // 关闭数据库连接 $db->close(); } } } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>User Login</title> <style type="text/css"> <!-- .alert {color: red} .textinput {width:160px} .btn {width:80px} table {border: 3px double;background-color:#eeeeee;} --> </style> </head> <body> <form name="frmLogin" method="post" action="login.php" onSubmit="return doCheck();"> <table border="0" cellpadding="8" width="350" align="center"> <tr><td colspan="2" align="center" class="alert"><?echo $errmsg;?></td></tr> 用户名: <td><input name="username" type="text" id="username" class="textinput" value="<?echo $username;?>" /></td> </tr> <tr><td>密码:</td> <td><input name="pwd" type="password" id="password" class="textinput" /></td> </tr> <tr><td colspan="2" align="center"> <input type="submit" class="btn" value="登录"> <input type="reset" class="btn" value="重置"> </td> </tr> </form> </body> </html>
太字で示されている部分は新しく追加されたコードで、ほとんどのステートメントは詳細にコメントされています。 HTML フォームに追加されたコードは、サーバー側の処理中に発生する可能性のあるエラーまたはプロンプトを出力するために最初の行のセルに追加されます。また、ユーザー名の入力に value 属性がマークされていることに注意してください。ボックスに、最後に送信されたユーザー名を出力する PHP コードを追加しました。これにより、間違ったパスワードを入力したためにログインできないユーザーは、再試行するときにのみパスワードを入力する必要があります。
login.php を再度実行し、フォームにデータを入力してログインを試行します。
ユーザー情報テーブル t_user では、f_logintimes フィールドはユーザーのログイン時刻を記録するために使用され、f_lasttime フィールドはユーザーの最終ログイン時刻を記録するために使用されます。 f_login フィールドは、ユーザーを記録するために使用されます。最後のログインに使用された IP 情報をデータベースに記録することは、主にユーザーのログイン数とユーザーの地理的分布をカウントするのに便利です。これらのデータは、ユーザーがログインするたびに更新する必要があります。次に、これらのデータを更新するコードを追加します。
login.php ファイルを開き、そのヘッダーの PHP コードを次のように変更します。
<?php ...... if ($rs && $rs->num_rows > 0) { // 在实际应用中可以使用前面提到的重定向功能转到主页 第4 / 6页 $errmsg = "登录成功!"; // 更新用户登录信息 $ip = $_SERVER['REMOTE_ADDR']; // 获取客户端的IP $sql = "UPDATE t_user SET f_logintimes = f_logintimes + 1,"; $sql .= "f_lasttime=now(), f_loginip='$ip' "; $sql .= " WHERE f_username='$username'"; $db->query($sql); } else { $errmsg = "用户名或密码不正确,登录失败!"; } ...... ?>
上記の太字の部分は、コード内で、最初に自動グローバル変数からクライアントの IP アドレスを取得します。 $_SERVER を選択し、SQL ステートメントを作成し、そのステートメントを実行してユーザーのログイン情報を更新します。この SQL ステートメントでの f_lasttime の割り当ては、MySQL の内部関数 now() を呼び出すことによって行われ、MySQL の now() 関数はサーバー上の現在時刻を返すことに注意してください。
HTTP プロトコルはステートレスです。サーバーにリクエストを送信し、サーバーからデータを取得するだけで、他には何も知りません。同じ PHP ファイルが 2 回リクエストされたとしても、2 つのリクエストの間に関連性があるとは考えません。
HTTP プロトコルのステートレスな性質により、「現在の訪問者」情報を記録するなど、2 つの異なるリクエスト間で情報を共有することは不可能です。ユーザーのユーザー名とパスワードはログインプロセス中に正しいことが検証されますが、ユーザーが他のページにジャンプすると、ログインページから取得したすべてのユーザー情報が失われます。これはユーザーにとって望ましくないことです。同時に、ユーザーが各ページに入るときに認証のためにユーザー名とパスワードの入力を要求するのは非現実的であり、そのためには異なるページ間で情報を共有できる必要があります。
一般的に、PHP やその他の Web プログラミング言語の場合、Cookie またはセッションを使用してこの問題を解決できます。
Cookie はクライアントに保存される小さなファイルで、ページ間で共有する必要がある情報の一部をこのファイルに保存できます。ただし、Cookie には 3 つの欠点があります。1 つは、サイズが 4KB を超えることができないこと (ブラウザによって制限が異なる場合があります)、2 つ目は、ユーザーがブラウザの設定で Cookie を無効にできること、3 つ目は、Cookie がクライアントにデータを記録するため、安全性が低いことです。セッションは通常、Cookie を介して実装されます。ユーザーが Cookie を無効にすると、セッションも無効になります。 Cookie とは異なり、Session は Cookie を通じてクライアントに情報の識別情報を与えるだけですが、実際の情報はサーバーに保存されるため、セキュリティ パフォーマンスが大幅に向上します。現在、Cookie を使用せずにセッションを使用する別の方法、それが URL 書き換え技術です。このメソッドは、サービスと対話するための URL のパラメーターとしてセッション識別子を使用します。利点は、クライアントの Cookie の無効化によって制限されないことですが、欠点は、使用するのがより面倒であることです。
PHP でセッションを使用するのは非常に簡単です。 PHP は、セッションを処理するための自動グローバル変数 $_SESSION を提供します。ただし、PHP 設定ファイルにセッションを自動的に開始する設定がない場合は、セッションを使用する前に session_start() 関数を呼び出してセッションを開始する必要があることに注意してください。
login.php を再度開き、次の太字のコードを追加してユーザー情報を記録します。
<?php ...... if ($rs && $rs->num_rows > 0) { // 使用session保存当前用户 session_start(); $_SESSION['uid'] = $username; // 在实际应用中可以使用前面提到的重定向功能转到主页 $errmsg = "登录成功!"; // 更新用户登录信息 $ip = $_SERVER['REMOTE_ADDR']; // 获取客户端的IP $sql = "UPDATE t_user SET f_logintimes = f_logintimes + 1,"; $sql .= "f_lasttime=now(), f_loginip='$ip' "; $sql .= " WHERE f_username='$username'"; $db->query($sql); } ...... ?>
セッションを乱用しないでください。セッションの最大の役割は、ページ間の状態を維持することです。多くの初心者がセッション テクノロジを習得すると、データを保存するための魔法の武器としてセッションを使用し、大量のデータをセッションに配置することが簡単になります。このデータはセッションが終了するまで公開されないため、サーバーに大きな負担がかかります。
前のセクションでユーザー名をセッションに保存する作業が完了したため、ユーザーがログインしたかどうかを判断するのは非常に簡単です。コードは次のとおりです:
<?php session_start(); if (empty($_SESSION['uid'])) { echo "您还没有登录,不能访问当前页面!"; exit; } ?>
通过判断自动全局变$_SESSION中的uid是否为空,就可以判断用户是否已经登录。如果用户没有登录,就提示其无法访问当前页面,并终止程序的运行(或者使用一条重定向语句将页面导向登录页)。
相关推荐:
以上がPHPユーザーログイン検証モジュールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。