PDO

PHP Data Object

PDOとは?

PDO(PHP Data Object)は、PHP5から利用できるデータベースへのアクセスを 抽象化するクラス群です。 PDOを利用することで、高機能で共通化されたインターフェースと PHP5の機能を使ったデータベースアクセスを実現します。


Step 1. - DBへの接続/切断

データベースへの接続には、PDOコンストラクタに 「DSN」、「ユーザー名」、「パスワード」を設定します。

データベースとの切断は、PDOオブジェクトを解放します。

// PHP
try {
    // MySQLサーバへ接続
    $pdo = new PDO("mysql:host=localhost; dbname=DatabaseName",
                   "user", "password");
} catch(PDOException $e){
    var_dump($e->getMessage());
}

// 切断
$pdo = null;

// javascript
$.ajax({
   type: 'get', // 通信方式 POST or GET (デフォルトはGET)
   url: 'pdoConnect.php', // 通信先
   dataType: 'html', // 受け取るデータのタイプ
   cache: false,
   // 成功した場合
   success: function(){
       $("#connectText").append('<h3 class="text-success">接続しました。</h3>');
   },
   // 通信できなかった場合(オプション)
   error: function(){
       $("#connectText").append('<h3 class="text-error">接続できません。</h3>');
    }
});

Step 2. - データ選択 select

DBに接続しselect文でデータを取得します。データ形式をJSONでやってみます。

php
try {
    // MySQLサーバへ接続
    $pdo = new PDO("mysql:host=localhost; dbname=DatabaseName",
	"user", "password");
	
    $stmt = $pdo->prepare("SELECT * FROM employee");
    $stmt->execute();
    $rows = array();
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
      $rows[] = $row; 
    }  
    // 宣言「このファイルphpではなく、jsonとして扱いなさい!」
    header('Content-Type:application/json');
    // データをjsonに変換して出力
    echo json_encode($rows);
        
} catch(PDOException $e){
    var_dump($e->getMessage());
}

// 切断
$pdo = null;

$stmt = $pdo->prepare("SELECT * FROM employee");
SQL文を解釈しPDOStatementオブジェクトを返す。 キャッシュされているので、複数回実行する場合に向いている。

$stmt->execute();
プリペアドステートメントを実行する。

$stmt->fetch(PDO::FETCH_ASSOC)
fetch1行単位で結果セットを取得する。
PDO::FETCH_ASSOC結果セットに対して連想配列と同じようにアクセスできる形で取得します。

    他にも
  • PDO::FETCH_LAZY
  • PDO::FETCH_NAMED
  • PDO::FETCH_NUM
  • PDO::FETCH_BOTH
  • PDO::FETCH_OBJ
  • PDO::FETCH_BOUND
  • PDO::FETCH_COLUMN
  • PDO::FETCH_CLASSTYPE
    • header('Content-Type:application/json');
      PHPではなく、JSONとして扱うように宣言する。

      echo json_encode($rows);
      JSONに変換し出力する。

      javascript
       $.ajax({
                  type: 'get', // 通信方式 POST or GET (デフォルトはGET)
                  url: 'pdoSelect.php', // 通信先
                  dataType: 'json', // 受け取るデータのタイプ
                  cache: false,
                  // 成功した場合
                  success: function(data){
                      $("#selectData").append('<h3 class="text-success">接続しました。</h3>');
                      
                      //空の配列を用意
                      var items = [];
                      //配列にデータをセットする
                      for(i=0;i' + data[i].emplyeeNo + ":" + data[i].name + "");
                      }
                      
                      //ul要素内に配列データを取込み #selectDataに追加する
                      $('
        ', { 'class': 'my-new-list', html: items.join('') }).appendTo('#selectData'); }, // 通信できなかった場合(オプション) error: function(){ $("#selectData").append('<h3 class="text-error">接続できません。</h3>'); } });

Step 3. - データ選択 where

where文を指定してデータを取得します。

php
    //空配列を用意
    $rows = array();

    // 受け取った値の検査
    if($_POST['empNo']=="") {
        $rows[] = array('errorcode'=>-1,'name'=>'社員番号未入力');
        echo json_encode($rows);
        exit;
    } else {
        $empNo = $_POST['empNo'];
    }

    // UTF-8検査
    if(!mb_check_encoding($empNo,'utf-8')){ exit(); }
    // 全角数字だった場合半角数字に変換 それ以外削除 (ここでもUTF-8を確認)
    $num1 = array('/0/u','/1/u','/2/u','/3/u','/4/u','/5/u','/6/u','/7/u','/8/u','/9/u','/[^0-90123456789]/u');
    $num2 = array('0','1','2','3','4','5','6','7','8','9','');
    $empNo = preg_replace($num1,$num2,$empNo);

    try {
        
        // MySQLサーバへ接続
        $pdo = new PDO("mysql:host=localhost; dbname=database name",
                   "user", "psw");
        
        $stmt = $pdo->prepare("SELECT * FROM employee where emplyeeNo= :empNo");
        $stmt->bindParam(':empNo',$empNo,PDO::PARAM_INT);
        $stmt->execute();
        
        while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
          $rows[] = $row; 
        }  

        if($rows.length == 0) {
        	$rows[] = array('errorcode'=>-1,'name'=>'データがありません。');
        }

        // 宣言「このファイルphpではなく、jsonとして扱へ!」
        header('Content-Type:application/json');
        // データをjsonに変換して出力
        echo json_encode($rows);
        
    } catch(PDOException $e){
        var_dump($e->getMessage());
    }

   // 切断
   $pdo = null;
 $stmt = $pdo->prepare("SELECT * FROM employee where emplyeeNo= :empNo");
 $stmt->bindParam(':empNo',$empNo,PDO::PARAM_INT);

SQL文の :empNo にPHPの $empNO を INT(整数型)として結びつける。

javascript
 $("#empName").empty();
 $("#msg").empty();

 $.ajax({
            type: 'post', // 通信方式 POST or GET (デフォルトはGET)
            url: 'pdoSelect2.php', // 通信先
            dataType: 'json', // データのタイプ
            data: { // 連想配列で入力値を受け渡す
                "empNo": $('input').val()
            },
            cache: false,
            // 成功した場合
            success: function(data){
   
                if(data[0].errorcode < 0) {
                	$("#msg").append('<h3>' + data[0].name+ '</h3>');
                } else {
                    $('#empName').append(data[0].name);
                }

            },
            // 通信できなかった場合(オプション)
            error: function(){
                $("#msg").append('<h3 class="text-error">接続できません。</h3>');
            }
        });
社員番号

社員名:  


Step 4. - データの挿入

insert文でデータを追加します。

php
//エラーモードの設定 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare("INSERT INTO employee(emplyeeNo,name) values(?,?)");
// ?,? 部分に受け取った社員番号と社員名を結びつける
$stmt->bindValue(1,$empNo,PDO::PARAM_INT);
$stmt->bindValue(2,$empNm,PDO::PARAM_STR);
$stmt->execute();

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
エラーコードや 関連情報が、クラスのプロパティとして設定されます。
例外によりスクリプトが終了した際には、トランザクションは自動的に ロールバックされる。

$stmt->bindValue(1,$empNo,PDO::PARAM_INT);
N番目の ? 部分に変数を結びつける。
? と :name は同時には仕様できない。

社員番号

社員名


Step 5. - データの更新

update文でデータを更新する。

$stmt = $pdo->prepare("UPDATE employee SET name = :empNm WHERE emplyeeNo = :empNo");
社員番号

社員名


Step 6. - データの削除

delete文でデータを削除する。

削除実行前に、処理確認ダイアログを表示する。

$stmt = $pdo->prepare("DELETE FROM employee WHERE emplyeeNo = :empNo");
社員番号