大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

XAMPPでMySQLを使う その2

著者:北本 敦
公開日:2022/09/15
最終更新日:2022/11/29
カテゴリー:技術情報
タグ:

北本です。
前回はXAMPPをインストールしてポート番号の設定を行い、phpMyAdminでデータベースの編集を行いました。
今回は、条件を入力してMySQLのテーブルからデータを取得し表示するページをPHPを使用して作成します。

前回MySQLに作成したcitiesテーブル(今更ですがテーブル名は単数形にした方がよかったかも)の内容は以下の通りです。

nameprefecturepopulation
大阪市大阪府2752412
堺市大阪府826161
豊中市大阪府401558
吹田市大阪府385567
神戸市兵庫県1525152
尼崎市兵庫県459593
西宮市兵庫県485587
芦屋市兵庫県93922
京都市京都府1463723

作成するページは以下のようなものとします。

都道府県を入力するテキストボックス、人口の上限値と下限値を入力するテキストボックスがあり、「送信」ボタンを押下するとテキストボックスに入力した条件に該当する都市のデータをcitiesテーブルから取得し以下のように表示します。テキストボックスが空白の場合は、その条件は適用しないものとします。

HTMLの内容は以下の通りです。

test.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>INDEX</title>
</head>
<body>
  <form method="GET" action="test.php">
    <div>都道府県: <input type="text" name="prefecture"></div>
    <div>人口: <input type="text" name="population_min">以上、 <input type="text" name="population_max">以下</div>
    <div><input type="submit" value="送信"></div>
  </form>
</body>
</html>

通常はXAMPPのインストールフォルダ内のhtdocsフォルダがドキュメントルートになっていますので、その中にHTML(名前はtest.htmlとします)を配置します。Apacheを起動して、http://localhost:8080/test.html(ポート番号が8080の場合)にアクセスすれば、作成したページが表示されるはずです。

このページでテキストボックスに適当な値を入力して「送信」ボタンをクリックしてみましょう。
上掲の画像のように都道府県:兵庫県、人口:300000以上、500000以下と入力していた場合は下記のようなURLが発行されます。ただし、まだtest.phpを用意していないので404エラー(Not Found)になります。

http://localhost:8080/test.php?prefecture=兵庫県&population_min=300000&population_max=500000

このように、formタグのaction属性に設定したURIに対して、inputタグのname属性をキー、入力値を値としてパラメータが送られていることがわかります。

では、PHPの方を作成してみますが、まずはよくない例を紹介します。

test.php

<html>
<head><title>TEST</title></head>
<body>

<?php

$prefecture = $_GET["prefecture"];
$population_min = $_GET["population_min"];
$population_max = $_GET["population_max"];

$pdo = new PDO("mysql:host=127.0.0.1;dbname=testdb;charset=utf8mb4;", "root", "");

$sql = "SELECT name, prefecture, population FROM cities";

$where = "";
if(!empty($prefecture)){
  $where .= " prefecture = '" . $prefecture . "'";
}
if(!empty($population_min )){
    if(!empty($where)){
        $where .= " AND";
    }
    $where .= " population >= " . $population_min;
}
if(!empty($population_max)){
    if(!empty($where)){
        $where .= " AND";
    }
    $where .= " population <= " . $population_max;
}

if(!empty($where)){
    $sql .= " WHERE " . $where;
}

$stmt = $pdo->query($sql);
$result = $stmt->fetchAll();

foreach ( $result as $row ) {
    echo "名前: {$row["name"]}, 都道府県: {$row["prefecture"]}, 人口: {$row["population"]}<br>";
}

?>
</body>
</html>

送信されたパラメータは、$_GETという変数に連想配列として格納されており、例えば、キー名が「prefecture」であれば、$_GET[“prefecture”]という形で値を取得することができます。

PHPでデータベースに接続するには、PDOというオブジェクトを使います。PDOのコンストラクタでは、第1引数にDSN、第2引数にユーザー名、第3引数にパスワードを指定します。DSNについては、MySQLの場合以下のようになります。

mysql:host=ホスト名;dbname=データベース名;charset=文字セット;

ホスト名は、今回はローカルで動かすので127.0.0.1を指定しています。
ユーザー名はデフォルトでroot、パスワードはデフォルトで空白となっています。

PDOのqueryメソッドは、引数に渡したSQL文を実行してPDOStatementオブジェクトとして結果を取得します。
上記のコードでは、$_GETから取得したパラメータなどを文字列連結して作成したWHERE句を「SELECT name, prefecture, population FROM cities」の後ろにくっつけて組み立てたSELECT文を引数に渡しています。もし、都道府県:兵庫県、人口:300000以上、500000以下が入力値であれば、以下のようなSQL文になっているはずです。

SELECT name, prefecture, population FROM cities WHERE prefecture = '兵庫県' AND population >= 300000 AND population <= 500000 

PDOStatementのfetchAllメソッドを呼ぶと全ての結果行を取得できます。各カラムの値の配列が取得された行数分入った二次元配列の形で取得されます。ちなみに、上記コードではカラム名を添字にしてアクセスしていますが、インデックスでアクセスすることも可能です。

上記のtest.phpをtest.htmlと同様にhtdocsに置いて、ApacheとMySQLを起動して、http://localhost:8080/test.htmlにアクセスしてみましょう。都道府県:兵庫県、人口:300000以上、500000以下と入力して「送信」ボタンをクリックすれば確かに尼崎市と西宮市のデータを取得できるはずです。

しかし、このコードには致命的な欠陥があります。これについては次回に説明します。

    上に戻る