環境
XAMPP for Windows 8.2.4
参考Webページ
- 疑似個人情報データ生成サービス
DBに入れるダミーデータを作成するのに役立つ。 - MySQL :: MySQL 8.0 リファレンスマニュアル :: 13.2.7 LOAD DATA ステートメント
load data コマンドを実行する時のオプション確認に役立つ。文字列をダブルクォーテーション等で囲んでいたら追加オプション必要。
テスト用テーブル作成
参考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">年
<input type="text" name="f_birthday2">月
<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>