データの検索をしてみよう本章のこれまでの学習で、安全にMariaDBサーバに接続してデータベースを選択するまでの方法を確認してきました。本節では選択したデータベースから、「データを検索(取得)する」方法について学習していきます。データを検索(取得)するには接続したデータベースに対して、「SQL文の発行」を行う必要があります。この発行するSQL文は「SELECT文」のことを意味します。上記の操作を行うために、これまで習ったものに追加して以下の「mysqli関数」を本節で利用します。データベースへSQL文を発行してみようデータベースへSQL文を発行するには「mysqli_query関数」を利用すれば行えます。「SELECT文」を発行すると、「検索結果の情報」がプログラム内に保存されます。保存したままでもレスポンス終了後に自動で削除されますが、不特定多数の人がアクセスするWebアプリケーションでは、アクセスが集中するとサーバへの負担が大きくなってしまいます。そのような状態を回避するために、自動で削除されるの待つのではなくプログラムで検索結果情報の利用が終わったタイミングで、「mysqli_free_result関数」を使って開放(削除)してあげる必要があります。第1引数の$接続情報は、MariaDBサーバへ接続した際の戻り値「接続情報(ID)」を、第2引数は発行したいSQL文を設定します。戻り値の$変数には、成功すれば「結果セット(ID)」失敗すれば「false」が代入されます。引数の$結果セットはSQL文を発行した際の戻り値「結果セット(ID)」を設定します。戻り値は発行したSQL文の結果の件数が数値で代入されます。引数の$変数はSQL文を発行した際の戻り値「結果セット(ID)」を設定します。実際にサンプルプログラムから各mysqli関数の情報を確認してみましょう。データベースへSQL文を発行して検索件数を表示するプログラムデータベースへ検索を行うSQL文を発行し、その検索結果の件数を画面に表示します。プログラムは前節までの学習内容にプラスして、データベースにSQL文(SELECT文)を発行する処理を追加しています。その追加内容に関して説明を行います。19行目でデータベースに発行するSQL文(SELECT文)を変数$sqlに用意します。このSQL文の意味は「iteminfoテーブルからid、name、priceの項目データ全て(無条件)検索しなさい」という意味になります。22行目で先程用意したSQL文をデータベースに発行し、その検索結果の情報を取得しています。実行結果からも分かるように変数$resultにはMariaDBサーバの接続情報と同じように「結果セット」が代入されます。検索結果から詳しい情報を取得したい場合は、この結果セットを利用して行っていきます。12.5.1:結果セットイメージ25行目でmysqli_num_rows関数の引数に結果セットを設定し、発行したSQL文の検索件数を変数$rowsに取得しています。iteminfoテーブルには現在10件のデータがあるため、$rowsには「10」が代入されます。mysqli_num_rows関数の結果28行目では結果セットを利用する処理がないので、mysqli_free_result関数を使って開放(削除)を行います。mysqli_free_result関数の結果38~39行目で接続情報と検索件数を画面に表示しています。検索件数は現在のiteminfoテーブルのデータの件数10が正しく表示されていることが確認できます。検索したデータを取得してみようデータベースに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行データを取得できる関数は複数存在しています。1mysqli_fetch_array関数:数値キーとテーブルの項目名キーの両方で、配列データを作成する。2mysqli_fetch_assoc関数:テーブルの項目名キーで、配列データを作成する。3mysqli_fetch_row関数:数値キーで、配列データを作成する。この3つのどれを使っても構いませんが、テーブルのどのデータを取得しているのか分かりやすくなるので1か2の「項目名キー」を利用する方法をお勧めします。検索結果を全て画面に表示するプログラムデータベースのiteminfoテーブルのデータを全検索し、その結果を取得して全て画面に表示します。プログラムは前項の内容に修正を行い、iteminfoテーブルを検索した結果のデータ全てを画面に表示するようしています。22行目までは前項と同じ処理を行っており、それ以降はHTML文章の間(32~51行目)で処理を行うようにしています。32~45行目が検索結果のデータを画面に表示する処理になり、まず34行目で検索件数を判定しています。データが1件も無かった場合はelseブロックの43行目の処理を行い、画面に検索結果がなかったメッセージを表示します。データが1件以上あればifブロックの35~41行目の処理を行い、while文mysqli_fetch_array関数を組み合わせて検索結果のデータを全て取得し、1行データの結果を画面に表示しています。47行目で結果セットはこの後の処理で使用しないため開放を行い、最後に50行目でMariaDBサーバの切断を行っています。検索結果から全件取得する仕組みは、ファイルの読み出し処理と同じように「位置情報」で読み出すデータを管理しています。初期位置は項目名になっています。条件を付けて検索してみようPHP側から送信できるSQL文(SELECT文)は、テーブルのデータを全件取得するだけではなく条件を付けて行うことができます。条件はidだけではなくテーブルにある項目ならname、priceを使っても大丈夫です。ANDやORで複数の項目を条件に設定することもできます。上記凡例を見て分かりますが、PHPから発行できるSQL文はMariaDBで行えるものと同じです。それでは実際にiteminfoテーブルの、id項目に条件を絞ったプログラムを見てみましょう。プログラムは前項の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で目にする検索システムになります。続いて次の節からはデータ検索(取得)だけではなく、データベースのデータを更新する仕組みを見て行きましょう。