システムやプログラムを作るうえで、入力情報と出力情報は必要です。
(逆に、入出力情報のないシステムやプログラムとは…)
phpの場合、データベースにデータを保存する・読み出すことが、入力情報・出力情報(の一部)となります。
(もちろん、他にもありますがごにょごにょ割愛。)
今回は、データベースにアクセスする際の必要な手順を備忘録・勉強兼ねて紹介したいと思います。
データベースは色々ある
まずはデータベースって何?ということで、様々な会社が作ったデータベースがあります。
- PostgreSQL
- Oracle Database
- Microsoft Access
- MySQL
- 等々…
それぞれ種類や特性があるようですので、気になった方は調べてみてください。
レンタルサーバで使えるデータベースを使おう
すきま堂で使用しているレンタルサーバはロリポップ!
で、使えるデータベースは「MySQL」です。
一方で、XAMMPをインストールすると「MariaDB」が使えるようになっています。
名前は違いますが、この2つデータベースはほぼ同じように使用できます。
自分のパソコン内で作ったデータベースを、ロリポップ!
のデータベースに反映することもできます。
これならコーディング、確認、アップロードの一連の流れがスムーズにいきそうです。
ということで、使うデータベースは「MariaDB」「MySQL」にしましょう。

データベースを準備する
まずは、データベースそのものが無いと始まりません。
こちらの記事に作り方が書いてありますので、testデータベースとテーブルを作成します。
phpでデータベースにアクセスする準備
上記記事で、実際にアクセスしていますが、改めて要点をまとめたいと思います。
データベースにアクセスする際に必要な手順のコード(25行目~29行目)を抜粋したものです。
$dsn = 'mysql:dbname=test;host=localhost;charset=utf8mb4';
$user = 'root';
$password ='';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
1行目は、4行目でPDOクラスの$bdhインスタンスを作るのに必要な第1引数(DSN)を、$dsn変数に文字列として代入しています。
分解してみてみると、下記となっていて、それぞれ意味があります。
- mysql:(データベースはmysqlですよ。)
- dbname=test;(データベース名はtestですよ。)
- host=localhost;(ホスト名はlocalhostですよ。)
- charset=utf8mb4(文字セットはUTF-8 Unicodeですよ。)
2行目は、4行目でPDOクラスの$bdhインスタンスを作るのに必要な第2引数(ユーザ名)を、$user変数に文字列として代入しています。
3行目は、4行目でPDOクラスの$bdhインスタンスを作るのに必要な第3引数(パスワード)を、$password変数に文字列として代入しています。
4行目は、1行目~3行目の変数を引数にして、PDOクラスの$bdhインスタンスを作成しています。
5行目は属性設定です。setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION)として、SQL(データベースに対して命令を行う)実行した時に問題が発生した時、プログラムを停止させ、問題が起こった時の情報を取得できるようにします。
これにて、データベースにアクセスする準備ができました。
データベースのテーブルにアクセスする
データベースにアクセスする準備ができたので、テーブルにアクセスする際に実際に私がよく使う方法を紹介したいと思います。
$dsn = 'mysql:dbname=test;host=localhost;charset=utf8mb4';
$user = 'root';
$password ='';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql = 'SELECT * FROM hogehoge WHERE 1';
$stmt=$dbh->prepare($sql);
$stmt->execute();
while(1){
$rec = $stmt->fetch(PDO::FETCH_ASSOC);
if($rec==false) break;
print $rec['fuga'].'<br>';
}
6行目で、SQL文を作成しています。
このSQL文の内容は、「hogehogeテーブルの全レコードを全カラム取得してね。」です。
分解して説明すると、
- SELECT * (全カラム取得してね)
- FROM hogehoge (hogehogeテーブルの)
- WHERE 1(全レコードを)
となっています。
7行目で、$stmtに、SQL文をセットしたPDOStatementオブジェクトを設定します。
8行目のexecuteメソッドにてSQL(6行目の内容)を実行します。
10行目のfetchメソッドを実行して1レコード取り出します。
$recにレコードが配列として設定されますが、引数にPDO::FETCH_ASSOCを指定することで、連想配列になります。(12行目のように、カラム名で配列を参照できる。)
もし、fetchメソッドで取得できるレコードが無い場合は、戻り値がfalseになるので、11行目で無限ループから抜けます。