PDO::prepare(プリペイドステートメント)の説明おさらい

PHPとMySQLデータベースについて PHP/MySQL

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 」て移動方法を指定する。 PDO::prepare(プリペイドステートメント)の説明おさらい、説明画像1 ステートメントの種類 バックアップと復元 データ定義言語 データ操作言語 権限ステートメント Service Brockerステートメント SETステートメント

バックアップと復元

バックアップおよび復元のステートメントは、バックアップを作成し、バックアップから復元する手段を提供します。

データ定義言語

データ定義言語はDDL(Data Definition Language)とも呼ばれます。 役割としては、データベース構造の作成や変更、削除といった機能を担っています。 このステートメントには次のものが含まれます。
  • ALTER
  • 照合順序
  • CREATE
  • DROP
  • DISABLE TRIGGER
  • ENABLE TRIGGER
  • RENAME
  • UPDATE STATISTICS

データ操作言語

データ操作言語はDML(Data Manipulation Language)と呼ばれます。 先ほどのデータ定義言語(DDL)がデータベース自体を操作するのに対し、こちらはデータベースに格納されるデータを挿入、更新、変更、削除するためのものだと思ってください。 DMLには次のステートメントがあります。
  1. BULK INSERT
  2. DELETE
  3. INSERT
  4. SELECT
  5. UPDATE
  6. MERGE
  7. 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 インジェクション攻撃から保護する助けになる。 PDO::prepare(プリペイドステートメント)の説明おさらい、説明画像2 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 を設定する場合に使用することになる PDO::prepare(プリペイドステートメント)の説明おさらい、説明画像3 POS::バインドするパラメータの定義済み定数の種類 DBのカラム名と一致させる方法をわかりやすい図で説明 PDO::prepare(プリペイドステートメント)の説明おさらい、説明画像4 参考:PDOStatement::execute

query()関数

複数回発行する必要があるステートメントの場合は、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
}
query()について

引数交換%で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);
sprintf()について

結果セットから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

POD::のfetch()パラメータの種類

PDOException クラス

PDO が発するエラーを表す。 詳しくは:phpマニュアル日本語
タイトルとURLをコピーしました