PHPでPDOを使ったデータベース接続と検索・挿入方法のまとめ
PHPに標準で用意されているPDOを利用すると、データベースに接続し、データの検索や登録、更新が簡単に行えます。
このページでは、PDOを使ってデータベースへの接続やselect、insertを実行する方法について、サンプルプログラムやポイントを紹介しています。
[このページの内容]
データベースドライバの設定
PHPでPDOを使ってデータベースにアクセスする場合には、MySQLなどの使用するデータベースに対するドライバを設定する必要があります。
ロリポップやXServerなどのレンタルサーバーでは不要な作業ですが、WindowsやLinux、MacなどにPHPをインストールした場合は、自分で設定する必要があります。
具体的には、php.iniファイルを開いて、以下のようにextension=pdo_***となっている箇所を探します。
[MySQLのデータベースドライバの設定例]
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
;extension=pdo_pgsql
;extension=pdo_sqlite
データベースにMySQLを使う場合はpdo_mysql、PostgreSQLを使う場合はpdo_pgsqlの先頭についている「;」を削除します。
これだけで各データベースへのドライバを利用することができるようになります。
データベースへの接続
PHPでデータベースにアクセスする際に用いるPDOライブラリの使い方は簡単です。
まず、namespaceを使わないような書き方では、以下のようになります。PDOライブラリは、useやrequireをしなくても使うことができます。
<?php $dsn = 'mysql:dbname=testdb;host=127.0.0.1'; $user = 'test'; $password = 'password'; $pdo= new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) );
一方で、namespaceを使う場合には、PDOはそのままでは使えません。下のように、use \PDO;という記述を入れてあげる必要があります。「\」マークを入れるのを忘れないようにしましょう。
<?php namespace db; use \PDO; $dsn = 'mysql:dbname=testdb;host=127.0.0.1'; $user = 'test'; $password = 'password'; $pdo= new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) );
両者に共通していることは、以下の通りになります。
接続の際には、データベース名(dbname)、ホストアドレス(host)、ユーザー名、パスワードが必要となります。
また、PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTIONをPDOのコンストラクタに指定してあげると、データベースのエラーが起こったときに原因が追跡しやすくなります。
selectを用いた検索
データベースのテーブルを検索するために、SQLを用いて実行します。
PDOではprepared statementが用意されているので、これを用いることで安全に検索を実行することができます。
まず、下のプログラムのように、プレースホルダー(colume_name=?というように記述)を用意します。
<?php $dsn = 'mysql:dbname=testdb;host=127.0.0.1'; $user = 'test'; $password = 'password'; $pdo= new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) ); try { $pstmt = $pdo->prepare("SELECT * FROM test_table where column_name1=? and column_name2=?"); $pstmt->execute(array("test1","test2")); while($row = $pstmt -> fetch(PDO::FETCH_ASSOC)) { print($row["column_name2"] . $row["column_name2"] . "\n"); } $pstmt = null; $pdo = null; } catch (PDOException $e) { print("DB失敗: " . $e->getMessage() . "\n"); exit(); }
そして、executeで実行する際に、array("test1","test2")のように、配列で検索用のキーワードを指定します。
検索結果は$row = $pstmt->fetch(PDO::FETCH_ASSOC)で1行ずつ返ってきますので、while文ですべて取得します。結果は$row変数に入っていますので、カラム名を指定して取り出すことが可能です。
接続を終了するときは、$pstmtと$pdoをnullにしてあげればよいです。接続を閉じるためのclose()というような明確なメソッド(関数)は用意されていません。
insertを用いたデータの挿入・登録
まず1件ずつデータを登録する場合についてご紹介します。
こちらもselectの時と同様に、プレースホルダーを利用して実行します。
<?php $dsn = 'mysql:dbname=testdb;host=127.0.0.1'; $user = 'test'; $password = 'password'; $pdo= new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) ); try { $pdo = $this->connect(); $pdo->beginTransaction(); $sql = "insert into test_table (column1,column2) values (?,?)"; $pstmt = $pdo->prepare($sql); $pstmt->execute(array("test1","test2")); $pdo->commit(); $pstmt = null; $pdo = null; } catch (PDOException $e) { print("DB失敗: " . $e->getMessage() . "\n"); exit(); }
execute実行時に、配列を使ってデータを指定してあげることで、データベースに登録することができます。
データベースに接続後すぐにbeginTransaction()でトランザクションを開始し、execute実行後はcommit()を忘れないように実行してください。
複数データをまとめて挿入する方法
ファイルからデータを読み込んでまとめて登録するなど、数百件~数十万件という大量のデータをまとめてデータベースに登録したい場合には、上記方法では時間がかかりすぎます。
このような場合には、下で紹介するようにbatch insert的な手法を使うと、短時間で処理が完了します。
<?php $dsn = 'mysql:dbname=testdb;host=127.0.0.1'; $user = 'test'; $password = 'password'; $pdo= new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) ); try { $pdo = $this->connect(); $pdo->beginTransaction(); $sql = "insert into test_table (column1,column2) values"; $insertQuery = array(); $insertData = array(); $index = 0; for($i=0;$i<10000;$i++){ $insertQuery[] = '(?,?)'; $insertData[$index++] = "データ1"; $insertData[$index++] = "データ2"; //1000件ごとにデータベースに登録。 if($i!=0 && $i%1000==0){ $sql .= implode(', ', $insertQuery); $pstmt = $pdo->prepare($sql); $pstmt->execute($insertData); $index=0; $sql = "insert into test_table (column1,column2) values "; $insertQuery = array(); $insertData = array(); } //残りのデータをデータベースに登録する。 if(count($insertData)!=0){ $sql .= implode(', ', $insertQuery); $pstmt = $pdo->prepare($sql); $pstmt->execute($insertData); } $pdo->commit(); $pstmt = null; $pdo = null; } catch (PDOException $e) { print("DB失敗: " . $e->getMessage() . "\n"); exit(); }
ポイントは以下のようになります。
通常、insert文は(1)のようにカラムとプレースホルダーの数が1対1で対応していますが、PDOを使った複数データの登録は(2)のように、登録するデータの分だけプレースホルダーを追加します。
(1)insert into test_table (column1,column2) values(?,?)
(2)insert into test_table (column1,column2) values(?,?),(?,?),(?,?),(?,?)
同様に、登録するデータも配列で用意してあげます。
ただし、SQL文が長くなるとエラーが発生しますので、一定量のデータごとにまとめて登録します。それが25行目から35行目にかけての内容で、サンプルプログラムでは1000件ごとに区切ってデータを登録するということを繰り返し、そのたびごとに、SQLやデータの配列もいったんリセットしています。
このようにすることで、1件ずつデータを登録するよりも高速に処理を終えることができます。
まとめ
PHPでデータベースを操作するというのは、PHPの標準の機能で簡単にできます。ライブラリを追加しなくてもいいのが便利ですね。
ここで紹介したサンプルが少しでもお役に立てればうれしいです。
ツイート |
関連記事
1.Eclipseでプラグインを使ってPHPを実行する方法
2.WindowsへのPHPのインストール方法 複数バージョンの使い分けも簡単
3.ApacheとPHPを連携させる方法Windows編
4.PHPが高速なレンタルサーバー バージョンと速度の比較からおすすめを紹介
5.WEBプログラミングにおすすめの高速で安定したレンタルサーバー
▲ このページの上部へ戻る