• 締切済み

これからのPHP開発ではPDOを選択するべき?

PHPの勉強をしています。いくつか本を読んでいますが そのなかでPDOと PEAR::MDB2という二つのデータベース抽象化レイヤーを使った演習がありますが違いがよくわかりません。(より突っ込んだ言い方をすればこれからの開発ではMDB2モジュールを使う理由がないように思います)この業界でいうところの後発有利の理に従ってデータベースへの接続はPDOで統一しても大丈夫でしょうか? 技術的な理解として これらのレイヤーを介することで ここのデータベースに依存しないコードの書き方が可能になるのはわかりましたが (私のつかってる教本の質の問題かもしれませんが) なぜ二種類用意されてるのか、なぜMDB2が非推奨でないのか(しばらくはPEARの一部として生き残るということ?)、 その動作の違い、仕様の違いがよくわかりません。 わかるのは全体的にPDOを推されてるということ。 だったらなぜMDB2の説明を含めたのか(私が持ってる5.3に対応した教本の話です) 公式マニュアルを読んでもぐぐってもわからないんです。 というかなにがわからないのかがもうわかりません。 どうか初学者のわたくしめにそれと上にある二つの技術の仕様的な違いを教えてください。 それと最近のPHP開発のデータベース事情も聞かせてもらえるとありがたいです。

  • PHP
  • 回答数3
  • ありがとう数1

みんなの回答

  • iioi
  • ベストアンサー率26% (22/84)
回答No.3

MDB2はPEARでPHPで書かれたライブラリ それに対してPDOは元々はPECLで提供されてきたライブラリでCで書かれているライブラリになる。 速度面でPDOは優れている。 しかも http://www.php.net/manual/ja/intro.pdo.php みればわかるけど5.1以降ではPECL側での提供からPHPにバンドルされるようになったので 標準で組み込まれることが多くなった。 そういう意味ではPDOと各DBのドライバがロードされている環境ならPDOを PDOや使いたいドライバがロードされてない環境なら単純にPHPのライブラリとなるMDB2を使えばいい。 (ただしMDB2は各DBのネイティブのドライバがロードされていないと使えないけど) MDB2でもPDOと同じくらい簡単にプリペアドステートメントは扱える。

  • cheese014
  • ベストアンサー率85% (12/14)
回答No.2

DB処理で最も肝となるのは『SQLインジェクション対策』です。その最も有効な手段は「『プリペアドステートメント』を利用する事」です。そして、PHPにおいて『プリペアドステートメント』を最も手軽に利用できる手段がPDOとなります。 情報がありすぎるとかえって頭が混乱してしまうでしょうから、あるコードを自分の参考とするかどうかの判断を「プリペアドステートメントを利用しているかどうか」に絞ると良いでしょう。 > これからの開発ではMDB2モジュールを使う理由がない 正しい判断です。存在を忘れても全く問題はありません。私の個人的な見解としては、PEAR自体がもはや過去の遺物です。(反対意見も多いでしょうが、古い仕様を捨て切れてないので) > データベースへの接続はPDOで統一しても大丈夫でしょうか? 大丈夫です。 > データベースに依存しないコードの書き方が可能になる 実際には、DBMSの勉強をする過程において途中でDBMSを切り替えるなんて事はまずありません。優先順位的に、DBMSの切り替えが楽にできるかどうかなんて事は比較的どうでも良いです。しつこいですが、肝は『プリペアドステートメント』です。 > だったらなぜMDB2の説明を含めたのか PHP5.3を対象に考えるなら、本のページ数を稼ぐ以上の意味はないです…。PDOはPHP5.1以前は標準では使えませんでしから、古い環境を対象とするなら意味なくも無いですが…。 > 二つの技術の仕様的な違いを教えてください データベース抽象化レイヤーを実現するために、MDB2はPHPでゴリゴリ書いてます。PDOは、PHPの拡張モジュール(なので言語はC言語になります)として、5.1からPHP本体に取り込まれました。当然後者の方が処理速度も速いです。 > 最近のPHP開発のデータベース事情 文字コード周りを全てUTF-8で統一し、PDOもしくはPDOのラッパークラスを利用するのが「開発者としての普通の感覚」ですね。 PHPは敷居の低い言語のためか、web上は元より書籍ですら、非常に程度の低いコードが掲載されている事があります。本に書いてあるから正しいという訳では決してありませんのでご注意ください。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

「phpに標準で実装されていないもの」を補完するためにPEARライブラリは拡充されてきました。 以前なら(php標準でMySQL関数しかなかった頃)ならPEAR::MDB2も魅力的な選択肢としてありましたが、今はPDOがあります(出来も良くなっています)のでわざわざPEAR::MDB2を追加で導入する意味がないです。 PEAR::DBがそうだったように(提供している)PEAR側が非推奨にすることはありますが、php公式としてはPEARの個々のライブラリについて非推奨とも何とも言及することはありません。PEARライブラリに関してはPEARのサイトで確認すべきです。当然phpの関数などについてはphp側でアナウンスされます(MySQL関数は5.5で非推奨になりましたね)。 PEAR::MDB2もそれなりに(PDO以前に)使われている経緯がありますので、サポートは継続されるとは思いますが、今から書くならPDOでいいでしょう(チューニングが要るならMySQLiという選択肢もあります)。

関連するQ&A

  • PDO利用できますか?

    PHP5.1でレンタルサーバーにてMySQLと接続しようとしています。 今までPear::MDB2でおこなっていたのを、今回新たにPDOにて接続したいと考えております。 そこで質問なのですが、phpinfoにて確認してどこがどうなっていればPDOが利用可能なのでしょうか? ざっと確認したところ、PDOというセクションのPDO Driversという項目にmysqlという文字があるのですが、それさえ表示されていれば問題なく使用できるということでしょうか。 ググってみたらphp.iniでPDOを利用するように設定変更しなければならないようなサイトをたくさん見たのですが、標準で最初から利用できる設定になっていないのでしょうか? 実際に設置して確認できれば良いのですが、それが出来ない状況です。 よろしくおねがいします。

    • ベストアンサー
    • PHP
  • PHPを始めるにあたって質問です。

    よろしくお願いします。 PHPを始めてみようかと思い、簡単な物をPHP5でPDOからMySQLを使って初めて書いて、 ローカル(XP + xampp と vmware上の ubuntu )では一応動いたのですが、 あるレンタルサーバーでは、PHP4.4.6でPDOが使えない様子で、 別なサーバーではPHP5.2.3なんですが、PDOのドライバがSQLiteしか使えないようでした。 そんなこんなで、お聞きしたいのですが、 PHPでデータベースを使った小規模なアプリケーションを書いて、レンタルサーバーで動かす場合に 無難というか、環境がそろいやすいというか、移植しやすい組み合わせというのがあれば教えて下さい。 例えば、 PHP5 + PDO + SQLite とか PHP4 + PEAR::DB + MySQL よろしくお願いします。

    • 締切済み
    • PHP
  • CPANを使うことによるオーバーヘッドはありますか?

    PHP版のCPANであるPEARは、PHPスクリプトの固まりなので、データベース抽象化ライブラリ(PEAR::DB)などを利用するとオーバーヘッドが発生してしまいます。そのためPHP5のPDOが期待されている訳なのですが。。。 CPANも結局オーバーヘッドが発生してしまうものなのでしょうか?

    • ベストアンサー
    • Perl
  • PHPでオブジェクト指向開発してますか?

    実務でPHPでオブジェクト指向開発しているプログラマ(もしくは案件・企業)の割合ってどのくらいのものでしょうか? 当然、外部からPEAR等のクラスをひっぱってきたり、フレームワークを使用することはあると思いますが、設計レベルでオブジェクト指向開発をすることは、どのくらいの割合でありますでしょうか? つまり、interfaceやimplements、abstractといった単語を、仕事で使ったことがあるPHPプログラマはどのくらいいるのでしょうか? それとも、そもそもインターフェースや抽象クラス等は、ライブラリの開発者のためのものであって、一般のプログラマはむしろ使わないほうがいいのでしょうか? 周りに、PHPプログラマを本職でやってる人がいないので、ご意見を伺いたいです。

    • ベストアンサー
    • PHP
  • PDOでのデータベース接続について質問です

    現在、PDOでのmysqlデータベースの操作を学習しています。 以前、mysql_connectでのデータベース接続を学習していた際に、 使用したいデータベースの名前を変数名$dbnameに格納し、 $connect = mysql_connect($server, $user, $password); mysql_select_db($dbname); でデータベースに接続していました。 その要領をふまえて PDOでもデータベースの名前を変数名$dbnameに格納し、 $db = new PDO('mysql:host=localhost;dbname=$dbname',$user,$password); で接続しようと試みたところ、エラーになりました。 そこで、データベース名を変数に格納せず、 $db = new PDO('mysql:host=localhost;dbname=データベース名',$user,$password); で試してみたところ、接続が出来ました。 そこで質問なのですが、PDOでデータベースに接続する場合、 データベース名を変数に格納することは物理的に出来ないのでしょうか? それともうひとつ質問があります。 mysql_connectを使用したときはデータベース接続用のPHPファイルを作成し、 データベース接続が必要なPHPファイルの時にrequire_onceでデータベース接続用のPHPファイルを呼び出ししていましたが、PDOでもデータベース接続用のPHPファイルを呼び出して接続することは可能でしょうか? 絶対に変数に格納したいとか、絶対にデータベース接続を別ファイルにしたいというわけではありませんが、もともとmysql apiで学習していたためmysql apiとPDOの違いが少し気になってしまいました。 ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP 「mysql_connect」と「PEAR::MDB2」の違い

    今手元に2冊のPHPの本があるのですが、 それぞれで、データベースへの接続方法が違います。 一つは、「mysql_connect」関数。 もうひとつは、「PEAR::MDB2」。 双方試して、それぞれデータベースへ接続できるのですが、 両者の違いが分かりません。 それぞれの長所短所を教えてください。 また、一般的に、PHPでデータベースへ接続する際には、 どのような方法が主流なのでしょうか? また、「データベースへ接続」したり、「ログイン」したりするのに、色々な方法があるかと思いますが、それぞれのメリットやデメリットを解説しているサイトをご存知の方がもしいれば、是非教えてください。

    • ベストアンサー
    • PHP
  • PEAR::MB2によるPHP+MySQLについて

    PEAR::MB2でPHP+MySQLを勉強中なのですが、特定カラムの値を取得することができません。 下記のソースコードで、変数$aaaをechoで参照すると空白となってしまいます。 大変恐縮ですがご教授のほどよろしくお願いいたします。 [環境]----------------------------------------------------------- OS: windows7(64bit) PHP: ver5.3.8 MySQL: ver5.5 Pear::MDB2  pear/MDB2 2.5.0b3 2.4.1 database abstraction layer  pear/MDB2_Driver_fbsql 0.2.0 fbsql MDB2 driver  pear/MDB2_Driver_ibase 1.5.0b3 ibase MDB2 driver  pear/MDB2_Driver_mssql 1.5.0b3 mssql MDB2 driver  pear/MDB2_Driver_mysql 1.5.0b3 1.4.1 mysql MDB2 driver  pear/MDB2_Driver_mysqli 1.5.0b3 mysqli MDB2 driver  pear/MDB2_Driver_oci8 1.5.0b3 oci8 MDB2 driver  pear/MDB2_Driver_odbc 0.1.0 ODBC Driver for MDB2  pear/MDB2_Driver_pgsql 1.5.0b3 pgsql MDB2 driver  pear/MDB2_Driver_querysim 0.6.0 querysim MDB2 driver  pear/MDB2_Driver_sqlite 1.5.0b3 sqlite MDB2 driver  pear/MDB2_Driver_sqlsrv 1.5.0b3 sqlsrv MDB2 driver  pear/MDB2_Schema 0.8.5 XML based database schema manager  pear/MDB2_TableBrowser 0.1.2 Database table abstraction library (pear list -allから一部抜粋) [ソースコード]----------------------------------------------------------- require_once("MDB2.php"); $dsn = "mysql://user:pass@localhost/db_name"; $conn = MDB2::connect($dsn); // 接続に失敗したらメッセージを表示して終了 if (MDB2::isError($conn)){ die($conn->getMessage()); } //フェッチモード設定 $conn->setFetchMode(MDB2_FETCHMODE_ASSOC); //SELECT文 $sql = <<<EOS SELECT * FROM db_table WHERE name = 'taro' EOS; //実行 $res = $conn->query($sql); //エラーチェック if (PEAR::isError($res)) { die($res->getMessage()); } //値の取得 $row = $res->fetchRow(); //変数$aaaに、別カラム値(例:miyoji)を格納 $aaa = $row['miyoji']; echo "$aaa"; //←(例)mysqlから田中といった苗字を出力したい。 //クローズ $conn->disconnect(); ----------------------------------------------------------------------- エラー出力はありません。

    • ベストアンサー
    • PHP
  • PHPUnitでPDOのテスト

    PHPUnitで以下のようなテストをすると、エラーがでます。 <?php require_once 'PHPUnit/Extensions/Database/TestCase.php'; class DatabaseTest extends PHPUnit_Extensions_Database_TestCase { protected function getConnection() { $dbtype = "mysql"; $sv = "localhost"; $dbname = "testdb"; $user = "root"; $pass = ""; // データベースに接続する $dsn = "$dbtype:dbname=$dbname;host=$sv"; $pdo = new PDO($dsn, $user, $pass);           ← ここでエラー return $this->createDefaultDBConnection($pdo, 'book'); } protected function getDataSet() { return $this->createFlatXMLDataSet(dirname(__FILE__).'/book-seed.xml'); } public function testInitDataSet() { $dataset = $this->getDataSet(); $this->assertDataSetsEqual( $dataset, $this->getConnection()->createDataSet(), "データセットの初期化エラー" ); } } ?> エラー内容 PDOException: could not find driver could not find driverでググると、php.ini にextension=pdo.soを追加しろとありました。 pearでpdo.soをインストールし、php.iniに追加して、php(lampp)を再起動すると、 PHP Warning: Module 'PDO' already loaded in Unknown on line 0 となります。 どのようにすればよろしいのでしょうか? よろしくお願いいたします。 ubuntu10.10 xampp-linux-1.7.1(Apache:2.2.11,PHP:5.2.9,mysql:5.1.33) PHPUnit 3.4.13

    • ベストアンサー
    • PHP
  • PHPのレガシーな設計について

    あるお仕事でフレームワークを使えないという状況に陥っております。 月々数千円のホスティングサーバーでの運用になるのですが、今となってはレガシーなSmarty+Pearの組み合わせでの設計を指定されています。 PHPバージョンは5.3です。ホスティングなので変えられません。 CakeやFuelがそのホスティングで使用できるかはテストしないと分からない状況です。 過去の遺産でSmarty+Pearのコードはいろいろあるのですが、DBの接続もPear::MDB2を使っていたりといまいちです。PDO使いたいけどいちいち書き換えが面倒・・。 また、ホスティングなので気まぐれに5.4や5.5などに上げられると、レガシーな設計だと動作が心配です。 どうのように思われますでしょうか。識者の方からのご意見をお待ちしてます。

    • 締切済み
    • PHP
  • ドライバーって何?

    PDOという抽象化レイヤー(でいいのかな?)を使ってみようと、サンプルソースをたたいてみたら、エラーとなりました。 で、調べてみると、なにやらいろいろ初期設定がいるようで。 http://www.doyouphp.jp/php5/php5_pdo.shtml を見ると、めんどくさそう。 ドライバーがどうのこうのと、いろいろ不思議な感じです。 なんですか? このドライバーって?

    • ベストアンサー
    • PHP

専門家に質問してみよう