PHPからデータベースを操作(データの抽出、検索)

(ブログ記事の一覧は「こちら」)

PHPからSQLを実行してデータベースにアクセスする方法を学びましょう。

ここで学ぶこと

  • PDO(PHP Data Object)
  • PHPからデータベースを操作
  • require_once文

PDOとは、PHPからデータベースにアクセスして様々な処理を行うための機能を集めたクラスです。PDOクラスを用いると、MySQLだけでなく、SQLite, PostgreSQLなど他のタイプのSQLに対しても処理することができます。

参考:

PHP Data Objects(PHPマニュアル)
PDOクラス(PHPマニュアル)
PDO::query(PHPマニュアル)
PDO::prepare(PHPマニュアル)

準備

phpMyAdminにて、以下のデータベースとテーブルを作成します。

データベースの作成

データベース名

db_food

文字コードは「utf8_unicode_ci」を選択します。

テーブルの作成

テーブル名

fruits_list

テーブルの構造

名前 データ型 その他
id int primary
name varchar(50) -
price int -

【参考】テーブル作成のSQL

CREATE TABLE `db_food`.`fruits_list` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(50) NOT NULL , `price` INT NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;

レコードの挿入

SQL文で実行する場合、以下を貼り付けてください。

INSERT INTO `fruits_list`(`id`, `name`, `price`) VALUES (NULL, 'りんご', '200');
INSERT INTO `fruits_list`(`id`, `name`, `price`) VALUES (NULL, 'みかん', '100');
INSERT INTO `fruits_list`(`id`, `name`, `price`) VALUES (NULL, 'バナナ', '300');

例題1

準備で作成したデータベースとテーブルに対して、追加した全てのレコードの情報を取得するPHPプログラムを作成します。
PDOクラスのqueryメソッドを使用する方法で、SQL文を実行します。

作成するもの

追加したレコードの全ての商品(name)をリストで一覧表示するPHPプログラムを作成します。

まず、「C:\xampp\htdocs」以下に「sample/food」フォルダを作成します。

プログラム

以下のPHPプログラムを「dbConfig.php」として、「food」フォルダに置きます。

<?php
    define("DB_SERVER", "localhost");  // サーバー
    define("DB_USER", "root");         // ユーザー
    define("DB_PASS", "");             // パスワード
    define("DB_NAME", "db_food");      // データベース
?>

PDOクラスによるレコードの抽出を行います。
以下のPHPプログラム「getFoodName_receive_pdo.php」を作成して、「food」フォルダに置きます。

<?php
    require_once('./dbConfig.php');

    // 接続
    try {
        $dsn = 'mysql:host=' . DB_SERVER . ';dbname=' . DB_NAME . ';charset=utf8';
        $pdo = new PDO($dsn, DB_USER, DB_PASS);
    } catch (PDOException $e) {
        die("接続に失敗しました" . $e->getMessage());
    }

    // レコード抽出
    $sql = "SELECT * FROM fruits_list";
    $stmt = $pdo->query($sql);

    echo "<ul>";
    foreach($stmt as $row) {
        echo "<li>" . $row['name'] . "</li>";
    }
    echo "</ul>";

    $pdo = null;
?>

require_once文を用いると、他のPHPファイルを読み込んでくれます。

require_once('./dbConfig.php');

require_once文は今後もよく用いるので、使い方を覚えておきましょう。

次に、PDOクラスを生成してデータベースに接続します。(接続に失敗した場合、die関数を呼び、終了します。exit関数で書いても同様です。)
接続に成功したら、PDOクラスのqueryメソッドを使用して、指定したSQL文を実行します。(ユーザからの入力情報を含まないSQL文を実行する場合は、簡単に記述できるqueryメソッドを使用すると便利です。)
データの取得と表示の方法は、サンプルプログラムを確認してください。

実行、確認

以下をWebブラウザで実行します。 テーブル内のレコード一覧が表示されます。

http://localhost/sample/food/getFoodName_receive_pdo.php

例題2

準備で作成したデータベースとテーブルに対して、追加したレコードの情報から指定したキーワードを検索して取得するPHPプログラムを作成します。
PDOクラスのprepareメソッドを使用する方法で、SQL文を実行します。

作成するもの

追加したレコードの全ての商品(name)に対して、指定したキーワードを検索して、リストで一覧表示するPHPプログラムを作成します。

プログラム

PDOクラスによるレコードの検索を行います。
例題1のPHPプログラムをもとに、「searchFoodName_receive_pdo.php」を作成します。

<?php
    require_once('./dbConfig.php');

    $name = $_GET['name'];
    if (isset($name) == false) {
        die("'name'の設定なし");
    }

    // 接続
    try {
        $dsn = 'mysql:host=' . DB_SERVER . ';dbname=' . DB_NAME . ';charset=utf8';
        $pdo = new PDO($dsn, DB_USER, DB_PASS);
    } catch (PDOException $e) {
        die("接続に失敗しました" . $e->getMessage());
    }

    // レコード検索
    $sql = "SELECT * FROM fruits_list WHERE name=:name";
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':name', $name, PDO::PARAM_STR);
    $stmt->execute();
/*
   // こちらの書き方でも可能
   $sql = "SELECT * FROM fruits_list WHERE name=?";
   $stmt = $pdo->prepare($sql);
   $stmt->bindValue(1, $name, PDO::PARAM_STR);
   $stmt->execute();
*/

    echo "<ul>";
    foreach($stmt as $row) {
        echo "<li>" . $row['name'] . "</li>";
    }
    echo "</ul>";

    $pdo = null;
?>

まず、$_GET['name'] を呼び出し、検索するnameがセットされていることを確認します。
接続に成功したら、PDOクラスのprepareメソッドを使用して、実行するSQL文を指定します。(ユーザからの入力を含むSQL文を実行する場合、prepareメソッドを使用します。)bindValueメソッドで入力情報をセットして、executeメソッドでSQL文を実行します。

実行、確認

以下をWebブラウザで実行します。 テーブル内の指定したキーワードのレコード一覧が表示されます。

http://localhost/sample/food/searchFoodName_receive_pdo.php?name=みかん

課題1

「getFoodName_receive_pdo.php」「searchFoodName_search_receive_pdo.php」それぞれについて、価格(price)も表示するように修正してください。

課題2

次の内容の処理を行うPHPプログラムを作成してください。

  • 価格(price)を入力するテキストボックス、送信ボタンを含むPHPプログラム「getFoodName_send_pdo.php」を作成してください。
    • 「送信」ボタンをクリックすると「getFoodName_receive_pdo.php」に移動するようにします。
  • 「getFoodName_send_pdo.php」で設定した価格(price)より安い商品(name)だけを一覧表示するように「getFoodName_receive_pdo.php」を修正してください。