最終更新日:
公開日:
レシピ
データベース MySQL / MariaDB
mysqliでMySQL/MariaDBからデータを取得:SELECT
MySQLiクラスのオブジェクトや関数を使って、データベースからデータを取得する基本的な方法を解説していきます。
この記事のポイント
- mysqliを使ってMySQLデータベースからデータを取得する
- 取得するデータの形式を数値配列、連想配列(カラム名)、オブジェクト形式で指定する
- 取得したデータの件数を取得する
目次
データベースから必要なデータを取得する
MySQLiクラスのオブジェクトや関数とSQLのSELECT文を使って、接続したデータベースからデータを取得する例を見ていきましょう。
今回は次のようなuserテーブルにデータが入っていることを想定して進めていきます。
id | name | gender | age | modify_datetime | create_datetime |
---|---|---|---|---|---|
1 | 青山 太郎 | 1 | 35 | 2016-10-04 00:00:00 | 2014-04-10 00:00:00 |
2 | 飯島 彩子 | 2 | 26 | 2016-10-02 00:00:00 | 2014-04-10 00:00:00 |
3 | 宇多 太郎 | 1 | 27 | 2016-10-01 00:00:00 | 2014-04-10 00:00:00 |
4 | 江藤 彩子 | 2 | 32 | 2016-09-20 00:00:00 | 2015-08-07 00:00:00 |
5 | 大島 太郎 | 1 | 22 | 2016-09-03 00:00:00 | 2012-10-05 00:00:00 |
6 | 加藤 彩子 | 2 | 41 | 2016-09-18 00:00:00 | 2012-04-20 00:00:00 |
7 | 岸田 太郎 | 1 | 27 | 2016-09-18 00:00:00 | 2012-04-20 00:00:00 |
8 | 工藤 彩子 | 2 | 39 | 2016-10-01 00:00:00 | 2012-05-10 00:00:00 |
9 | 小島 太郎 | 1 | 30 | 2016-09-10 00:00:00 | 2012-04-20 00:00:00 |
10 | 佐藤 彩子 | 2 | 32 | 2016-09-24 00:00:00 | 2012-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);
こちらの記事は役に立ちましたか?
コメントありがとうございます!
運営の参考にさせていただきます。
ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。