Smartyを使ってログイン
g_login2.php
<?php
session_start();
$db = new PDO("mysql:host=localhost;dbname=db","root","");
$errorMessagePASS =""; ①~
$errorMessageUSER =""; ~①
if (isset($_POST['login'])) { ②
$u =htmlspecialchars($_POST['user'],ENT_QUOTES); ③~
$p =htmlspecialchars($_POST['pass'],ENT_QUOTES); ~③
$ps=$db->query("SELECT pas FROM table2 WHERE id='$u'"); ④
if ($ps->rowCount()>0) ⑤
{ $r =$ps->fetch(); ⑥
if($r['pas']===md5($p)){ ⑦
$_SESSION['us']= $u; ⑧
header("Location: ./g.php"); ⑨
}else{
session_destroy(); ⑩
$errorMessagePASS = 'パスワードが違います。';
}
}else{
session_destroy(); ⑪
$errorMessageUSER ='ユーザーが登録されていません。';
}
}
require( dirname( __FILE__ ).'/libs/Smarty.class.php' ); ⑫~
$smarty = new Smarty(); ~⑫
$smarty->template_dir = dirname( __FILE__ ).'/templates'; ⑬~
$smarty->compile_dir = dirname( __FILE__ ).'/templates_c'; ~⑬
$smarty->assign('errorMessagePASS', $errorMessagePASS); ⑭~
$smarty->assign('errorMessageUSER', $errorMessageUSER); ~⑭
$smarty->display('g_login.tpl'); ⑮
?>
①エラーメッセージの初期化
②submitで送信した場合if文に入る
③htmlspecialchars関数で、入力してきたユーザー名、パスワードをエスケープ処理
④PDOStatementのqueryメソッドでtable2のユーザー名で検索し、パスワードの情報をSELECTする
⑤PDOStatementのrowCountメソッドは結果の行数を返し、0より大きければ(id='$u'が存在)登録されたユーザーであると判断
⑥PDOStatementのfetchメソッドによりレコードを取り出し、$rに格納。
⑦ハッシュ化させたパスワードと入力してきたパスワードを厳密に比較する
⑧セッション変数「us」にユーザー名($u)を代入
⑨次のページ(g.php)にリダイレクト
⑩パスワードが一致しない場合は、セッションを破棄
⑪ユーザーが一致しない場合は、セッションを破棄
⑬Smartyオブジェクトの設定
⑭必要なテンプレート変数をセット
⑮テンプレートの呼び出し(実行)
g.login.tpl
<HTML>
<HEAD>
<META HTTP EQUIV='Content-Type' CONTENT='text/html;charset=UTF-8'>
<TITLE>ログイン画面</TITLE>
</HEAD>
<BODY>
<P STYLE='color: red'>ABC写真</P>
ログインしてください<br>
<FORM ACTION="" METHOD="post">
ユーザ名<INPUT TYPE='text' NAME='user' SIZE ='30'><br>
パスワード<INPUT TYPE="password" NAME ="pass" SIZE ="30">
<INPUT TYPE ="submit" ID="login" NAME="login" VALUE="送信">
<P>{$errorMessagePASS}</P> ⑯
<P>{$errorMessageUSER}</P> ⑰
</FORM>
</BODY>
</HTML>
⑯パスワードが違う場合、テンプレート変数を表示
⑰ユーザー名が違う場合、テンプレート変数を表示
実行結果
ユーザー名が違う場合
パスワードが違う場合
ユーザー名とパスワードがあっている場合(g.php)に遷移