ECサイトを作成するにあたって、ログイン保持機能が必要です。ログインせずにページにアクセスするとログインを要求するように設計する必要があったのでメモを残します。
作りたいもの
- ログイン保持機能
- ログイン中は常にユーザの名前がサイドメニューに表示される
- ログインしないでサイトにアクセスしようとするとログインページでログインを要求する
ログイン時の処理
login.php
でログインに成功したとき、以下の処理を行います。
<?php
session_start();
//ログインボタンが押されたときの処理
if($_SERVER["REQUEST_METHOD"]==="POST" && $_SERVER['HTTP_REFERER']=="http://localhost/EC/login.php"){
$_SESSION = $_POST;
if(isset($_SESSION['email']) && isset($_SESSION['pass'])){
$val= new Validation();
$email=$_SESSION['email'];
$error=$val->login_check($email,$_SESSION['pass']);
}
}
?>
login_check()
関数はユーザの有無を判定する関数で、以下のように定義しています
<?php
public function login_check($email,$pass){
$hostname = "localhost"; //ホスト名
$userid = "iimori"; //データベースユーザ名
$passwd = "password"; //接続パスワード
$dbname = "databasename"; //データベース名
$con=mysqli_connect($hostname,$userid,$passwd,$dbname); //db接続に必要な情報を変数に入れる
// 接続状況をチェックします
if (mysqli_connect_errno()) {
die("データベースに接続できません:" . mysqli_connect_error() . "\n");
}
$isUserExist=0;
$isCorrectPass=0;
$error="";
$con->set_charset('utf8');
$query = 'SELECT id,name,email,password FROM user';
$result = $con->query($query);
// クエリを実行します。
if (!$result) {
echo $con->error;
exit();
}
while($row=$result->fetch_array(MYSQLI_ASSOC)){
$rows[] = $row;
}
foreach($rows as $row){
if($row['email']==$email){
$isUserExist=1;
if($row['password']==$pass){
$isCorrectPass=1;
$_SESSION['name']=$row['name'];
$_SESSION['id']=$row['id'];
}
}
}
if($isUserExist==0){
$error="入力されたメールアドレスは登録されていません。";
}else{
if($isCorrectPass==0){
$error="パスワードが違います。";
}else{
header('Location:product_list.php');
exit;
}
}
return $error;
// 接続を閉じます
mysqli_close($con);
}
?>
この関数内で、ログインに成功したときにユーザ情報が入っているデータベースからユーザIDとユーザの名前を$_SESSION['id']
と$_SESSION['name']
に格納しています。
この変数を利用してログイン状態の判定をします。
ログイン状態の判定
ログイン後に遷移するページには以下の処理を記述します。
<?php
if(isset($_SESSION['name'])){
echo "ようこそ、".$_SESSION['name']."さん!";
}else{
header('Location:login.php');
exit;
}
?>
ログインしていなければ$_SESSION['name']
には値が入っていないので、ログインページに遷移してくれます。
ログイン後のページ全てにこれを記述することで、ログインなしではアクセスできなくなります。