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による上記のデータイメージ]
データベース接続
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;」の部分を適宜、変更して下さい。
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>';
[結果]
UPDATE/INSERT
UPDATE(更新)/INSERT(挿入)の操作方法は、前述した「SELECT(標準)」「SELECT(バインド)」の手法と同じで「SQL」と関連した部分だけを変更すればそのまま実行可能です。
トランザクション
データベースのトランザクション機能の使い方です。
// トランザクションの開始 $pdo->beginTransaction(); // 「UPDATE」または「INSERT」の実行 if(...){ // コミット if($pdo->commit()){ // ロールバック }else{ $pdo->rollBack(); } }