PHPで簡易ブログの作成②(新規登録・ログイン機能の実装、DBに保存)
こんにちは。おかひろです。
PHPの勉強も兼ねて簡易的なブログを作成しているのですが、その過程をブログに残そうと思いブログを書いています。
今回は新規登録・ログイン機能の実装とデータをDBに保存を行っていきます。
前回は投稿ページの作成したのでこちらの記事もどうぞ。
PHPで簡易ブログの作成➀(投稿ページの作成) - おかひろブログ
新規登録・ログイン機能の実装
やること
1.新規登録ページの作成。
2.ログインページの作成。
3.ログアウト機能の実装。
新規登録ページの作成
完成したのがこちら
新規登録ページでは名前、メールアドレス、パスワード、パスワード(確認用)を入力して登録します。パスワードは以下のプログラムでハッシュ化(ハッシュ関数で暗号化してデータベースに保存)させたあと登録するようにしています。
$password = password_hash($password, PASSWORD_DEFAULT);
以下のプログラムが新規登録ボタンが押されたらあとのプログラムです。各項目の入力チェック、パスワードが6文字以上、パスワードと確認用パスワードが同じかをチェックしています。エラーが無ければ、DBに接続・登録を行われるようになっています。
// 新規登録ボタンが押された時
if (isset($_POST["signup"])) {
if (empty($_POST["username"])){
$errorMessage = 'ユーザー名を入力してください。';
}
else if (empty($_POST["email"])) {
$errorMessage = 'メールアドレスを入力してください。';
}
else if (empty($_POST["password"])) {
$errorMessage = 'パスワードを入力してください。';
}
else if (mb_strlen($_POST["password"]) < 6) {
$errorMessage = 'パスワードは6文字以上で設定してください。';
}
else if (empty($_POST["password2"])) {
$errorMessage = '確認用パスワードを入力してくださいです。';
}
else if($_POST["password"] != $_POST["password2"]) {
$errorMessage = 'パスワードに誤りがあります。';
}
else {
$conn=mysqli_connect('localhost','root','') or exit("MySQLへ接続できません。");
mysqli_select_db($conn,'blog') or exit("データベース名が間違っています。");
$sql="SELECT * FROM users where userName='{$username}';";
$result=mysqli_query($conn,$sql) or exit("データの抽出に失敗しました。");
if(mysqli_num_rows($result)!=0){ ?>
<div class="alert alert-danger" role="alert"><?php echo $username ?>は登録済みです。もう一度別の名前で登録してください。</div>
<?php }
else{
$sql = "INSERT INTO users(username,email,password) VALUES('$username','$email','$password')";
$result=mysqli_query($conn,$sql) or exit("データの書き込みに失敗しました。"); ?>
<div class="alert alert-success" role="alert">登録しました。</div>
<?php
}
mysqli_close($conn);
}
}
?>
PHPとMySQLで新規登録とログインを実装する(PDO使用) - Qiita
以下のプログラムで同じユーザー名が存在するかを確認しています。
$sql="SELECT * FROM users where userName='{$username}';";
また、以下が新規登録を行うプログラムになります。
$sql = "INSERT INTO users(username,email,password) VALUES('$username','$email','$password')";
ログインページの作成
完成したのがこちら
ログインページではメールアドレスとパスワードを入力するようにしており、以下のコードでハッシュ化されたパスワードとidをデータベースと照らし合わせてログインするようにしています。一致しない場合はエラーがでるようになっています。
if(password_verify($password, $db_hashed_pwd)) {
$_SESSION['user'] = $id;
header("Location: home.php");
exit;
} else { ?>
<div class="alert alert-danger" role="alert">メールアドレスとパスワードが一致しません。</div>
<?php }
} ?>
ログアウト機能の実装
ログインページへのリンクのためログアウトボタンを設置しています。
<?php
session_start();
if(isset($_GET['logout'])) {
session_destroy();
unset($_SESSION['user']);
header("Location: login.php");
} else {
header("Location: login.php");
}
以下のプログラムでセッションに登録されたデータを破棄しています。
session_destroy();
データをDBに保存
ユーザー情報、投稿内容をDBに保存するためにデータベースとテーブルを作成します。
データベースの作成
以下のSQL文でデータベースを作成します。
CREATE DATABASE blog DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
テーブルの作成
今回はユーザー情報を保存するテーブルと投稿内容を保存するテーブルを作成しました。
//ユーザー情報を保存
CREATE TABLE blog. users (
id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , username VARCHAR( 64 ) NOT NULL , email VARCHAR( 128 ) NOT NULL , password VARCHAR( 100 ) NOT NULL , );
password VARCHAR(100)はハッシュ化するため長めに設定しています。
//投稿内容を保存
CREATE TABLE blog. posts (
id INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
user_id INT( 11 ) NOT NULL ,
title VARCHAR( 128 ) NOT NULL ,
form VARCHAR( 64 ) NOT NULL ,
name VARCHAR( 64 ) NOT NULL ,
body TEXT NOT NULL ,
create_at TIMESTAMP NOT NULL ,
updated_at TIMESTAMP NOT NULL
);
user_idはusersテーブルとpostsテーブルを紐づけるために設定しています。titleはタイトル、formはカテゴリー、nameは投稿者、bodyは本文、create_atは投稿日、updated_atは更新日を保存するようにしています。
usersテーブルとpostsテーブルを紐づける処理
ログインユーザーが投稿した記事が分かるようにテーブル同士を紐づける処理を行いました。
<?php
session_start();
include_once 'dbconnect.php';
$query = "SELECT * FROM users WHERE id=".$_SESSION['user']."";
$result = $mysqli->query($query);
while($row = $result->fetch_assoc()) {
$user_id = $row['id'];
}
if(isset($_POST['action'])) {
$title = $mysqli->real_escape_string($_POST['title']);
$form = $mysqli->real_escape_string($_POST['form']);
$name = $mysqli->real_escape_string($_POST['name']);
$body = $mysqli->real_escape_string($_POST['body']);
$sql = "INSERT INTO posts(user_id,title,form,name,body,create_at) VALUES('$user_id','$title','$form' ,'$name', '$body', now())";
if($mysqli->query($sql)) { ?>
<!--<div class="alert alert-success center-block" role="alert" style="width:60%;">投稿が完了しました。</div>-->
<?php }else { ?>
<div class="alert alert-danger" role="alert">エラーが発生しました。</div>
<?php
}
}
$mysqli->close();
?>
以下のプログラムでユーザーidを取り出す処理をしています。
$query = "SELECT * FROM users WHERE id=".$_SESSION['user']."";
$result = $mysqli->query($query);
while($row = $result->fetch_assoc()) {
$user_id = $row['id'];
}
以下のプログラムで情報をDBに保存する処理をしています。
$sql = "INSERT INTO posts(user_id,title,form,name,body,create_at) VALUES('$user_id','$title','$form' ,'$name', '$body', now())";
if($mysqli->query($sql)) { ?>
<!--<div class="alert alert-success center-block" role="alert" style="width:60%;">投稿が完了しました。</div>-->
<?php }else { ?>
<div class="alert alert-danger" role="alert">エラーが発生しました。</div>
<?php
}
まとめ
今回は新規登録・ログイン機能の実装とデータをDBに保存を行いました。
いろいろなサイトを参考にして書いているので、効率の悪い書き方や間違っているところもあると思います。気付いた方はコメントいただければ幸いです。