PDOクラスとは
PHPとデータベースサーバーの間の接続を行うもので、PDO::と記載する。 PDOクラスの一覧PDO::を使ったDBアクセスの基本
PHP
//例)DBアクセス ;
$dsn = 'mysql:dbname =(DB名); host=(接続サーバー・ホスト名)';
$usr = '(DBのユーザ名)'; //ユーザー名
$password = '(DBのパスワード)'; //パスワード
$pdo = new PDO($dsn, $usr, $password,
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
)
);
//プリペイド&ステイトメント準備
$prep = $pdo->prepare('INSERT INTO item( title, link) VALUES( :title, :link)');
$prep->execute();//実行
SQL文(ステートメント)を準備
ステートメント(Statement)はSQL文
SQLで言うなら「SELECT」や「INSERT」「DELETE」処理が構成された文の全体の事をを「ステートメント(Statement)」という。SETステートメント
SETステートメントはセッション実行時の設定を処理する方法を指定します。PHP
//代表的なステートメント
SELECT [Column] FROM [Table];//データベースからデータを検索する(SELECT文)
INSERT INTO [Table]([Column]) VALUES [値1、値2、値3,...];//データベースにデータを追加する(INSERT文)
UPDATE [Table] SET [Column] = 値1, [Column] = 値2, [Column] = 値3,...;//データベースに登録されたデータを更新する(UPDATE文)
DELETE FROM [Table];//データベースに登録されたデータを削除する(DELETE文)
DELETE FROM [Table] WHERE 条件式 xxx ;//条件式を作る(WHERE句)
カーソル
PDOクラスでは、テーブル内の移動を「カーソル」と呼ぶ。「PDO::ATTR_CURSOR 」て移動方法を指定する。 ステートメントの種類 バックアップと復元 データ定義言語 データ操作言語 権限ステートメント Service Brockerステートメント SETステートメントバックアップと復元
バックアップおよび復元のステートメントは、バックアップを作成し、バックアップから復元する手段を提供します。データ定義言語
データ定義言語はDDL(Data Definition Language)とも呼ばれます。 役割としては、データベース構造の作成や変更、削除といった機能を担っています。 このステートメントには次のものが含まれます。- ALTER
- 照合順序
- CREATE
- DROP
- DISABLE TRIGGER
- ENABLE TRIGGER
- RENAME
- UPDATE STATISTICS
データ操作言語
データ操作言語はDML(Data Manipulation Language)と呼ばれます。 先ほどのデータ定義言語(DDL)がデータベース自体を操作するのに対し、こちらはデータベースに格納されるデータを挿入、更新、変更、削除するためのものだと思ってください。 DMLには次のステートメントがあります。- BULK INSERT
- DELETE
- INSERT
- SELECT
- UPDATE
- MERGE
- TRUNCATE TABLE
権限ステートメント
権限ステートメントの役割は、どのユーザーがどのログインデータにアクセスして操作を実行できるかの決定です。 簡単に言ってしまえば、認証全般を担っているという認識で良いと思います。Service Brokerステートメント
厳密に説明しようとするとかなり難しいですが、大まかな捉え方としては、サーバー間の情報通信のような高度アプリケーション全般を担っているという感じでしょうか。 一昔前に流行ったメーリングリストとよく似た構造を持っています。 Microsoftのリファレンスには以下のように明記されています。Service Broker は、ネイティブのデータベース内サービス指向アプリケーションを作成することができるメッセージ配信フレームワークです。
prepare()は、SQLの実行の準備を行い、実行完了後にオブジェクトを返す
「プリペイドステートメント」とは、SQL文のみを先に確定(コンパイル)しておくための仕組み。 データベースにアクセスする際には、SQLのクエリを送信する必要があるが、クエリは解析、コンパイル、実行の処理が必要になり、複雑化するため「プリペイとステートメント」を利用し「クエリは解析、コンパイル、実行」の最適化を1回で済ませるようにしている。PDO は元々この機能をサポートしていないドライバに対して プリペアドステートメントとバインドパラメータをエミュレートする。 準備の段階(プリペアドステートメントをエミュレートする際)で、データベースサーバーとの通信は行わないため、 PDO::prepare() はステートメントのチェックを行いません。 データベースサーバーが正常に文を準備する場合、prepare() は PDOStatement オブジェクトを返す。データベースサーバーが文を準備できなかった場合、 prepare() は false を返すか PDOException を発行 (エラー処理 の方法に依存します) 名前もしくは疑問符形式のパラメータを他の適当な値に 書き換えることも可能。prepare( SQL文, array(ドライバオプション) )
prepare()のドライバ・オプション(driver_options)
ドライバーオプションを設定する場合、通常スクロール可能なカーソルを要求するため PDO::ATTR_CURSORに PDO::CURSOR_SCROLLを設定する。PHP
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
準備:prepare() と 実行:execute() はセットと考える
異なるパラメータを用いて複数回実行されるような文に対しprepare() と execute() をコールすることで、 ドライバがクライアントまたはサーバー側にクエリプランやメタ情報を キャッシュさせるよう調整するため、 アプリケーションのパフォーマンスを最適化。パラメータに手動でクオートする必要がなくなるので SQL インジェクション攻撃から保護する助けになる。 prepareについてtry{}
PDOStatement::execute() は成功した場合は「TRUE」を、失敗した場合は「FALSE」を返すので「try文」で処理の成功か失敗かを判定させる。PHPでDBにレコードを追加する基本のプログラム
DBに送る値はバインドする
PHP
//item(カラム名,カラム2) VALUES(カラム値,カラム2の値)
$prep = $db->prepare('INSERT INTO item( title, link) VALUES( :title, :link)');
$prep->execute();
値にカラム名を含む文字列があるとエラーになる
PHP
//例)「User', email='test」と入力されたらエラーになる。
$a=new PDO("mysql:host=localhost;dbname=database;","root","");
$b=$a->prepare("UPDATE `users` SET user='$var'");
$b->execute();
//こういう風に置き換わる。>> user => ' User', email='test'
//だから、バインドして渡す
$var="User', email='test";
$a=new PDO("mysql:host=localhost;dbname=database;","root","");
$b=$a->prepare("UPDATE `users` SET user=:var");
$b->bindParam(":var",$var);
$b->execute();
//バインドするとエスケープされた状態で「User', email='test」で渡す
execute()でスタートメントを実行
PDOStatement::execute() メソッドによって実行される SQL ステートメントを準備する。 つまり、SQL ステートメントは、パラメータだけを入れ替えて、データベースサーバーから指定の「オブジェクト」を受け取る。execute()でのDBのカラム名と値の一致させる
exec() | SQL ステートメントを実行し、作用した行数を返す |
---|---|
query() | SQL ステートメントを実行し、 結果セットを PDOStatement オブジェクトとして返す |
execute() | プリペアドステートメントを実行する |
execute(「input_parameters」)
input_parametersはバインドするか、パラメータ値のある配列をセットする。 バインドする場合は、 bindParam()や bindValue() で定義する。execute (「input_parameters」)の種類
execute でテーブルのカラム名と値を一致させる方法はいくつかある。 パラメータマーカに変数や値を各カタム名に合わせて、バインドするため PDOStatement::bindParam() や PDOStatement::bindValue() をコールする。 input_parameters のキーは PDO::prepare(SQL文) で定義した数より多い場合は、 ステートメントが失敗してエラーになる。パラメーター
(:name)名前つきか、(?)疑問符 ユーザーの入力を直接クエリに含めてはいけません。そこで、ユーザーの入力をバインドする際は、名前 (:name)つきパラメーター、もしくは疑問符 (?) パラメータを利用する。エミュレーションモードが有効になっていない限り、 ひとつのプリペアドステートメントの中で、同じ名前のパラメータマークを 複数使用が出来ない。 通常、スクロール可能なカーソルを要求するために PDO::ATTR_CURSOR に PDO::CURSOR_SCROLL を設定する場合に使用することになる POS::バインドするパラメータの定義済み定数の種類 DBのカラム名と一致させる方法をわかりやすい図で説明 参考:PDOStatement::executequery()関数
複数回発行する必要があるステートメントの場合は、execute() のほうが良いパフォーマンスを得られる。 ->query($sql)とした場合は、実行に成功したSELECTステートメントにより返されたレコードセットで 反復処理が可能。 クエリ内のデータは 適切にエスケープ する必要がある。PHP
$row = $pdo->query($sql) ;
PHP
$row = $pdo->query('SELECT * FROM `カラム名` WHERE カラム名と条件, PDO::FETCH_ASSOC);
PHP
$data=$pdo->query($sql,PDO::FETCH_NUM);
foreach($data as $row) {
// etc
}
引数交換%でSQL文を記述するsprintf()
引数の交換を使うときには、 位置指定子 n$ をパーセント記号 (%) の直後に置く。PHP
$start = 10;
$sql = sprintf("SELECT pref,city FROM user_data WHERE 1 ORDER BY id DESC LIMIT %d, 5", $start);
var_dump($sql);
結果セットから1行取得するfetch()
PHP
//(PDO::FETCH_ASSOC)は、カラムと同じ配列名で返す。
//配列になって送られるのでなのでそのままセットする。
$array_data = array();//レコード数分繰り返し配列にセット
//(PDO::FETCH_ASSOC)カラムと同じ配列名で返す
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
$array_data[] = $row;
}
//カラム名を指定して取出しする場合はこう。
$id = "";
$title="";
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
$id = $row["id"],
$title = $row["title"];
}//end_while