PHPプログラミング

最終更新日:
公開日:

レシピ

データベース MySQL / MariaDB

mysqliでMySQL/MariaDBからデータを取得:SELECT

MySQLiクラスのオブジェクトや関数を使って、データベースからデータを取得する基本的な方法を解説していきます。

この記事のポイント

  • mysqliを使ってMySQLデータベースからデータを取得する
  • 取得するデータの形式を数値配列、連想配列(カラム名)、オブジェクト形式で指定する
  • 取得したデータの件数を取得する

目次

データベースから必要なデータを取得する

MySQLiクラスのオブジェクトや関数とSQLのSELECT文を使って、接続したデータベースからデータを取得する例を見ていきましょう。
今回は次のようなuserテーブルにデータが入っていることを想定して進めていきます。

テーブル名:user
idnamegenderagemodify_datetimecreate_datetime
1青山 太郎1352016-10-04 00:00:002014-04-10 00:00:00
2飯島 彩子2262016-10-02 00:00:002014-04-10 00:00:00
3宇多 太郎1272016-10-01 00:00:002014-04-10 00:00:00
4江藤 彩子2322016-09-20 00:00:002015-08-07 00:00:00
5大島 太郎1222016-09-03 00:00:002012-10-05 00:00:00
6加藤 彩子2412016-09-18 00:00:002012-04-20 00:00:00
7岸田 太郎1272016-09-18 00:00:002012-04-20 00:00:00
8工藤 彩子2392016-10-01 00:00:002012-05-10 00:00:00
9小島 太郎1302016-09-10 00:00:002012-04-20 00:00:00
10佐藤 彩子2322016-09-24 00:00:002012-05-15 00:00:00

各カラムの役割は次の通りです。

  • id – ID(主キー)
  • name – 名前
  • gender – 性別。1は男性、2は女性
  • age – 年齢
  • modify_datetime – データ更新日時
  • create_datetime – データ登録日時

今回はデータベースのデータを取得する基本部分について解説しますが、データの取得に条件や並び順を指定する方法については、別記事「mysqliのSELECT文を使った様々なデータの取得方法」を参照してください。

また、データベースへの接続までの流れについて詳しくは「mysqliを使ってMySQL/MariaDBのデータベースへ接続」をご覧ください。

オブジェクトを使った書き方

MySQLiクラスのオブジェクトを使って、まずはシンプルにテーブルにある全てのデータを取得していきます。

index.php

// データベースと接続
$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');

// プリペアドステートメントを使ってデータを取得
$stmt = $mysqli->prepare('SELECT * FROM user');
$stmt->execute();

// 結果を取得
$result = $stmt->get_result();

// 結果を出力
while( $row_data = $result->fetch_array(MYSQLI_NUM) ) {
	var_dump($row_data);
}

// データベースとの接続解除
$mysqli->close();

冒頭のデータが入っている場合、「// 結果を出力」の3行を実行すると以下のように全てのデータが出力されます。

実行結果

array(6) {
	["id"]=> int(1)
	["name"]=> string(13) "青山 太郎"
	["gender"]=> int(1)
	["age"]=> int(35)
	["modify_datetime"]=> string(19) "2016-10-04 00:00:00"
	["create_datetime"]=> string(19) "2014-04-10 00:00:00"
}
array(6) {
	["id"]=> int(2)
	["name"]=> string(13) "飯島 彩子"
	["gender"]=> int(2)
	["age"]=> int(26)
	["modify_datetime"]=> string(19) "2016-10-02 00:00:00"
	["create_datetime"]=> string(19) "2014-04-10 00:00:00"
}
array(6) {
	["id"]=> int(3)
	["name"]=> string(13) "宇多 太郎"
	["gender"]=> int(1)
	["age"]=> int(27)
	["modify_datetime"]=> string(19) "2016-10-01 00:00:00"
	["create_datetime"]=> string(19) "2014-04-10 00:00:00"
}

...省略...

array(6) {
	["id"]=> int(10)
	["name"]=> string(13) "佐藤 彩子"
	["gender"]=> int(2)
	["age"]=> int(32)
	["modify_datetime"]=> string(19) "2016-09-24 00:00:00"
	["create_datetime"]=> string(19) "2012-05-15 00:00:00"
}

上記のコードではMySQLiクラスのオブジェクトを作成してデータベースに接続し、プリペアドステートメントを使ってSQLを実行してデータベースからデータを全件取得します。

まず、最初の5行ではMySQL/MariaDBのデータベースへ接続を行っています。
接続にエラーがある場合はif文の中にあるecho文で、エラー番号が入っているconnect_errnoプロパティとエラー内容が入っているconnect_errorプロパティの内容を出力します。

データベースへ接続する

// データベースと接続
$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'database_name');

if( $mysqli->connect_errno ) {
	echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
}

続くset_charsetメソッドでは、データベースの文字コードを指定します。

文字コードを設定

// 文字コードを設定
$mysqli->set_charset('utf8');

続いて、プリペアドステートメントを使って絵データを取得します。

データを取得

// プリペアドステートメントを使ってデータを取得
$stmt = $mysqli->prepare('SELECT * FROM user');
$stmt->execute();

取得したデータはget_resultメソッドを使ってmysqli_resultオブジェクトから参照することができます。
こちらのオブジェクトに結果データが入っているので、結果データをfetch_arrayメソッドで1行ずつ取得してvar_dump関数で出力します。

取得したデータを出力

// 結果を取得
$result = $stmt->get_result();

// 結果を出力
while( $row_data = $result->fetch_array(MYSQLI_NUM) ) {
	var_dump($row_data);
}

最後に、closeメソッドでデータベースとの接続を解除して終了します。

データベースとの接続を解除

// データベースとの接続解除
$mysqli->close();

以上がMySQLiクラスのオブジェクトを使った基本的なデータの取得になります。

mysqli系の関数(手続き型)を使った書き方

続いて、mysqli系の関数(手続き型)を使ってデータを全件取得するコードをみていきます。
全体的な流れや結果については「オブジェクトを使った書き方」と同様です。

index.php

// データベースと接続
$db_link = mysqli_connect( 'host_name', 'user_name', 'password', 'database_name');

if( mysqli_connect_errno() ) {
	echo mysqli_connect_errno() . ' : ' . mysqli_connect_error();
}

// 文字コードを設定
mysqli_set_charset( $db_link, 'utf8');

// プリペアドステートメントを使ってデータを取得
$stmt = mysqli_prepare( $db_link, 'SELECT * FROM user');
mysqli_stmt_execute($stmt);

// 結果を取得
$result = mysqli_stmt_get_result($stmt);

// 結果を出力
while( $row_data = mysqli_fetch_array( $result, MYSQLI_ASSOC) ) {
	var_dump($row_data);
}

// データベースとの接続解除
mysqli_close($db_link);

上記のコードを順に解説します。
最初の5行はデータベースへの接続をするコードです。
正常にデータベースへ接続すると、変数$db_linkにデータベースの接続情報が入ったオブジェクトが入ります。

データベースへ接続する

// データベースと接続
$db_link = mysqli_connect( 'host_name', 'user_name', 'password', 'database_name');

if( mysqli_connect_errno() ) {
	echo mysqli_connect_errno() . ' : ' . mysqli_connect_error();
}

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

続く以下のコードではプリペアドステートメントを使ってデータを取得します。

データを取得する

// プリペアドステートメントを使ってデータを取得
$stmt = mysqli_prepare( $db_link, 'SELECT * FROM user');
mysqli_stmt_execute($stmt);

1行目はデータを取得するSQL文を$sqlに入れています。
そのSQLをmysqli_query関数に渡して実行し、取得結果を$resに格納します。

取得したデータはmysqli_stmt_get_result関数を使ってmysqli_resultオブジェクトから参照することができます。
オブジェクトを一度変数$resultに入れ、続いてmysqli_fetch_array関数を使ってデータを1行ずつ取得します。
while文では取得したデータの件数分ループを繰り返し、var_dump関数でデータを1行ずつ出力します。

取得結果を出力

// 結果を取得
$result = mysqli_stmt_get_result($stmt);

// 結果を出力
while( $row_data = mysqli_fetch_array( $result, MYSQLI_ASSOC) ) {
	var_dump($row_data);
}

最後にmysqli_close関数でデータベースとの接続を解除して終了します。

取得結果を出力

// データベースとの接続解除
mysqli_close($db_link);

以上がmysqli系の関数(手続き型)を使った基本的なデータの取得方法でした。

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

ここまでは取得したデータを配列形式で取得しましたが、オブジェクト形式で取得することもできます。
以下の例はMySQLiクラスのオブジェクトを使ってデータを取得した後に、fetch_objectメソッドを実行して結果データをオブジェクト形式で取得します。

オブジェクトを使った書き方

index.php

// データベースと接続
$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');

// プリペアドステートメントを使ってデータを取得
$stmt = $mysqli->prepare('SELECT * FROM user');
$stmt->execute();

// 結果を取得
$result = $stmt->get_result();

// 結果を出力
while( $row_data = $result->fetch_object() ) {
	var_dump($row_data);
}

// データベースとの接続解除
$mysqli->close();

mysqli系の関数(手続き型)を使った書き方

mysqli系の関数(手続き型)を使った書き方ではmysqli_fetch_object関数を使います。

index.php

// データベースと接続
$db_link = mysqli_connect( 'host_name', 'user_name', 'password', 'database_name');

if( mysqli_connect_errno() ) {
	echo mysqli_connect_errno() . ' : ' . mysqli_connect_error();
}

// 文字コードを設定
mysqli_set_charset( $db_link, 'utf8');

// プリペアドステートメントを使ってデータを取得
$stmt = mysqli_prepare( $db_link, 'SELECT * FROM user');
mysqli_stmt_execute($stmt);

// 結果を取得
$result = mysqli_stmt_get_result($stmt);

// 結果を出力
while( $row_data = mysqli_fetch_object( $result) ) {
	var_dump($row_data);
}

// データベースとの接続解除
mysqli_close($db_link);

結果の出力例

object(stdClass)#4 (6) {
	["id"]=> int(1)
	["name"]=> string(13) "青山 太郎"
	["gender"]=> int(1)
	["age"]=> int(35)
	["modify_datetime"]=> string(19) "2016-10-04 00:00:00"
	["create_datetime"]=> string(19) "2014-04-10 00:00:00"
}
object(stdClass)#5 (6) {
	["id"]=> int(2)
	["name"]=> string(13) "飯島 彩子"
	["gender"]=> int(2)
	["age"]=> int(26)
	["modify_datetime"]=> string(19) "2016-10-02 00:00:00"
	["create_datetime"]=> string(19) "2014-04-10 00:00:00"
}

...省略...

取得したデータを数値添字配列、連想配列(カラム名)で取得する

取得したデータはfetch_arrayメソッドを使って配列形式で取得することができますが、メソッドに以下のいずれかの定数をパラメータで渡すと連想配列、数値添字配列を指定することができます。

定数配列の形式
MYSQLI_NUM数値添字配列
MYSQLI_ASSOC連想配列(カラム名)
なし、MYSQLI_BOTH連想配列(カラム名)、数値添字配列の両方

オブジェクトを使った書き方

// 数値添字配列
$row_data = $result->fetch_array(MYSQLI_NUM);

// 連想配列(カラム名)
$row_data = $result->fetch_array(MYSQLI_ASSOC);

// 両方
$row_data = $result->fetch_array();
$row_data = $result->fetch_array(MYSQLI_BOTH);

mysqli系の関数(手続き型)を使った書き方

// 数値添字配列
$row_data = mysqli_fetch_array( $result, MYSQLI_NUM);

// 連想配列(カラム名)
$row_data = mysqli_fetch_array( $result, MYSQLI_ASSOC);

// 両方
$row_data = mysqli_fetch_array( $result );
$row_data = mysqli_fetch_array( $result, MYSQLI_BOTH);

取得したデータの件数を取得

取得したデータの件数を知りたいときは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');

// プリペアドステートメントを使ってデータを取得
$stmt = $mysqli->prepare('SELECT * FROM user');
$stmt->execute();

// 結果を取得
$result = $stmt->get_result();
var_dump($result->num_rows); // 10

// データベースとの接続解除
$mysqli->close();

関数を使った方法についても、mysqli_resultクラスnum_rowsプロパティを参照して取得件数を参照します。

mysqli系の関数(手続き型)を使った書き方

// データベースと接続
$db_link = mysqli_connect( 'host_name', 'user_name', 'password', 'database_name');

if( mysqli_connect_errno() ) {
	echo mysqli_connect_errno() . ' : ' . mysqli_connect_error();
}

// 文字コードを設定
mysqli_set_charset( $db_link, 'utf8');

// プリペアドステートメントを使ってデータを取得
$stmt = mysqli_prepare( $db_link, 'SELECT * FROM user');
mysqli_stmt_execute($stmt);

// 結果を取得
$result = mysqli_stmt_get_result($stmt);
var_dump($result->num_rows); // 10

// データベースとの接続解除
mysqli_close($db_link);