PHP入門 データベース SQLクエリの発行

データベースにアクセスし、データを登録する方法を解説しています。

入力値を元にデータベースに登録する

画面の入力フォームで登録した値が、bookテーブルに挿入するサンプル

テーブル情報:book

フィールド名データ型概要
isbnVARCHEAR(17)ISBNコード
titleVARCHEAR(100)書名
priceINT価格
publishVARCHEAR(20)出版社
publishedDATE刊行日

sample.php


<!DOCTYPE html>
<head>
<meta charset="UTF-8" />
<title>データの登録</title>
</head>
<body>
<form method="POST" action="insert_process.php"> <div>
    <label for="isbn">ISBN:</label><br />
    <input id="isbn" type="text" name="isbn" size="25" maxlength="20" /> 
    </div><div>
    <label for="title">書名:</label><br />
    <input id="title" type="text" name="title" size="35" maxlength="150" /> 
    </div><div>
    <label for="price">価格:</label><br />
    <input id="price" type="text" name="price" size="6" maxlength="5" /> 
    </div><div>
    <label for="publish">出版社:</label><br />
    <input id="publish" type="text" name="publish" size="25" maxlength="30" /> 
    </div><div>
    <label for="published">刊行日:</label><br />
    <input id="published" type="text" name="published" size="15" maxlength="10" />
    </div><div>
    <input type="submit" value="登録" />
    </div>
</form>
</body>
</html>

insert_process.php

<?php
require_once './DbManager.php';
try {
    // データベースへの接続を確立
    $db = getDb();
    // INSERT命令の準備
    $stt = $db->prepare('INSERT INTO book (isbn, title, price, publish, published) VALUES (:isbn,:title,:price,:publish,:published)');
    // INSERT命令にポストデータの内容をセット
    $stt->bindValue(':isbn', $_POST['isbn']);
    $stt->bindValue(':title', $_POST['title']); 
    $stt->bindValue(':price', $_POST['price']);
    $stt->bindValue(':publish', $_POST['publish']); 
    $stt->bindValue(':published', $_POST['published']);
    // INSERT命令を実行 
    $stt->execute();
    // 処理後は入力フォームにリダイレクト
    header('Location:http://'.$_SERVER['HTTP_HOST'].'/sample1.php');
} catch (PDOException $e) {
    die("エラーメッセージ:{$e->getMessage()}");
}
実行結果
フォームからの入力値をデータベースに挿入処理

処理の解説

データベースに発行する一連の命令を管理するのは、PDOStatementオブジェクトの役割です。

PDOStatementオブジェクトは、PDOオブジェクト$dbからprepareメソッドを呼び出すことで取得できます。

構文:prepareメソッド

PDO::prepare(string $statement [, array $driver_options]):PDOStatement
$statement発行するSQL命令
$driver_options動作オプション

prepareメソッドには、データベースに対して発行したいSQL命令を指定します。bookというテーブルのisbn、title、price、publish、publishedというフィールドに、それぞれ指定された値を設定します。

prepareメソッドに含まれる「:名前」という記述はプレイスホルダーを表しています。プレイスホルダーとは、パラメーターの置き場所のことです。PDOStatementオブジェクトでは「:名前」で表されたプレイスホルダーに対して、実行時に任意のパラメーターを引き渡すことができます。

構文:bindValueメソッド

PDOStatement::prepare(mixed $parameter, mixed $value[, int $data_type = PDO::PARAM_STR]):bool
$parameterパラメーター名
$valueパラメーター値
$data_typeデータ型

これでSQL命令を発行する準備が整いました。あとは、executeメソッドによって実際にデータベースに命令が送信/実行されます。

INSERT/UPDATE/DELETE命令によって影響したレコード数を取得するには、rowCountメソッドを利用します。ただし、データベースによってはレコード件数を返さない場合があります。

print "件数:{$stt->rowCount()}";

名前付きパラメーターと名前なしパラメーター

「:名前」という形式のプレイスホルダーを利用しましたが、「?」という形式のプレイスホルダーを指定することもできます。前者を名前付きパラメーター、後者を名前なしパラメーターと呼びます。

 $stt = $db->prepare('INSERT INTO book (isbn, title, price, publish, published) 
VALUES (?,?,?,?,?)');

$stt->bindValue(1, $_POST['isbn']);
$stt->bindValue(2, $_POST['title']); 
$stt->bindValue(3, $_POST['price']);
$stt->bindValue(4, $_POST['publish']); 
$stt->bindValue(5, $_POST['published']);

名前なしパラメーターでは、bindValueメソッドの第1引数に(パラメーター名の代わりに)インデックス番号を指定します。また、インデックス番号は0スタートではなく、1スタートからになります。

オートインクリメント値を取得する

オートインクリメント(自動連番)機能とは、新たなレコードを登録するたびに連番を自動的に生成し、該当の列に設定する機能です。スクリプトを記述する際には、オートインクリメント機能によって自動採番された値を取得し、後続の処理を行いたいケースもあります。このようなケースでは、lastInsertIdメソッドを利用します。

<?php
require_once './DbManager.php';
try {
    // データベースへの接続を確立
    $db = getDb();
    // INSERT命令を実行 
    $stt->execute("INSERT INTO member (nam, sex, old, enter, memo) VALUES ('山田太郎','男',18, '2024-04-31','')");
    //直近のINSERT命令で取得したオートインクリメント値を取得
    print "直近のID値:{$db->lastInsertId()}"
} catch (PDOException $e) {
    die("エラーメッセージ:{$e->getMessage()}");
}

構文:bindValueメソッド

PDO::lastInsertId([string $name]): string
$nameシーケンス名

シーケンスとは、オートインクリメントによく似た機能で、データベース上で一意な数値キーを生成するために利用します。PostgreSQLやOracleのようなデータベースでは、シーケンスを利用して連番を生成します。引数$nameには、シーケンスを利用する場合にその名前を指定します。