レシピ
データベース MySQL / MariaDB
mysqliでMySQL/MariaDBからデータを取得:SELECT
今回はmysqliとSQLのSELECT文を使って、データベースからデータを取得する方法を解説していきます。
この記事のポイント
- mysqliを使ってMySQLデータベースからデータを取得する
- 取得するデータの形式を指定する
- データの件数を取得する
目次
データベースから必要なデータを取得する
mysqli_query関数とSELECT文を使って、接続したデータベースから必要なデータを取得していきましょう。
例として、次のテーブルを使って進めます。
id | name | price | better_beforetime | modify_datetime | create_datetime |
---|---|---|---|---|---|
1 | 野菜グラノーラ | 300 | 2017-01-15 | 2016-10-04 00:00:00 | 2014-04-10 00:00:00 |
2 | 果物グラノーラ | 300 | 2017-01-15 | 2016-10-02 00:00:00 | 2014-04-10 00:00:00 |
3 | 穀物グラノーラ | 300 | 2017-02-10 | 2016-10-01 00:00:00 | 2014-04-10 00:00:00 |
4 | オーガニックグラノーラ | 750 | 2016-12-05 | 2016-09-20 00:00:00 | 2015-08-07 00:00:00 |
5 | レーズングラノーラ | 400 | 2017-02-10 | 2016-09-03 00:00:00 | 2012-10-05 00:00:00 |
6 | プレーンシリアル | 280 | 2017-03-10 | 2016-09-18 00:00:00 | 2012-04-20 00:00:00 |
7 | チョコシリアル | 350 | 2017-03-10 | 2016-09-18 00:00:00 | 2012-04-20 00:00:00 |
8 | ハニーシリアル | 300 | 2017-02-22 | 2016-10-01 00:00:00 | 2012-05-10 00:00:00 |
9 | シュガーシリアル | 300 | 2017-03-10 | 2016-09-10 00:00:00 | 2012-04-20 00:00:00 |
10 | アップルグラノーラ | 350 | 2017-02-10 | 2016-09-24 00:00:00 | 2012-05-15 00:00:00 |
11 | パイングラノーラ | 350 | 2017-02-10 | 2016-09-24 00:00:00 | 2012-05-15 00:00:00 |
各カラムの役割は次の通りです。
- id – 製品ID(主キー)
- name – 製品名
- price – 価格
- better_beforetime – 賞味期限
- modify_datetime – データ更新日時
- create_datetime – データ登録日時
今回はデータベースのデータを取得する基本部分について解説しますが、データの取得に条件や並び順を指定する方法については、別記事「mysqliのSELECT文を使った様々なデータの取得方法」で解説しています。
また、データベースへの接続までは「mysqliを使ってMySQL/MariaDBのデータベースへ接続」で解説している内容と同様なため、詳しくはこちらの記事をご覧ください。
オブジェクトを使った書き方
まずは、mysqliクラスのインスタンスを使った全データを取得するコードから解説します。
オブジェクト型のコード例
$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'database_name');
if( $mysqli->connect_errno ) {
echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
}
$mysqli->set_charset('utf8');
$sql = 'SELECT * FROM gc_granola';
$res = $mysqli->query($sql);
if( $res ) {
var_dump($res->fetch_all());
}
$mysqli->close();
実行結果
解説
コード自体はqueryメソッドでデータを取得するSQLクエリを実行し、結果が取得できたら表示を行うのみのシンプルな内容です。
まず、最初の5行ではMySQL/MariaDBのデータベースへ接続を行っています。
データベースへ接続する
$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'database_name');
if( $mysqli->connect_errno ) {
echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
}
接続にエラーがある場合はif文の中にあるecho文で、エラー番号が入っているconnect_errnoプロパティとエラー内容が入っているconnect_errorプロパティを出力します。
続くset_charsetメソッドでは、データベースの文字コードを指定します。
文字コードを設定
$mysqli->set_charset('utf8');
次の2行は肝となるデータを取得するコードです。
データを取得
$sql = 'SELECT * FROM gc_granola';
$res = $mysqli->query($sql);
まず$sqlにデータを取得するSQLであるSELECT文を記述します。
今回はデータの全件取得なので、データが入っているテーブル名「gc_granola」のみ指定します。
このSQLをすぐ下のqueryメソッドに渡してデータを取得し、取得結果を$resに格納します。
その後に、次のコードで取得したデータを出力します。
取得したデータを出力
if( $res ) {
var_dump($res->fetch_all());
}
fetch_allメソッドの内容をvar_dump関数で出力します。
なお、データが取得できなかった場合は$resの中に「false」が入るため、if文の中は実行されず何も表示されません。
最後に、closeメソッドでデータベースとの接続を解除して終了します。
データベースとの接続を解除
$mysqli->close();
以上が全体の流れです。
関数を使った書き方
続いて、mysqli系の関数を使って全データを取得するコードを解説します。
書き方のアプローチは異なりますが、処理結果は上記の「オブジェクトを使った書き方」と同様です。
mysqli系の関数を使って全データを取得する
$db_link = mysqli_connect( 'host_name', 'user_name', 'password', 'database_name');
if( mysqli_connect_errno($db_link) ) {
echo mysqli_connect_errno($db_link) . ' : ' . mysqli_connect_error($db_link);
}
mysqli_set_charset( $db_link, 'utf8');
$sql = 'SELECT * FROM gc_granola';
$res = mysqli_query( $db_link, $sql);
if( $res ) {
var_dump($res->fetch_all());
}
mysqli_close($db_link);
解説
上記のコードを順に解説します。
最初の5行はデータベースへの接続をするコードです。
データベースへ接続する
$db_link = mysqli_connect( 'host_name', 'user_name', 'password', 'database_name');
if( mysqli_connect_errno($db_link) ) {
echo mysqli_connect_errno($db_link) . ' : ' . mysqli_connect_error($db_link);
}
mysqli_connect関数にデータベースの情報を渡し、接続を行います。
接続結果は$db_linkに格納し、この後もデータベースハンドラとして使用します。
続くif文の条件式にあるmysqli_connect_errno関数で、接続が成功したかを判定します。
もし接続エラーがあった場合はif文の中でmysqli_connect_errno関数とmysqli_connect_error関数でエラー番号と内容を出力します。
続いて、データベースのアクセスに使用する文字コードを指定します。
mysqli系の関数では、第1引数にハンドラを渡し、第2引数に文字コード名やSQLを渡すのが基本的な形になります。
文字コードを設定する
mysqli_set_charset( $db_link, 'utf8');
続く2行はデータを取得するコードです。
データを取得する
$sql = 'SELECT * FROM gc_granola';
$res = mysqli_query( $db_link, $sql);
1行目はデータを取得するSQL文を$sqlに入れています。
そのSQLをmysqli_query関数に渡して実行し、取得結果を$resに格納します。
データを取得できた場合は、続くif文の中で出力します。
取得結果を出力
if( $res ) {
var_dump($res->fetch_all());
}
取得結果はmysqli_resultクラスのインスタンスが返り値となるため、fetch_allメソッドを使って出力します。
最後に、mysqli_close関数でデータベースとの接続を解除して終了します。
取得結果を出力
mysqli_close($db_link);
以上が関数を使った方法でした。
データをオブジェクト形式で取得する
初期設定では、取得したデータは配列形式になります。
この形式はオブジェクト形式で取得することもできます。
コード例
$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'database_name');
if( $mysqli->connect_errno ) {
echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
}
$mysqli->set_charset('utf8');
$sql = 'SELECT * FROM gc_granola';
$res = $mysqli->query($sql);
while( $data = $res->fetch_object() ) {
var_dump($data);
}
$mysqli->close();
実行結果
解説
取得したデータはwhile文で処理しています。
fetch_objectメソッドは、取得した全データから先頭にあるデータを1つ、オブジェクト形式で取得します。
そのため、while文は取得したデータの数だけループを繰り返します。
while文の中では、while文の条件式で取得したデータをそのままダンプしています。
データを連想配列で取得する
データを、テーブルのカラム名を使った連想配列形式で取得することも可能です。
その場合、fetch_assocメソッドを使用します。
コード例
$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'database_name');
if( $mysqli->connect_errno ) {
echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
}
$mysqli->set_charset('utf8');
$sql = 'SELECT * FROM gc_granola';
$res = $mysqli->query($sql);
while( $data = $res->fetch_assoc() ) {
var_dump( $data );
}
$mysqli->close();
実行結果
データを数値の添字、連想配列の両方の形式で取得する
取得したデータを、「数値の添字」と「テーブルカラム名の連想配列」の両方で取得することも可能です。
その場合、fetch_arrayメソッドを使用します。
コード例
$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'database_name');
if( $mysqli->connect_errno ) {
echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
}
$mysqli->set_charset('utf8');
$sql = 'SELECT * FROM gc_granola';
$res = $mysqli->query($sql);
while( $data = $res->fetch_array() ) {
var_dump( $data );
}
$mysqli->close();
実行結果
次のような数字の添字、および連想配列のどちらでもアクセスできる配列を取得することができます。
取得したデータの件数を取得
取得したデータの件数を知りたいときは、mysqli_resultクラスのnum_rowsプロパティから取得することができます。
コード例
$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'database_name');
if( $mysqli->connect_errno ) {
echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
}
$mysqli->set_charset('utf8');
$sql = 'SELECT * FROM gc_granola';
$res = $mysqli->query($sql);
echo '取得したデータの件数:' . $res->num_rows;
$mysqli->close();
実行結果
次のような数字の添字、および連想配列のどちらでもアクセスできる配列を取得することができます。
取得したデータを様々な形で処理することができるよう、mysqli_resultクラスには上記以外にも様々なメソッド、プロパティが用意されています。
より詳しくはphp.netの「mysqli_resultクラス」項目を参照してください。
mysqli_result クラス – php.net
こちらの記事は役に立ちましたか?
コメントありがとうございます!
運営の参考にさせていただきます。
ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。