Help us understand the problem. What is going on with this article?

PHPでデータベースを使ってみるための備忘録

はじめに

LAMP環境を整えてPHP使っておきながらPHP内でのデータベースの使い方がわからなかったので、忘れないようにまとめておきます。

簡単なスタッフの追加ページぽい何かとスタッフ一覧ページぽいものを作りながら簡単にまとめておきます。

準備

phpMyAdminを使ってデータベースに簡単なスタッフ管理を想定したテーブルを作ります。
カラムは3つで「code,name.password」のカラムを作ります。このうちcodeを主キーにします。
データの方などは以下の画像を参照してください
Screenshot from 2020-03-26 10-00-20.png

作ってみる

スタッフ追加ページ

まずはスタッフ追加ページを作ります。
スタッフ名とパスワード・確認用パスワードを入力する欄をHTMLで用意します。

staff_add.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    スタッフ追加<br/>
    <br/>
    <form method="post" action="add_confirm.php">
        スタッフ名を入力してください<br/>
        <input type="text" name="name" style="width:200px"><br/>
        パスワードを入力してください<br/>
        <input type="password" name="pass" style="width:100px"><br/>
        パスワードをもう一度入力してください<br/>
        <input type="password" name="pass2" style="width:100px"><br/>
        <br/>
        <input type="submit" value="登録">
    </form>
</body>.
</html>

Screenshot from 2020-03-26 22-50-34.png

ここまでは大丈夫…
問題のデータベースは次から…

データベースに接続

何度もデータベース接続のコードを書くのが面倒なので、使いまわし用の関数を入れたphpファイルを作ります。

connect.php
<?php
// データベースに接続
function connectDB() {
    $dsn = 'mysql:dbname=データベース名;host=localhost;charset=utf8'; //データベース名とホスト名
    $user='root';   //データベースのユーザー名
    $password='****';    //データベースのパスワード
    try {
        $dbh = new PDO($dsn, $user,$password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
        return $dbh;

    } catch (PDOException $e) {         //  データベースに接続出来なかった場合の処理
        print'エラー';      //  エラーメッセージを表示して終了
        exit();
    }
}
?>

PDOオブジェクトを使ってデータベースに接続しています。
使い方はこちら(PDOを使ったPHPでのデータベース基本操作)を参考にさせていただきました。

入力データの確認

スタッフ追加ページのstaff_add.htmlで入力されたスタッフ名とパスワードの確認ページを作ります。
スタッフ名の未入力やパスワードと確認用パスワードが一致していない場合の処理も作っていきます。

add_confirm.php
<?php


    //staff_add.htmlからデータ受取
    $staff_name=$_POST['name'];
    $staff_password=$_POST['pass'];
    $staff_password2=$_POST['pass2'];

    //エスケープ処理
    $staff_name=htmlspecialchars($staff_name,ENT_QUOTES,'UTF-8');
    $staff_password=htmlspecialchars($staff_password,ENT_QUOTES,'UTF-8');
    $staff_password2=htmlspecialchars($staff_password2,ENT_QUOTES,'UTF-8');

    //以下、入力内容確認処理

    if($staff_name==''){
        print'スタッフ名が入力されていません。<br/>';
    }else{
        print'スタッフ名:';
        print $staff_name;
        print'<br/>';
    }

    if($staff_password!=$staff_password2){
        print'パスワードが一致しません。<br/>';

    }

    if($staff_name==''||$staff_password==''||$staff_password!=$staff_password2){
        //入力内容に問題があれば戻るボタンのみ表示
        ?>
        <form>
          <input type="button" onclick="history.back()" value="戻る">
        </form>
        <?php
    }else{
        //MD5方式でパスワードをハッシュ化
        $staff_password=md5($staff_password);
        ?>
        <form method="post" action="add_done.php">
          <input type="hidden" name="name" value="<?php print $staff_name;?>">
          <input type="hidden" name="pass" value="<?php print $staff_password;?>"><br/>
          <input type="button" onclick="history.back()" value="戻る">
          <input type="submit" value="登録">
        <form>
        <?php

    }
?>

エスケープ処理については以下を参考にしました。
PHPでエスケープが必要な時と方法を最短理解!
「何故htmlspecialcharsを通すのか?」を一言でどうぞ

データベースにレコードを追加

次は、前の画面で確認したスタッフ名とハッシュ化したパスワードを受け取って、データベースに追加する処理を作ります。

add_done.php
<?php

require_once 'connect.php';
$dbh = connectDB();

try {

    $staff_name=$_POST['name'];
    $staff_password=$_POST['pass'];
    //エスケープ処理
    $staff_name=htmlspecialchars($staff_name,ENT_QUOTES,'UTF-8');
    $staff_password=htmlspecialchars($staff_password,ENT_QUOTES,'UTF-8');

    $sql='INSERT INTO テーブル名(name,password) VALUES (?,?)';   //SQL命令文 入れたいデータは「?」
    $stmt=$dbh->prepare($sql);    //準備する命令
    $data[]=$staff_name;          //「?」にセットしたいデータを順番に書き出し
    $data[]=$staff_password;
    $stmt->execute($data);        //クエリの実行

    $dbh=null;      //データベース切断

    print $staff_name;
    print 'さんを追加しました。<br/>';

}catch(Exception $e){
    print'エラー';
    exit();
}

?>
<a href="staff_list.php">戻る</a>

これでどこかミスってなければデータベースにユーザー名とパスワードのレコードが追加されてるはず。
(passwordには「test」をハッシュ化したものが入ってます)
Screenshot from 2020-03-26 23-22-07.png

スタッフ一覧

せっかくなのでデータベースに追加したスタッフの一覧を表示させるページも作ります。

staff_list.php
<?php
require_once 'connect.php';
$dbh = connectDB();

try{
    $sql='SELECT name FROM テーブル名 WHERE 1'; 
    $stmt=$dbh->prepare($sql);
    $stmt->execute();

    $dbh=null;

    print'スタッフ一覧<br/>';
    while(true){
        $rec=$stmt->fetch(PDO::FETCH_ASSOC);
        if($rec==false){
            break;
        }
        print $rec['name'];
        print '<br/>';
    }

}catch(Exception $e){
    print 'エラー';
    exit();
}

?>
<br/>
<input type="button" onclick="location.href='./staff_add.html'" value="スタッフ追加">

最後に、最初に作ったスタッフ追加ページに飛ぶ飛ぶスタッフ追加ボタンもつけておきます。

Screenshot from 2020-03-26 23-28-00.png
出来た出来た。追加と表示しかしてないけどとりあえず出来た。

mono_taro
プログラミング初心者 元経営学部で現法学部のバリバリ文系男子です。 アウトプット用に作りました。 生暖かい目で見守って頂けたら幸いです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした