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クラスをインスタンス

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>

⑯パスワードが違う場合、テンプレート変数を表示

⑰ユーザー名が違う場合、テンプレート変数を表示

実行結果

f:id:mkyosuke:20191212192114p:plain

ユーザー名が違う場合

f:id:mkyosuke:20191212192354p:plain

パスワードが違う場合

f:id:mkyosuke:20191212192612p:plain

ユーザー名とパスワードがあっている場合(g.php)に遷移

f:id:mkyosuke:20191212193013p:plain