ホーム > カテゴリ > PHP・Laravel・CakePHP >

PDOの使い方とまとめ[データベース操作]

PHPで「MySQL」や「PostgreSQL」など汎用的にデータベースを操作をするには「PDO」クラスを使用します。

事前準備

データベースを操作する前に次のテーブルとデータを設定します。「PDO」の使い方だけを見たい方は飛ばしても構いません。

[テーブル]

CREATE TABLE IF NOT EXISTS mst_book (
  no int(11) NOT NULL AUTO_INCREMENT,
  title varchar(50) NOT NULL COMMENT 'タイトル',
  author varchar(50) NOT NULL COMMENT '作者',
  price int(11) NOT NULL COMMENT '価格',
  PRIMARY KEY (no),
  KEY author (author),
  KEY Price (price)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

[データ]

INSERT INTO mst_book (no, title, author, price) VALUES
(1, '学問のすゝめ', '福澤諭吉', 880),
(2, '注文の多い料理店', '宮沢賢治', 600),
(3, '脱亜論', '福澤諭吉', 980),
(4, '銀河鉄道の夜', '宮沢賢治', 1280),
(5, '羅生門', '芥川龍之介', 680),
(6, '風の又三郎', '宮沢賢治', 900);

[phpMyAdminによる上記のデータイメージ]

wikipedeiaで補足:phpMyAdmin

データベース接続

MySQLに接続する方法となります。(UTF8)

    $db_host = 'mysql:host=localhost;';
    $db_name = 'dbname=' . dbname. ';charset=utf8;' ;
    $db_user =  user_id  ;
    $db_pass =  password;    
    
    try {
        // データベースに接続
        $pdo = new PDO($db_host.$db_name,$db_user,$db_pass);

        ... データベースの処理を実施
 
    }catch (PDOException $e) {
          die('DB接続エラー'. $e->getMessage());
    }

    // 接続の解除
    $pdo = null;

PostgreSQLの場合は「mysql:host」を「pgsql:host」に変更します。

「localhost」はホスト名またはIPアドレス
「dbname」はデータベース名
「user_id」はユーザー名
「password」はパスワード
を設定します。

文字コードがUTF8以外の場合は「charset=utf8;」の部分を適宜、変更して下さい。

PDOのコンストラクタの第一引数には「DSN、URI、エイリアス」を指定可能です。詳細はPDO::__constructをご確認ください。

SELECT(標準)

データベースにSELECTのSQLを投げて結果を出力します。

    $sql = "SELECT title,author,price FROM mst_book " . 
           " WHERE author='宮沢賢治'  AND price >= 900 ";

    unset($db_data); 
    
    $stmt = $pdo->query($sql);
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
      $db_data[] = $row;
    }
      
    echo '<table border="1">';
    for($i=0;$i<count($db_data);$i++){
        echo '<tr>';
          echo '<td>' . $db_data[$i]['title']  . '</td>';
          echo '<td>' . $db_data[$i]['author'] . '</td>';
          echo '<td>' . $db_data[$i]['price']  . '</td>';
        echo '</tr>';
    }
    echo '</table>';

[結果]

SELECT(バインド)

今度はバインドを使用してデータベースにSQLを投げて結果を出力します。バインド機能は「SQLインジェクションの対策」になりますので通常はこちらの方を使用すると思います。

    $sql = "SELECT title,author,price FROM mst_book " . 
           " WHERE author= :author  AND price >= :price ";
        
    unset($db_data); 
    
    // パラメータ用変数
    $author = "宮沢賢治";
    $price  = 900;
    
    // プリペアドステートメントの作成
    $stmt = $pdo->prepare($sql);
    
    // パラメータに変数をバインド
    //   NULLは「PDO::PARAM_NULL」 
    //   BOOLは「PDO::PARAM_BOOL」 
    //   LOBは「PDO::PARAM_LOB」 
    // ※floatやdoubleの場合は型指定がないので「PARAM_STR」を使用
    $stmt->bindParam(':author', $author, PDO::PARAM_STR);
    $stmt->bindValue(':price' , $price , PDO::PARAM_INT);   
    
    // プリペアドステートメントを実行する
    $stmt->execute();
     
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
      $db_data[] = $row;
    }
      
    echo '<table border="1">';
    for($i=0;$i<count($db_data);$i++){
        echo '<tr>';
          echo '<td>' . $db_data[$i]['title']  . '</td>';
          echo '<td>' . $db_data[$i]['author'] . '</td>';
          echo '<td>' . $db_data[$i]['price']  . '</td>';
        echo '</tr>';
    }
    echo '</table>';

[結果]

wikipedeiaで補足:SQLインジェクション

UPDATE/INSERT

UPDATE(更新)/INSERT(挿入)の操作方法は、前述した「SELECT(標準)」「SELECT(バインド)」の手法と同じで「SQL」と関連した部分だけを変更すればそのまま実行可能です。

トランザクション

データベースのトランザクション機能の使い方です。

    
    // トランザクションの開始 
    $pdo->beginTransaction();
    
    // 「UPDATE」または「INSERT」の実行
    if(...){     
    
        // コミット 
        if($pdo->commit()){
    
        // ロールバック
        }else{    
            $pdo->rollBack();
        }
    }
wikipedeiaで補足:トランザクション

PHP公式ページ

PDOのメンバ一覧





関連記事



公開日:2015年09月12日
記事NO:01349