質問: プログラミング初心者の者です。 ログイン画面と新規登録画面をPHPで実装しようとしているのですが、pdoとmysqliとは共存できないのでしょうか? 少し書き方が違うもの、という認識で新規登録はmysqliで、ログイン画面はpdoの書き方をしたところ、後に作成したログイン画面が機能しません。 エディター上でのエラーは一切表示されずブラウザで、nullやundefinedのエラーがでます。
回答: この記事によると、FAQに「混在はできない」と書いてあるそうです。 mysqli pdo - PHPでMySQL APIを混在させることはできますか? そのFAQはこちらですね。引用部分の最後の強調は私が入れました。 PHP:データベースに関する問題 - Manual > > **10 年前からずーっと MySQL 拡張モジュール (ext/mysql) を使ってきました。なぜ今さら「使ってはいけない」と言われるのですか? 廃止されちゃうんですか? 私はいったいどうすればいいの? 今までのコードはどうなるの?** > > 現在、MySQL 用の拡張モジュールは 3 種類用意されています。 MySQL API の選択 にあるとおりです。 古い API は使ってはいけません。PHP 5.5.0 以降では非推奨になっており、PHP 7.0.0 から本体に同梱されなくなって PECL に移ります。 でも、今後新しく書くコードでは mysqli か PDO_MySQL を使うことを強く推奨します。 > > > 今までのコードの移行用スクリプトは、今のところ用意されていません。 しかし、mysqli の API には手続き型とオブジェクト指向型の 2 種類が用意されており、 手続き型の API は ext/mysql と似ています。 > > > **複数の拡張モジュールを混ぜて使うことはできません。つまり、 たとえば mysqli のコネクションを PDO_MySQL や ext/mysql に渡しても動作しないということです。** > > > コネクションの使いまわしは出来ない。とは書いてあります。 ただし、それぞれ用に独立したコネクションを作るといったことについては書いてありません。 そんなことが出来るのか、やって意味があるのか、については知識が無いので判りませんが。 ちなみに使いまわした例がこの記事のようです。 直接の原因はパラメータ文字列に余計な空白が入っていたことらしいですが。 元記事 Why can't I connect to database using PHP Slim framework? 日本語 PHP Slimフレームワークを使用してデータベースに接続できないのはなぜですか? 機能比較などはこのページでしょう。 PHP マニュアル 関数リファレンス データベース関連 ベンダー固有のモジュール MySQL MySQL 用 PHP ドライバの概要 どの API を使うか ついでに、少し古めですが、こんな記事があったので紹介。 PHPのDB接続ライブラリを図でまとめてみた|なぞプロ > > MySQLi > > MySQL4.1以上向け。 > > 4.0以下への接続は設計上考慮されていないので、使うべきではない。 > > PDO > > データベース抽象化を行い、各DBを同じメソッドで使用できる。 > > PDO自体はMySQL3.x、4.x、5.xに対応しているのだが、ドライバ層とのリンクが限られて > > いる関係で、実質MySQL4.1以上にしか接続できない。 > > (ただしlimysqlclient4.1以下とのリンクがサポートされていないだけで、コンパイル自体は > > できるらしい・・・!) > > > モダンなPHPでこうあるべき > > > 基本的にはPDOを使うべき。 > > ただPDOではデータベース個別の細かい機能は提供できていなかったりするので、 > > そういう機能が必要ならMySQLiを使用する。 > > > さらにこちらの記事も。2つ目の回答の記事リストが興味深いですね。 PDOとmysqliはどっちを使うべき? ここで紹介されている PDOとMySQLi|-FLAMA技術Blog では、抜粋するとこんな記述が。 > > PDOの接続・切断は...PDOオブジェクト変数に対して明示的にnullを代入することで切断するとされていますね。 > > ......で、やってみるとわかるんですが、数百回くらい回したところで、SQLエラーが出ます。 > > エラーメッセージは「Too many connections」です。 > > > 下まで見ていくと、「User Contributed Notes」に興味深い投稿があります。 > > > > NULL代入では切断されない、と。 > > > 上記記事の続きはちょっと誤解したまま進んでいるようですが、元々のphp.netの記事では途中に `prepare` で作ったオブジェクトにも `null` を代入することで切断出来たと書いてあります。