PHPプログラミング

ベストプラクティス

mysqliでデータを取得(SELECT)

  • このエントリーをはてなブックマークに追加

今回はmysqliとSQLのSELECT文を使って、データベースからデータを取得する方法を解説していきます。

必要なデータを取得する

mysqli_query関数とSELECT文を使って、接続したデータベースから必要なデータを取得していきましょう。例として、次のテーブルを使って進めます。

テーブル名:gc_granola
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を使ってデータベースへ接続」と同様です。接続までの部分について、詳しくはこちらの記事をご覧ください。


オブジェクト型の書き方

まずは、最もシンプルな全データを取得するコードを書いていきましょう。

コード

$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'gc_database');

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クエリを実行し、結果が取得できたら表示を行うのみのシンプルな内容です。

$sqlにテーブル「gc_granola」から全データを取得するためのSQL文を記述し、次の行のqueryメソッドで実行しています。

queryメソッドの実行結果として、mysql_resultオブジェクトが生成されて$resに格納されます。このオブジェクトに取得したデータも含まれており、メソッドでアクセスすることが可能です。そのメソッドの1つがif文の中で実行しているfetch_allメソッドです。


手続き型の書き方

次は、手続き型で全データを取得するコードを書いていきます。

コード

$db_link = mysqli_connect( 'host_name', 'user_name', 'password', 'gc_database');

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);

解説

mysqliの書き方が関数になるだけなので、実行結果やSQL文、mysql_resutlオブジェクトから取得データにアクセスするところなどは全て同じ内容です。


取得データをオブジェクト形式で取得する

先ほどのコードでは、取得したデータは配列形式で一括取得していました。次に、オブジェクト形式で取得する方法を確認していきます。データを取得する部分は全く同じです。

コード

$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'gc_database');

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', 'gc_database');

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', 'gc_database');

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', 'gc_database');

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 – php.net

  • このエントリーをはてなブックマークに追加