PHPのPDOからSQLを実行する

PDOを利用して、各データベースへの接続については以前、記事にしていましたが、データを取得するなどのSQL(クエリ)を実行させていませんでした。

今回は、データベースにMySQLを利用しデータの登録、取得をメインにSQL(クエリ)を実行していきます。

PDOでのデータベース接続がわからない方は、以下のURLから確認できます。

PHPからデータベースへ接続する
https://blog.code4u.org/archives/1575

下準備

まずは、データベースとテーブルを用意します。

データベースの作成

CREATE DATABASE `test_database` DEFAULT CHARSET utf8mb4;

テーブルの作成

USE test_database
CREATE TABLE `test_table` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

これで、データベース(test_database)とテーブル(test_table)の用意が出来たので、まずはデータを登録していきます。

データの登録(INSERT)

データベースへデータ(レコード)を登録する際に利用するのが、INSERTとなります。

今回は、PDOを利用してSQLを実行するのが目的ですので、SQLの詳しい説明はなしで進めます。

では、実際にPDOを使ってINSERTを実行し、test_tableにデータを登録していきます。

<?php
$dsn = 'mysql:dbname=test_database;host=localhost;port=3306';
$user = 'user';
$password = 'password';
try {
    $conn = new PDO($dsn, $user, $password);
    $sql = 'INSERT INTO test_table (name) VALUES (?)';
    $stmt = $conn->prepare($sql);
    $result = $stmt->execute(['車']);
} catch (Exception $ex) {
    echo $ex->getMessage();
}

$sqlの文字列に「INSERT INTO…」と書かれた、普通のINSERT文です。

注目してほしい箇所は、「VALUES」の後にある、「(?)」の部分となります。
この「?」はプレースホルダと呼ばれるもので、実行されるSQLに値を渡すことが出来ます。

また、渡される値はSQL実行時に問題のない値にされ、不正な処理が行われないようになっています。

この仕組みをプリペアードステートメントと言い、SQLを利用する際には必ず覚えておく必要がある内容となります。

では、実行部分のコードを1行ずつ見ていきます。

8行目

    $sql = 'INSERT INTO test_table (name) VALUES (?)';

INSERT文を変数 $sql に入れています。
上記で説明した、プレースホルダを利用できるように登録したいデータの部分を「?」にしています。

9行目

    $stmt = $conn->prepare($sql);

実行するSQLを、prepareメソッドにて実行するためのPDOステートメント($stmt)を用意をします。
※PDOステートメントには、execute(SQLの実行)やbindParam(プレースホルダへの値の設定)、fetch(SQLの実行結果から1行を取得)など様々なメソッドが用意されています。

ただ、このままでは値が「?」のままのため、登録したい内容が入れられません。

そこで、次の行にて値を設定しながら、SQLを実行しています。

10行目

    $result = $stmt->execute(['車']);

executeはPDOステートメントが持っているSQLを実行するためのメソッドです。

executeは実行時の引数として配列を渡すことが可能です。
※引数が未設定の場合には、NULLが渡されます。

ここで注意したいが、配列の要素数がプレースホルダの数と一致しないとエラー(Exception)が発生します。

処理が正常に完了した際には、$resultには true が設定されます。

プレースホルダには別の利用の方法もありますが、またの機会に説明していきたいと思います。

説明が長くなりましたが、このPHPを実行することでデータが1件登録されます。

登録されているのかを確認するために、次はデータの取得を行います。

データの取得(SELECT)

データベースからデータの取得を行う際には、「SELECT」を利用します。

以下のように記述することで、SELECT文が実行できます。

<?php
$dsn = 'mysql:dbname=test_database;host=localhost;port=3306';
$user = 'user';
$password = 'password';
try {
    $conn = new PDO($dsn, $user, $password);
    $sql = 'SELECT id, name from test_table';
    $stmt = $conn->query($sql);
    $rs = $stmt->fetch(PDO::FETCH_ASSOC);
    echo $rs['id'];
    echo $rs['name'];
} catch (Exception $ex) {
    echo $ex->getMessage();
}

実行した結果は以下のようになります。

1車

先ほどINSERTにて登録した「車」が表示されました。

1はtest_tableのidの部分ですが、INSERTを実行した際には指定していませんが、登録されています。
これは、MySQLのAUTO INCREMENTと言う機能を利用し、自動的に連番が設定されるようになっている為です。
※test_tableのCREATE部分を見ると、「AUTO_INCREMENT」と言う記載が見つけられると思います。

今回は、1行のデータしか登録していないため、PDOステートメント($stmt)に対して、結果を1行取得するfetchメソッドを利用し、データを取り出しています。

データを複数件登録している場合には、fetchメソッド自体をループ処理するかfetchAllメソッドを利用する、と言うのが一般的です。

詳しい使い方については、また次回取り上げていきます。

総括

SQLの説明と、プリペアードステートメントの説明、PDOの説明・・・とゴチャゴチャし過ぎてしまいました。

PHPとSQL、2つの言語を利用するため一気に難しくなった感があるかもしれませんが、データベースへの登録や更新、データの取得のやり方(PHPの書き方)は基本的に変わりません。

一度覚えてしまえば、使い回しの出来る内容です。
また、他の言語でデータベース処理をする際にも、考え方は同じなのでしっかりマスターしておくことで、必ず役に立つはずです。

追記

すべてを1回でまとめるのは難しいので、何回かに分けてもう少し実践的な内容を含めていこうと思います。

関連する記事