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の標準の機能で簡単にできます。ライブラリを追加しなくてもいいのが便利ですね。

ここで紹介したサンプルが少しでもお役に立てればうれしいです。