第12章 PHPとデータベースの連携

12.5 データの検索をしてみよう

本章のこれまでの学習で、安全にMySQLサーバに接続してデータベースを選択するまでの方法を確認してきました。本節では選択したデータベースから、「データを検索(取得)する」方法について学習していきます。
データを検索(取得)するには接続したデータベースに対して、「SQL文の発行」を行う必要があります。この発行するSQL文は「SELECT文」のことを意味します。
上記の操作を行うために、これまで習ったものに追加して以下の「mysqli関数」を本節で利用します。

  • データベースへSQL文の発行:mysqli_query関数(SQL文の種類は問わない)
  • 検索結果件数の取得:mysqli_num_rows関数
  • 検索結果から1レコード取得:mysqli_fetch_array関数(繰り返し文と連携して全件取得が可能)
  • 検索結果情報の開放:mysqli_free_result関数

12.5.1 データベースへSQL文を発行してみよう

データベースへSQL文を発行するには「mysqli_query関数」を利用すれば行えます。また「SELECT文」を発行すると、「検索結果の情報」がプログラム内に保存されます。保存したままでもレスポンス終了後に自動で削除されますが、不特定多数の人がアクセスするWebアプリケーションでは、アクセスが集中するとサーバへの負担が大きくなってしまいます。そのような状態を回避するために、自動で削除されるの待つのではなくプログラムで検索結果情報の利用が終わったタイミングで、「mysqli_free_result関数」を使って開放(削除)してあげる必要があります。

書式:SQL文の発行

第1引数の$接続情報は、MySQLサーバへ接続した際の戻り値「接続情報(ID)」を、第2引数は発行したいSQL文を設定します。戻り値の$変数には、成功すれば「結果セット(ID)」失敗すれば「false」が代入されます。

書式:検索の結果セットから件数を取得

引数の$結果セットはSQL文を発行した際の戻り値「結果セット(ID)」を設定します。戻り値は発行したSQL文の結果の件数が数値で代入されます。

書式:結果セットの開放

引数の$変数はSQL文を発行した際の戻り値「結果セット(ID)」を設定します。

実際にサンプルプログラムから各mysqli関数の情報を確認してみましょう。

データベースへSQL文を発行して検索件数を表示するプログラム

データベースへ検索を行うSQL文を発行し、その検索結果の件数を画面に表示します。

ソース・フォルダー: myproj_basic/ch12
パッケージ: sqlQuery.php
アクセスURL:http://localhost/myproj_basic/ch12/sqlQuery.php

sqlQuery.php

実行結果

解説

今回のプログラムは前節までの学習内容にプラスして、データベースにSQL文(SELECT文)を発行する処理を追加しています。その追加内容に関して説明を行います。
19行目でデータベースに発行するSQL文(SELECT文)を変数$sqlに用意します。
このSQL文の意味は「iteminfoテーブルからid、name、priceの項目データ全て(無条件)検索しなさい」という意味になります。

22行目で先程用意したSQL文をデータベースに発行し、その検索結果の情報を取得しています。実行結果からも分かるように変数$resultにはMySQLサーバの接続情報と同じように「結果セット」が代入されます。検索結果から詳しい情報を取得したい場合は、この結果セットを利用して行っていきます。


図 12.5.1:結果セットイメージ

25行目でmysqli_num_rows関数の引数に結果セットを設定し、発行したSQL文の検索件数を変数$rowsに取得しています。iteminfoテーブルには現在10件のデータがあるため、$rowsには「10」が代入されます。


図 12.5.2: mysqli_num_rows関数の結果

28行目では結果セットを利用する処理がないので、mysqli_free_result関数を使って開放(削除)を行います。


図 12.5.3: mysqli_free_result関数の結果

38~39行目で接続情報と検索件数を画面に表示しています。検索件数は現在のiteminfoテーブルのデータの件数10が正しく表示されていることが確認できます。

12.5.2 検索したデータを取得してみよう

データベースにSQL文(SELECT文)を発行すると、検索結果の情報が取得できます。実際にどのようなデータが取得できたかのかを知るためには「mysqli_fetch_array関数」を使って、1行ずつデータを取得して確認していきます。さらに、繰り返し文と組み合わせて、全件取得する方法が一般的な使い方になります。

書式:結果セットから1行データを取得する

このmysqli_fetch_array関数を1度呼び出すと、初めの位置情報(内部的に持っている情報)から次の行へ位置情報を進め、その位置に1行データがあれば配列データとして返し、データがない場合はfalseが返ってきます。また、配列データは「数値キー」と「テーブルの項目名をキー」にした2種類で作成されます。
このmysqli_fetch_array関数の基本的な仕組みは、「位置情報の移動を先に行う、配列データの作成方法が違う」だけで、10章で学習したfgetcsv関数に似た仕組みになっています。

凡例:検索結果を繰り返し文を使って全て取得する

凡例ではiteminfoテーブルからidの項目を1つだけで、データを全件取得するようにしています。このSQL文の結果セットから、mysqli_fetch_array関数を使って読み取れるのは項目idだけになります。1行データが代入される$rowには数値キー「0」と「id」両方で1行目データの値が取得できます。1行データが取得出来ない場合は「false」が$rowに代入されるので、while文を抜ける仕組みになります。この処理は10章で学習した、読み込みファイルデータを全て取得する仕組みにとても似ています。この後のプログラムでイメージを交えて解説を行います。

結果セットから1行データを取得するmysqli関数について

結果セットから1行データを取得できる関数は複数存在しています。
①mysqli_fetch_array関数:数値キーとテーブルの項目名キーの両方で、配列データを作成する。
②mysqli_fetch_assoc関数:テーブルの項目名キーで、配列データを作成する。
③mysqli_fetch_row関数:数値キーで、配列データを作成する。
この3つのどれを使っても構いませんが、テーブルのどのデータを取得しているのか分かりやすくなるので①か②の「項目名キー」を利用する方法をお勧めします。

検索結果を全て画面に表示するプログラム

データベースのiteminfoテーブルのデータを全検索し、その結果を取得して全て画面に表示します。

ソース・フォルダー: myproj_basic/ch12
パッケージ: selectAll.php
アクセスURL:http://localhost/myproj_basic/ch12/selectAll.php

selectAll.php

実行結果

解説

今回のプログラムは前項の内容に修正を行い、iteminfoテーブルを検索した結果のデータ全てを画面に表示するようしています。22行目までは前項と同じ処理を行っており、それ以降はHTML文章の間(32~51行目)で処理を行うようにしています。

32~45行目が検索結果のデータを画面に表示する処理になり、まず34行目で検索件数を判定しています。
データが1件も無かった場合はelseブロックの43行目の処理を行い、画面に検索結果がなかったメッセージを表示します。データが1件以上あればifブロックの35~41行目の処理を行い、while文mysqli_fetch_array関数を組み合わせて検索結果のデータを全て取得し、1行データの結果を画面に表示しています。

47行目で結果セットはこの後の処理で使用しないため開放を行い、最後に50行目でMySQLサーバの切断を行っています。

検索結果から全件取得する仕組みは、ファイルの読み出し処理と同じように「位置情報」で読み出すデータを管理しています。初期位置は項目名になっています。


図 12.5.4:検索結果を全件取得するイメージ

12.5.3 条件を付けて検索してみよう

PHP側から送信できるSQL文(SELECT文)は、テーブルのデータを全件取得するだけではなく条件を付けて行うことができます。

凡例:条件を追加したSELECT文

条件はidだけではなくテーブルにある項目ならname、priceを使っても大丈夫です。ANDやORで複数の項目を条件に設定することもできます。上記凡例を見て分かりますが、PHPから発行できるSQL文はMySQLで行えるものと同じです。

それでは実際にiteminfoテーブルの、id項目に条件を絞ったプログラムを見てみましょう。

条件付きのSQL文を発行して結果を画面に表示するプログラム

別の画面から検索条件のIDを入力し、そのIDを元にデータベースを検索して検索結果を画面に表示します

ソース・フォルダー: myproj_basic/ch12
パッケージ: searchIdForm.php
アクセスURL:http://localhost/myproj_basic/ch12/searchIdForm.php

searchIdForm.php

ソース・フォルダー: myproj_basic/ch12
パッケージ: selectById.php
アクセスURL:searchIdForm.phpからの画面遷移でアクセスされる

selectById.php

実行結果

解説

今回のプログラムは前項のselectAll.phpのプログラムに、別の画面からの入力IDを検索条件に組み込んだものになっています。そのためselectById.phpの解説はselectAll.phpと違っている部分に関して行います。

一番重要な部分は16行目のSQL文になります。このSELECT文はPOSTデータのIDを検索条件に組み込んでいます。結果として、「iteminfoテーブルのidに入力ID($_POST[‘id’])が含まれているものを検索しなさい」と言うSELECT文になります。条件を設定したい場合は、テーブル名の後に「WHERE句」を付けます。また条件に「LIKE文の’%入力ID%’」としているので、入力IDを含むあいまい検索にすることができます。

29行目で今回の検索条件のIDを画面に表示し、52行目で検索にヒットした件数を画面に表示しています。

今回のプログラムような入力情報を元に検索結果が変わる仕組みは、よくWebで目にする検索システムになります。
続いて次の節からはデータ検索(取得)だけではなく、データベースのデータを更新する仕組みを見て行きましょう。

NEXT>> 12.6 データの更新をしてみよう