おかひろブログ

自由な生き方をするためにエンジニアを選択した

MENU

PHPで簡易ブログの作成②(新規登録・ログイン機能の実装、DBに保存)

f:id:ay-or-ih6039:20180513113625p:plain

こんにちは。おかひろです。
PHPの勉強も兼ねて簡易的なブログを作成しているのですが、その過程をブログに残そうと思いブログを書いています。

今回は新規登録・ログイン機能の実装とデータをDBに保存を行っていきます。

前回は投稿ページの作成したのでこちらの記事もどうぞ。
PHPで簡易ブログの作成➀(投稿ページの作成) - おかひろブログ

 

 

新規登録・ログイン機能の実装

 
やること
1.新規登録ページの作成。
2.ログインページの作成。
3.ログアウト機能の実装。

 

新規登録ページの作成

完成したのがこちら

f:id:ay-or-ih6039:20180512200543p:plain

 新規登録ページでは名前、メールアドレス、パスワード、パスワード(確認用)を入力して登録します。パスワードは以下のプログラムでハッシュ化(ハッシュ関数で暗号化してデータベースに保存)させたあと登録するようにしています。

$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')";

 

ログインページの作成

完成したのがこちら

f:id:ay-or-ih6039:20180512222454p:plain

 ログインページではメールアドレスとパスワードを入力するようにしており、以下のコードでハッシュ化されたパスワードと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 }

} ?>

 

 ログアウト機能の実装

ログインページへのリンクのためログアウトボタンを設置しています。

f:id:ay-or-ih6039:20180512234703p:plain

<?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に保存を行いました。

いろいろなサイトを参考にして書いているので、効率の悪い書き方や間違っているところもあると思います。気付いた方はコメントいただければ幸いです。

PHPで簡易ブログの作成➀(投稿ページの作成)

f:id:ay-or-ih6039:20180430120730p:plain

こんにちは。おかひろです。
11月にエンジニアに転職して約半年が経ちました。独学と実際に現場に入ってプログラミングをすることの違いに戸惑いながら仕事をしています。

 

はじめに

現在、PHPを勉強中のPHP初心者がスキルの習得も兼ねて簡易的なブログを作成してみようと思います。
その過程をブログに書いていきます。

今回作成する簡易ブログはフレームワークを使わず素のPHPで作っていきます。フレームワーク(CakePHP)を使うことも考えたのですが詰めすぎるのも良くないのとSQLの勉強も兼ねたいと思いフレームワークを使わないことにしました。

 

開発準備

開発環境の構築を行います。
今回はPHP・Apache(Webサーバ)・MySQL(SQLデータベースサーバ)を一括で導入できる「XAMPP」を使用しています。
「XAMPP」をインストールすることによってローカル環境上でプログラムを実行させる環境が整います。

 

今回の目標

簡易ブログの機能としては記事一覧、記事ページ、記事投稿機能、記事編集、ログインを作成して+αで機能を追加していこうと考えています。

記事投稿ページの作成

やることは
1.投稿フォームを用意する。
2.確認画面を用意する。
3.完了ページを用意する。
投稿フォームの項目は記事タイトル、記事本文、記事カテゴリー、投稿者にします。
また、記事カテゴリーはセレクトボックスとして開発、組織・チーム、インフラ、最新情報の4項目としています。

完成したのがこちら

1.投稿フォーム

f:id:ay-or-ih6039:20180429202352p:plain

2.確認画面

f:id:ay-or-ih6039:20180429202419p:plain

3.完了ページ

f:id:ay-or-ih6039:20180429202440p:plain

 

画面遷移とバリデーションについて

投稿ページを作成するにあたり苦戦した所を書いています。

画面遷移

1つのファイルで入力(バリデーションチェック)→確認→完了の処理をさせる。
はじめは入力画面、確認画面、完了画面をそれぞれのファイルで処理をさせていたのですが値の受け渡しが面倒だなと思いいろいろ調べていると条件分岐(if文)を使えば1つのファイルで処理することが出来る事がわかり試してみました。
1つのファイル内で条件分岐させて条件1の時は入力画面を表示、
条件2の時は確認画面を表示、条件3の時は完了画面を表示させるといった処理をさせることにしました。
今回の場合だとif文で確認画面、elseif文で完了画面、else文で入力画面を表示させるようにしています。

 

バリデーションの処理

バリデーションとはフォームから入力した値をチェックしてエラー表示する機能です。

バリデーションはフロントサイドでチェックした場合でもフロントのソースはいじろうと思えばいじれてしまうため、必須条件をクリアできてしまうので必ずサーバーサイドでもチェックをするようにしないといけません。

今回は「入力内容を確認する」ボタンを押下されることによってバリデーションチェックが行われ、チェック項目にエラーが無ければ確認画面に遷移する。
エラーが有れば入力画面に遷移するようにしています。

 

f:id:ay-or-ih6039:20180429203123p:plain

 参考にしたサイト

入力値のバリデーション | GRAYCODE PHPプログラミング

 

改良点

1つのファイルで処理させてしまった事での弊害

1つのファイルで入力→確認→完了の処理をさせいるためコードが長くなってしまった。今回は個人で作っているのですが、チームで開発するなど他の人が見たときに分かりにくいコードになっているので混乱してしまうかもしれません。なので入力+確認画面と完了画面とでファイルを分けるようにしたいと思います。

 

今回は以上です。

次回作業は投稿内容をDBに保存、アカウント登録画面を作っていきます。

 

プログラミングスクールの前にUdemyは低予算でプログラミングが勉強できるから利用してみて!

どうも!おかひろです。

未経験からエンジニアに転職するにあたりプログラミング技術を習得しようとプログラミングスクールに通うことを検討されている方も多いと思います。

ただ、プログラミングスクールて最低でも10万円以上する高額な買い物なんですよね。

私も転職する前に30万円以上するオンラインのプログラミングスクールを利用しました。正直、痛い出費でした(笑)

そして、いざプログラミングスクールを利用してもカリュキュラムについていけない、オリジナルアプリの作成ができないなどになってしまうと非常にもったいないです。

 

そこで今回はプログラミングスクールの前に是非とも利用してもらいたい『Udemy』というサービスについて紹介します。

Udemyを利用することで高いお金を払わずにプログラミングを学べたり面接の時にアピールすることもできます。

 

続きを読む

未経験者がエンジニアに転職するためにプログラミングスクールを利用すべきか?

どうも!転職活動中のおかひろです。

 今回は、タイトルにもあるように未経験からエンジニアに転職するためにプログラミングスクールを利用した方がいいのか?について書いていきます。

実際、私も転職するにあたりプログラミングスクールを受講しました。そして、オリジナルWebアプリも作りました。

しかし、プログラミングスクールを利用しようとすると何十万てお金がかかるんですよね。金銭的な余裕がない人にとっては辛い。

なので、スクールを利用することに悩んでいる方の少しでも参考になればと思います。

続きを読む

IT未経験がフリーランスエンジニアになれるのか?その方法とは?

どうも!おかひろです。

 私は、未経験からエンジニアに転職し、いずれフリーランスとして働くことを目指しています。

フリーランスになれば、会社に依存しない働き方、場所や時間に捉われない生活、自由な生き方ができるようになります。

このことは、自己紹介でも書いています。

自己紹介・ブログについて② - おかひろブログ

 

今回は

どうしたらIT未経験がフリーランスエンジニアになれるのか?

フリーランスエンジニアのなる方法

について書いていきます。

続きを読む

自己紹介・ブログについて②

どうも!

このブログを運営しているおかひろです!

 

自己紹介・ブログについて - おかひろブログ

↑こちらの記事が自己紹介になっていないので、改めてここで自己紹介をしたいと思います。

続きを読む

目標を言わないほうがいい!でもその目標、心から達成したいと思ってる?

どうも!おかひろです。

 

みなさんは目標を立てた時に誰かに言いますか?

 

半年までに、〇〇kg痩せる

〇〇大学に合格する

〇〇の資格をとる

など目標を公言することで自分を追い込み、目標を達成してしまうという考えで、誰かに言うこともあるのではないでしょうか。

 

しかし、目標を誰かに言ってしまうとその達成率が下がるという驚きの実験結果がでているのをご存知でしょうか。

 

続きを読む

人生とは決断の連続であり、決断に失敗なんてない!

f:id:ay-or-ih6039:20170629215343j:plain

こんにちは!おかひろです。

 

私は、32歳で未経験からエンジニアに転職を目指しています。

そして今回は、エンジニアに転職するにあたり転職エージェントと面談に行ってきたのですが、その後に感じたことを書いていきます。

 

面談は20時過ぎからスタートし、 まず私の経歴、今後のことについて話をしました。

そして、エージェントから始めに言われたことが

続きを読む

ホワイト企業なのに会社を辞めたくなった理由をまとめてみた

f:id:ay-or-ih6039:20170701150315j:plain

どうも!おかひろです!

 

突然ですが、みなさんは「会社を辞めたい・・・。」でも、なかなか言い出せない。

このようなことで悩んだ経験はないですか?

 

 

はい、まさに私が悩んでいます。

今の会社を4年勤めているのですが、1年前ぐらいから辞めたいと思いながら働いています。

しかし、なかなか踏み切れずにいました。

 

 そこで今回は

・会社を辞めたくなった理由

・辞めたいと思っているけど辞めれない

・辞める決意をした

について書いていきます。

続きを読む

他者評価を気にせず、自己責任で生きていくことの重要性とは

f:id:ay-or-ih6039:20170701162331j:plain

どうも!おかひろです。

誰かに依存して不安やイライラしたことはないですか?

対人関係や会社にいても『依存しているな』て思うことはないですか?

 例えば

・自分でも出来る仕事を任せてしまう。

・がんばりを認めてもらえない。

・悪いにのは自分だけではないと思ってします。

・自分の都合のいいように解釈してしまう。

・他人の目が気になる。

 このような行動をとっていると自分の考えていることに対して違うことをされるとイライラしたり、不安になってしまいますよね。

 これらは他人の行動、評価が気になることからくるのではないでしょうか?

続きを読む

転職する理由は人生を本気で生きるため

f:id:ay-or-ih6039:20170629232935j:plain

どうも!おかひろです!

 

転職を決めたもののなかなか辞めることができていません笑

 

エンジニアに転職をするぞー!と決意したのですが、不安になることがあります。

転職を経験されたことがある方は、一度は不安になったことがあるのではないでしょうか。

今回はその不安や不安に打ち勝つ方法をまとめてみました。

続きを読む

自炊は節約になっているのか?時間を有効活用しよう!

f:id:ay-or-ih6039:20170623003409j:plain

 

どうも!おかひろです! 

突然ですが・・・

一人暮らしを始めて8か月ぐらいなるのですが、自炊することをやめました!笑

一人暮らしを始めた当初は自炊をして、食費を節約するぞ!と考えていましたよ。

でも半年ぐらいして気づいたんですよね。自炊が本当に節約になっているのか?

 

「めんどくさくなっただけやろ」と思われる方もいると思うので、自炊がどれだけコスパが悪いかを書いていきたいと思います。

続きを読む