17
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

mysqli の忘備録 -PDOとmysqliの違い-

PHP&MySQLを触り始めて半年。初めてmysqliというものを知ったので、調べて聞いて分かったことを残しておきたいと思います。

mysqliとは?

PHPのリファレンスにちゃんとあります!(当たり前)
https://www.php.net/manual/ja/book.mysqli.php
mysqliは、PHP5.5以降で非推奨、7.0で削除となったmysql_系のメソッドの代替となるものです。
具体的にはPHPの拡張機能であり、PHPからMySQLデータベースを操作する時のインターフェースを提供する、つまりDBに接続してゴニョゴニョやる時に使うものです。

どのAPIをつかうか- PHPリファレンスより

リファレンスによると、MySQLに接続するためのAPIは3種類あり、PDO、mysqli、そして残りは非推奨(削除)となったmysqlです。
ということでDBにMySQLを使う場合、インターフェースは、PDO vs mysqli の二択となります。
個人的にはPDO使っておけば大丈夫!と思っていたので別のメソッドあったんだー、と言う感じです。

上記リンク内で、PDO方式とmysqli方式の簡単な比較が一覧で示されています。
しかしながら、それを眺めてみて私はこう思いました。

『え、ほとんど違いなくないっ??(PDOでいいじゃん)』

実際にパフォーマンス自体はほぼ同じ、と堂々と記述されていますし、速度についても『拡張モジュールの与える影響はごくわずか』ということでしたので間違ってはいないのですが、この微妙な違いが気になったのです。
なので、自分でググったり偉い人に聞いたりしたことをまとめておきます。

mysqliの特徴(PDOとの違い)

PDOの特徴についてまとめた記事は、たくさんあるので割愛。mysqliの特徴だけまとめていきます!

1. 書き方が2種類。手続き型とオブジェクト型
2. PDOより多くのことが実現できる
3. PDOより高速らしい(が、影響は非常に限定的なので気にするべき違いではない)

書き方が2種類ある

これは非推奨(削除)となったmysql_系のメソッドからの移行を考慮してのことだと思われます。
リファレンスでも、オブジェクト型の記述の方が『より現代的であり、より体系化されたコードにつながるので、通常は好ましい』とされていますが、コストの低い移行方法として手続き型の記述を残しているようです。

手続き型ver.php
// mysql_からの移行がしやすい(従来の書き方に近い)
$mysqli = mysqli_connect("example.com", "user", "password", "database");
if (mysqli_connect_errno($mysqli)) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$res = mysqli_query($mysqli, "SELECT 'A world full of ' AS _msg FROM DUAL");
$row = mysqli_fetch_assoc($res);
echo $row['_msg'];
オブジェクト型ver.php
// インスタンスを生成する
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
}

$res = $mysqli->query("SELECT 'choices to please everybody.' AS _msg FROM DUAL");
$row = $res->fetch_assoc();
echo $row['_msg'];

PDOより多くのことができる

個人的に難しく感じたのは、2番目の特徴である『より多くのこと』の範囲です。
実際にとあるサイトでは、

初心者は理由がなければ便利だしPDOで良いよ、でも上級者でいろいろやりたい事あるならmysqliメソッドがオススメ!

って言ってます。

『より多くのこと』を具体的に挙げてみると、非同期処理とか、複数クエリ発行とか、最新のMySQL固有の機能を使いたい時、とのこと。これはmysqliが、文字通りMySQL専用拡張機能だからと言えます。
ゴリゴリMySQLの機能を使い倒したいプロフェッショナルな方は、mysqliを使うと便利です!ってことです。

対して、PDO方式はMySQL以外にも対応しているので 汎用性が高く、一般的な処理の範囲であればわざわざMySQLiを使う理由はない と言えます。PDOの方が出現回数が多くなるのも当然です。

mysqliを使いたいなーと思ったら

実際の使い方は、日本語だとこの辺のがとても分かり易かったです。
PDOと微妙に違うので比較しながら見ると良いと思います!

https://qiita.com/yasumodev/items/bd2ba476f31804d527d3
https://gray-code.com/php/connection-db-by-using-mysqli/
https://www.petitmonte.com/php/php_mysqli.html

まとめ

PDO使った方がいい人

初心者、MySQL以外も使う人、一般的な利用

MySQLi使った方がいい人

MySQL大好きマン、昔のメソッドから手っ取り早く移行したい人、強い人(学習コストに抵抗がない人)

ということで、偶然ソースコードレビューしていて遭遇したmysqliメソッドについてまとめました。こういう機会があるので人のコード見るのは勉強になります!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
17
Help us understand the problem. What are the problem?