shinke1987.net
雑多な備忘録等のはず。
他のカテゴリ・タブ
目次
PR

PHPでデータベースを扱う

2023-05-27 2023-05-27
カテゴリ: PHP

環境

XAMPP for Windows 8.2.4

参考Webページ

テスト用テーブル作成

参考Webページから、こんな感じのダミーデータのCSVを取得する。

1,植木里奈,ウエキリナ,女,0844385187,1964/05/14
2,堀井康正,ホリイヤスマサ,男,0757176326,1982/07/23
3,永島安男,ナガシマヤスオ,男,0879535416,2000/03/20
4,高田康善,コウダヤスヨシ,男,0188902927,1976/06/19
5,竹本一磨,タケモトカズマ,男,0942815128,2000/11/25
6,茂木冨士子,モギフジコ,女,0442779966,1989/11/20
7,中山孝男,ナカヤマタカオ,男,0744082304,1984/09/21
8,矢沢翔子,ヤザワショウコ,女,0998049457,1965/07/18
9,山中良和,ヤマナカヨシカズ,男,0292720584,1965/10/18
10,土谷喜市,ツチヤキイチ,男,0276788454,1999/01/24

PowerShellからmysqlコマンドを利用しログインして、
use コマンドで(文字エンコードがUTF-8になっている)DBへ接続し、
次のコマンドを実行する。

> create table DBTest (id int primary key auto_increment, name_kanji varchar(255) not null, name_katakana varchar(255) not null, sex char(1) default '男', tel varchar(255) not null, birthday date not null);

確認のために次のコマンドを実行すると、

> show fields from DBTest;

次のように表示される。

+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id            | int(11)      | NO   | PRI | NULL    | auto_increment |
| name_kanji    | varchar(255) | NO   |     | NULL    |                |
| name_katakana | varchar(255) | NO   |     | NULL    |                |
| sex           | char(1)      | YES  |     | 男      |                |
| tel           | varchar(255) | NO   |     | NULL    |                |
| birthday      | date         | YES  |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
6 rows in set (0.016 sec)

ダミーデータをDBTestテーブルへ挿入するために次のコマンドを実行する。

> load data local infile 'CSVファイルの絶対パス。\記号は\\とエスケープ処理が必要' into table DBTest fields terminated by ',';

ダミーデータが挿入されたことを確認するために、次のコマンドを実行すると、

> select * from DBTest;

次のように表示されて、無事挿入できたことを確認できる。

+----+------------+------------------+------+------------+------------+
| id | name_kanji | name_katakana    | sex  | tel        | birthday  |
+----+------------+------------------+------+------------+------------+
|  1 | 植木里奈   | ウエキリナ       | 女   | 0844385187 | 1964-05-14 |
|  2 | 堀井康正   | ホリイヤスマサ   | 男   | 0757176326 | 1982-07-23 |
|  3 | 永島安男   | ナガシマヤスオ   | 男   | 0879535416 | 2000-03-20 |
|  4 | 高田康善   | コウダヤスヨシ   | 男   | 0188902927 | 1976-06-19 |
|  5 | 竹本一磨   | タケモトカズマ   | 男   | 0942815128 | 2000-11-25 |
|  6 | 茂木冨士子 | モギフジコ       | 女   | 0442779966 | 1989-11-20 |
|  7 | 中山孝男   | ナカヤマタカオ   | 男   | 0744082304 | 1984-09-21 |
|  8 | 矢沢翔子   | ヤザワショウコ   | 女   | 0998049457 | 1965-07-18 |
|  9 | 山中良和   | ヤマナカヨシカズ | 男   | 0292720584 | 1965-10-18 |
| 10 | 土谷喜市   | ツチヤキイチ     | 男   | 0276788454 | 1999-01-24 |
+----+------------+------------------+------+------------+------------+

動作確認用コード

概要

次の3点のファイルを適宜配置して、Webブラウザからアクセスし、
場合によってはPowerShellのmysqlコマンドからSELECT文を実行することで確認できる。

DBTest.php

<?php
// DBの種類、DB名、DBサーバのIPアドレス、文字エンコードを指定。
$dsn = 'mysql:dbname=selfphp; host=127.0.0.1; charset=utf8';
// DBのユーザ名。
$usr = 'selfusr';
// 上記DBユーザ名でログインする時のパスワード。
$passwd = 'selfpass';
?>

<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="UTF-8">
        <title>DBTest.php</title>
    </head>
    <body>
        <?php
            try {
                // DB抽象化を担当するPDOクラスのインスタンス生成。
                $db = new PDO($dsn, $usr, $passwd);

                // 例外を発生させることでエラーを通知するよう設定。PHPのバージョンで規定が違うらしいので念のため指定。
                $db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                // 持続的接続を有効にすることで、アクセス数が多いサイトではパフォーマンス改善が期待できる。
                // 持続的接続はスクリプトが終了しても、DBへの接続が維持され、
                // 他から要求があった場合には、維持された接続を再利用する接続のこと。
                // 持続的接続を有効にするには、下記1行で可能。またはPDOクラスのインスタンス生成時に指定可能。
                $db -> setAttribute(PDO::ATTR_PERSISTENT, true);

                // PDOクラスのインスタンス生成 = DBへ接続完了なので、結果を表示。
                print('<b>接続に成功しました</b><br><br>');

                // 不正なSQL文で、わざとエラーを表示させる。
                $db -> exec('aiueo');
                
            } catch (PDOException $e) {
                // errorInfoに拡張エラー情報が入っている。
                // 要素0に、ANSI SQL92 SQLSTATEのエラーコードが入っている。
                // 正常終了なら000000のエラーコード。
                // その他のエラーコードは、「ANSI SQL92 SQLSTATE」で検索すれば出てくる。
                print("エラーコード:{$e -> errorInfo[0]}<br>");

                // 要素1に、ドライバ固有のエラーコードが入っている。
                print("ドライバ固有のエラーコード:{$e -> errorInfo[1]}<br>");

                // 要素2に、ドライバ固有のエラーメッセージが入っている。
                print("ドライバ固有のエラーメッセージ:{$e -> errorInfo[2]}<br><br>");

                // メッセージを表示する。
                // die("<b>接続エラー:{$e -> getMessage()}</b><br><br>");
                print("<b>接続エラー:{$e -> getMessage()}</b><br><br>");
                
            } finally {
                $db = null;
            }
        ?>
        <hr>
        <br>
        <b>データを登録するためのフォーム</b><br>
        <form method="post" action="DBTest2.php">
            <label for="name_kanji">名前(漢字)</label><br>
            <input id="name_kanji" type="text" name="f_name_kanji"><br>
            <br>
            <label for="name_katakana">名前(カタカナ)</label><br>
            <input id="name_katakana" type="text" name="f_name_katakana"><br>
            <br>
            <label>性別</label><br>
            <input type="radio" name="f_sex" value="男" checked>男
            <input type="radio" name="f_sex" value="女">女
            <br><br>
            <label for="tel">電話番号(数値のみ)</label><br>
            <input id="tel" type="text" name="f_tel"><br>
            <br>
            <label for="birthday">誕生日</label><br>
            西暦<input id="birthday" type="text" name="f_birthday1">年&nbsp;
            <input type="text" name="f_birthday2">月&nbsp;
            <input type="text" name="f_birthday3">日<br>
            <br><br>
            <input type="submit" value="登録">
        </form>
    </body>
</html>

DBTest2.php

<?php
// DBの種類、DB名、DBサーバのIPアドレス、文字エンコードを指定。
$dsn = 'mysql:dbname=selfphp; host=127.0.0.1; charset=utf8';
// DBのユーザ名。
$usr = 'selfusr';
// 上記DBユーザ名でログインする時のパスワード。
$passwd = 'selfpass';
?>

<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="UTF-8">
        <title>DBTest2.php</title>
    </head>
    <body>
        <?php
            try {
                // PDOクラスのインスタンス生成時に使用するオプション関連の配列。
                $pdo_options = [
                    'ATTR_ERRMODE' => 'PDO::ERRMODE_EXCEPTION',
                    'ATTR_PERSISTENT' => true,
                ];

                // PDOクラスのインスタンス生成。
                $db = new PDO($dsn, $usr, $passwd, $pdo_options);

                // PDOクラスのインスタンス生成 = DBへ接続完了なので、結果を表示。
                print('<b>接続に成功しました</b><br><br>');

                // INSERTコマンドの準備。
                $stt = $db -> prepare(
                    'INSERT INTO DBTest(name_kanji, name_katakana, sex, tel, birthday) VALUES(:name_kanji, :name_katakana, :sex, :tel, :birthday)'
                );

                // POST内容確認のための出力。
                print("f_name_kanji : {$_POST['f_name_kanji']}<br>");
                print("f_name_katakana : {$_POST['f_name_katakana']}<br>");
                print("f_sex : {$_POST['f_sex']}<br>");
                print("f_tel : {$_POST['f_tel']}<br>");
                print("f_birthday1 : {$_POST['f_birthday1']}<br>");
                print("f_birthday2 : {$_POST['f_birthday2']}<br>");
                print("f_birthday3 : {$_POST['f_birthday3']}<br>");

                // 名前付きパラメータでのプレイスホルダーを利用して、INSERTコマンドにPOSTデータの内容をセット。
                // 名前無しパラメータは「?」を埋込先に使い、埋め込む時には数値で指定する。
                $stt -> bindValue(':name_kanji', $_POST['f_name_kanji']);
                $stt -> bindValue(':name_katakana', $_POST['f_name_katakana']);
                $stt -> bindValue(':sex', $_POST['f_sex']);
                $stt -> bindValue(':tel', $_POST['f_tel']);
                $stt -> bindValue(':birthday', $_POST['f_birthday1'] . '/' . $_POST['f_birthday2'] . '/' . $_POST['f_birthday3']);

                // トランザクション開始。
                $db -> beginTransaction();

                // INSERTコマンドを実行。
                $stt -> execute();

                // トランザクションをコミット。
                $db -> commit();

                // INSERTコマンドが成功したことを表示。
                print("<b>INSERTコマンド成功</b><br><br>");

                // 最後に実行したINSERTコマンドで使われたオートインクリメントの値を表示。
                print("最後のID値:{$db -> lastInsertId()}<br><br>");

            } catch (PDOException $e) {
                // errorInfoに拡張エラー情報が入っている。
                // 要素0に、ANSI SQL92 SQLSTATEのエラーコードが入っている。
                // 正常終了なら000000のエラーコード。
                // その他のエラーコードは、「ANSI SQL92 SQLSTATE」で検索すれば出てくる。
                print("エラーコード:{$e -> errorInfo[0]}<br>");

                // 要素1に、ドライバ固有のエラーコードが入っている。
                print("ドライバ固有のエラーコード:{$e -> errorInfo[1]}<br>");

                // 要素2に、ドライバ固有のエラーメッセージが入っている。
                print("ドライバ固有のエラーメッセージ:{$e -> errorInfo[2]}<br><br>");

                // メッセージを表示する。
                // die("<b>接続エラー:{$e -> getMessage()}</b><br><br>");
                print("<b>接続エラー:{$e -> getMessage()}</b><br><br>");
                
            } finally {
                $db = null;
            }
        ?>
        <hr>
    </body>
</html>

DBTest3.php

<?php
// DBの種類、DB名、DBサーバのIPアドレス、文字エンコードを指定。
$dsn = 'mysql:dbname=selfphp; host=127.0.0.1; charset=utf8';
// DBのユーザ名。
$usr = 'selfusr';
// 上記DBユーザ名でログインする時のパスワード。
$passwd = 'selfpass';
// DBから取得した1人分のデータが入るクラス。 
class Member {
    public $id;
    public $name_kanji;
    public $name_katakana;
    public $sex;
    public $tel;
    public $birthday;
}
?>

<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="UTF-8">
        <title>DBTest3.php</title>
    </head>
    <body>
        <?php
            try {
                // PDOクラスのインスタンス生成時に使用するオプション関連の配列。
                $pdo_options = [
                    // エラーがあれば例外を発生させるように指定。
                    'ATTR_ERRMODE' => 'PDO::ERRMODE_EXCEPTION',
                    // 持続的接続をONに指定。
                    'ATTR_PERSISTENT' => true,
                ];

                // PDOクラスのインスタンス生成。
                $db = new PDO($dsn, $usr, $passwd, $pdo_options);

                // PDOクラスのインスタンス生成 = DBへ接続完了なので、結果を表示。
                print('<b>接続に成功しました</b><br><br>');

                // SELECTコマンドの準備。
                $stt = $db -> prepare('SELECT * FROM dbtest');

                // SELECTコマンドの実行。
                $stt -> execute();

                print("<b>fetch(PDO::FETCH_ASSOC)を利用して表示</b><br>");
                while($row = $stt -> fetch(PDO::FETCH_ASSOC)) {
                    print("{$row['id']} : {$row['name_kanji']} : {$row['name_katakana']} : {$row['sex']} : {$row['tel']} : {$row['birthday']}<br>");
                }

                // 再度SELECtコマンドを実行。
                $stt -> execute();
                print("<br>");
                print("<b>fetchAll(PDO::FETCH_ASSOC)を利用してprint_r関数で表示</b><br>");
                print_r($stt -> fetchAll(PDO::FETCH_ASSOC));

                print("<br><br>");
                print("<b>テーブルに対応するクラスを作成し、そこに情報を格納</b><br>");
                // 再度SELECTコマンドを実行。
                $stt -> execute();

                // DBの情報をMemberクラスのインスタンスに格納。
                while ($row = $stt -> fetchObject('Member')) {
                    print("ID : {$row -> id} / 名前(漢字) : {$row -> name_kanji} / 名前(カタカナ) : {$row -> name_katakana} / 性別 : {$row -> sex} / 電話番号 : {$row -> tel} / 誕生日 : {$row -> birthday}<br>");

                }

            } catch (PDOException $e) {
                // errorInfoに拡張エラー情報が入っている。
                // 要素0に、ANSI SQL92 SQLSTATEのエラーコードが入っている。
                // 正常終了なら000000のエラーコード。
                // その他のエラーコードは、「ANSI SQL92 SQLSTATE」で検索すれば出てくる。
                print("エラーコード:{$e -> errorInfo[0]}<br>");

                // 要素1に、ドライバ固有のエラーコードが入っている。
                print("ドライバ固有のエラーコード:{$e -> errorInfo[1]}<br>");

                // 要素2に、ドライバ固有のエラーメッセージが入っている。
                print("ドライバ固有のエラーメッセージ:{$e -> errorInfo[2]}<br><br>");

                // メッセージを表示する。
                // die("<b>接続エラー:{$e -> getMessage()}</b><br><br>");
                print("<b>接続エラー:{$e -> getMessage()}</b><br><br>");
                
            } finally {
                $db = null;
            }
        ?>
        <hr>
    </body>
</html>

結果

DBTest.php

DBTest2.php

DBTest3.php

同一カテゴリの記事