最終更新日:
公開日:
レシピ
データベース MySQL/MariaDB
PHPでMySQL / MariaDBのデータベースを使う
PHPからMySQL / MariaDBのデータベースにアクセスする方法について解説します。MySQLとMariaDBの違いも紹介します。
この記事のポイント
- MySQLとMariaDBは互換性があり、基本的な操作は共通している
- 基本的な操作はMySQLiとPDOを使う方法が用意されている
目次
MySQLとMariaDBについて
MySQLとMariaDBはいずれもオープンソースで開発が進められたデータベースです。
まずはこの2つのデータベースの違いについて簡単に紹介します。
MySQLについて
MySQLは世界で最も有名なリレーショナルデータベースです。
Oracleデータベースと並んで広く使われています。
2008年に開発元の「MySQL AB」をサン・マイクロシステムズが買収し、さらに2010年にサン・マイクロシステムズがオラクルに買収されたことで、現在はオラクルが商標権や著作権を所有しています。
このような背景があり、MySQL ABの創設者がMySQLに完全互換のデータベースを派生して開発を進めたのがもう1つのMariaDBです。
MariaDBについて
MariaDBはMySQLから派生して開発が進められている、MySQLと互換性があるデータベースです。
システムからのデータベースアクセス方法も互換性があるため、データベースの違いをほぼ意識する必要なく使用できることもポイントになります。
2つのデータベースの違い
MariaDBはMySQLの非商用版をベースに開発が進められていたため、今までは使用にあたって違いを意識する必要がありませんでした。
しかし2013年以降、MySQLバージョン5.6から大幅なリファクタリング(動作は同じままに内部を最適化すること)されたことを機に、MariaDBでは実装するMySQLの機能の絞り込みと独自機能を実装する開発方針に変更されました。
そのため、今まではほぼ同じデータベースとして扱われてきましたが、今後は徐々に2つのデータベースが切り分けて扱われるかもしれません。
※2021年8月5日現在
MySQL | MariaDB | |
---|---|---|
最新版 | 8.0.24 | 10.6.3 |
開発元 | オラクル | MariaDB Corporation Ab MariaDB Foundation |
ライセンス | GPL バージョン2 Commercial License | GPL バージョン2 LGPL for clients |
公式サイト | MySQL | MariaDB |
PHPからMySQL / MariaDBを使う
2021年8月5日現在では、PHPからMySQL、MariaDBのデータベースに接続したり各種操作をするときは共通の方法でアクセスすることができます。
アクセスする方法としてはPHPからMySQLデータベースの操作をするための拡張機能であるmysqliのオブジェクトか関数を使った方法と、PDO(PHP Data Object)を使う方法の3種類が用意されています。
ここからはそれぞれの方法を使って、特定のデータを取得するクエリを使って紹介していきます。
前提として、データベースtestには次のようなusersテーブルがあり、ここからデータを取得することとします。
カラム名 | 型 | その他 |
---|---|---|
id | 整数 | 主キー |
name | 文字列 | |
age | 整数 | |
created_at | 日付(またはタイムスタンプ) |
mysqliオブジェクトの使用例
まずはmysqliオブジェクトのインスタンスを作成して、データを取得する方法を紹介します。
mysqliオブジェクトのコード例
<?php
$id = 10;
$host = 'localhost';
$user = 'username';
$password = 'password';
$db = 'test';
try {
// (1) データベースに接続
$mysqli = new mysqli( $host, $user, $password, $db);
// (2) データを登録するSQL
$stmt = $mysqli->prepare('SELECT * FROM users WHERE id = ?');
// (3) 値をセット
$stmt->bind_param( 'i', $id);
// (4) SQL実行
$stmt->execute();
// (5) 取得したデータをセットする変数を設定
$stmt->bind_result( $id, $first_name, $last_name, $email, $tel);
// (6) 結果を取得
if( $stmt->fetch() ) {
var_dump( $id, $first_name, $last_name );
}
// (7) データベースの接続解除
$mysqli->close();
} catch(Exception $e) {
// (8) エラーメッセージを出力
echo $e->getMessage();
}
(1)でmysqliオブジェクトのインスタンスを作成することでデータベースに接続します。
変数$mysqliには接続に成功するとデータベースへの接続状態を含めたmysqliオブジェクトが入り、接続に失敗したときはfalseが入ります。
(2)ではデータを取得するSQLをプリペアドステートメントを使って登録します。
SQLのWHERE句にある「?」はプレースホルダーと呼び、続く(3)でbind_paramメソッドを使って検索したいidカラムの値をセットします。
(4)でここまで用意したSQLクエリを実行して、(5)で取得したデータの値を各変数で受け取る設定をします。
データを受け取る変数はテーブルのカラムに応じて用意する必要があります。
続いて(6)でfetchメソッドを実行すると、(5)で設定した変数に取得したデータが先頭から順にカラムごとにセットされていきます。
最後に、(7)のcloseメソッドでデータベースとの接続を解除して終了です。
もし(1)から(7)まで実行している間にエラーが起こったときはcatch文で受け取って(8)の箇所でエラーメッセージを出力します。
mysqli関数の使用例
続いて、mysqliの関数を使ってデータを取得する例を紹介します。
コード例
<?php
$id = 10;
$host = 'localhost';
$user = 'username';
$password = 'password';
$db = 'test';
try {
// (1) データベースに接続
$mysqli = mysqli_connect( $host, $user, $password, $db);
// (2) データを登録するSQL
$stmt = mysqli_prepare( $mysqli, 'SELECT * FROM users WHERE id = ?');
// (3) 値をセット
mysqli_stmt_bind_param( $stmt, 'i', $id);
// (4) SQL実行
mysqli_stmt_execute($stmt);
// (5) 取得したデータをセットする変数を設定
mysqli_stmt_bind_result( $stmt, $id, $first_name, $last_name, $email, $tel);
// (6) 結果を取得
if( mysqli_stmt_fetch($stmt) ) {
var_dump( $id, $first_name, $last_name );
}
// (7) データベースの接続解除
mysqli_close($mysqli);
} catch(Exception $e) {
// (8) エラーメッセージを出力
echo $e->getMessage();
}
全体的な流れはオブジェクトを使ったときと同様です。
大きな違いはオブジェクトのメソッドではなく関数のみ使用するため、接続情報の入ったmysqliオブジェクトやプリペアドステートメントのmysqli_stmtオブジェクトは変数を経由して関数に渡して実行する必要があります。
こちらの例では(1)で作成したmysqliオブジェクトを変数$mysqliに入れて、mysqli_stmtオブジェクトは変数$stmtに入れてそれぞれ関数に渡して実行しています。
PDOの使用例
最後にPDOを使ってデータを取得する例を紹介します。
コード例
<?php
$id = 10;
$host = 'localhost';
$user = 'username';
$password = 'password';
$db = 'test';
try {
// (1) データベースに接続
$pdo = new PDO('mysql:charset=UTF8;dbname='.$db. ';host='.$host, $user, $password);
// (2) データを取得するSQL
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
// (3) 値をセット
$stmt->bindParam( ':id', $id, PDO::PARAM_INT);
// (4) SQL実行
$res = $stmt->execute();
// (5) データを取得
if( $res ) {
$data = $stmt->fetch();
}
} catch(PDOException $e) {
// (6) エラーメッセージを出力
echo $e->getMessage();
} finally {
// (7) データベースの接続解除
$pdo = null;
}
PDOを使った方法では、まず(1)でPDOオブジェクトを作成します。
コンストラクタに接続情報、ユーザー名、パスワードを渡すとPDOオブジェクトを作成するときにデータベースに接続します。
続く(2)ではプリペアドステートメントに実行するSQLを渡してPDOStatementオブジェクトを作成します。
mysqliのときはプレースホルダーが「?」でしたが、PDOでは変数のようにプレースホルダーに任意の名前をつけることができます。
今回はidカラムのプレースホルダーなので「:id」にしています。
(3)では先ほどのプレースホルダーに値をセットしています。
ここでは先ほどの「:id」に変数$idの値をセットして、さらに値の型を定数「PDO::PARAM_INT」で指定します。
(4)のexecuteメソッドでここまで用意してきたプリペアドステートメントを実行し、(5)のfetchメソッドで実行結果を取得します。
もし(1)から(5)の間にエラーが発生したときはcatch文でPDOExceptionオブジェクトを受け取って、(6)でエラー内容を出力します。
最後にfinally文で変数$pdoにnullを入れて空にすることでデータベースとの接続を解除します。
各操作についてさらに詳しく解説
今回はデータの取得を例に紹介してきましたが、データベースの操作についてもう少し詳しく知りたい方は以下のページをご覧ください。
大きく分けて、mysqli系とPDOを使った2種類の方法があります。
mysqli系
mysqliを使ってデータベースへ接続
mysqliクラス、およびmysqli_connect関数を使ったデータベースの接続方法について解説します。
現在は非推奨とされるmysqlクラス、mysql_connect関数との違いや移行方法も紹介します。
mysqliでテーブルを作成(CREATE TABLE)
MySQL/MariaDBのデータベースに新しくテーブルを作成する方法について解説します。
mysqliでデータを取得(SELECT)
SQLのSELECT文を使ったデータ取得方法を解説。
取得するデータの形式を指定する方法や、取得件数を指定する方法も解説します。
mysqliでデータを新規登録(INSERT)
SQLのINSERT文の解説から、データベースに新しくデータを登録する方法について解説します。
mysqliでデータを更新(UPDATE)
SQLのUPDATE文の解説から、データベースにあるデータを更新する方法について解説します。
mysqliでデータを削除(DELETE)
SQLのDELETE文の解説から、データベースにあるデータを削除する方法について解説します。
mysqliのSELECT文を使った様々なデータの取得方法
日付で取得するデータを絞り込んだり、データの並びを指定するなど、データ取得のバリエーションについて解説します。
mysqliのトランザクション
データベースのトランザクションを使う方法を解説します。
mysqliのプリペアドステートメント
プリペアドステートメントを使ったデータベースへのアクセス方法について解説します。
mysqliで最後に登録したデータのIDを取得する
最後にデータベースへ登録したデータのIDを取得する方法を解説します。
mysqliで文字列をエスケープする
SQLインジェクションなどセキュリティ対策となる、文字のエスケープ処理を行う方法について解説します。
PDO系
PDOについてと基本操作
PDOを使うメリットの紹介と、基本的な操作について解説します。
PDOで使用できるデータベースを調べる
システムを構築する環境で、PDOが扱うことのできるデータベースを調べる方法について解説します。
PDOを使ってデータベースへ接続
PDOを使ってMySQL/MariaDBに接続する方法を解説します。
PDOでテーブルを作成(CREATE TABLE)
PDOを使ってMySQL/MariaDBのデータベースにテーブルを新しく作成する方法を解説します。
PDOでデータを新規登録(INSERT)
PDOを使ってMySQL/MariaDBのデータベースに新しくデータを登録する方法を解説します。
PDOでデータを取得(SELECT)
PDOを使ってMySQL/MariaDBに登録されているデータを取得する方法について解説します。
PDOでデータを更新(UPDATE)
PDOを使い、MySQL/MariaDBのデータベースに登録されているデータを更新する方法について解説します。
PDOでデータを削除(DELETE)
PDOを使い、MySQL/MariaDBのデータベースのデータを削除する方法を解説します。
PDOのトランザクション
PDOでMySQL/MariaDBのトランザクションを実装する方法を解説します。
PDOで最後に登録したデータのIDを取得する:lastInsertId
データベースへ最後に登録したデータのIDを取得する方法について解説します。