お世話になります。
現在、プリペアドステートメントについて調べている初心者です。
プリペアドステートメントの概要については「安全なSQLの呼び出し方」を読んで何となく理解しております。
「静的プレースホルダ」を使ってデータの取得・表示をしたいと考えております。
オプションで「PDO::ATTR_EMULATE_PREPARES => false」は設定しております。
「静的プレースホルダ」を使った場合のウェブアプリケーションとデータベースとのやり取りは「安全なSQLの呼び出し方」の解説図のようになる認識でおります。
データの取得・表示するには prepare → bindValue → execute → fetch の順で可能かと思います。
それぞれのメソッドについては、下記の処理を行っていると認識しております。
1.prepare
文を実行する準備を行い、文オブジェクトを返す
2.bindValue
値をパラメータにバインドする
3.execute
プリペアドステートメントを実行する
【質問】
バインドした後にプリペアドステートメントを実行しても静的プレースホルダになるのでしょうか?
個人的にはバインドした後に実行したら動的プレースホルダと一緒なのでは?と疑問に思っております。
executeするときにprepareの文とbindValueの値をそれぞれ別々にデータベースに送っているのでしょうか?
ご存じの方いれば、ご教示ください。
よろしくお願いいたします。
【質問追記】※2015.03.13 19:11
質問がわからないとのご指摘を頂きました。
luckerさん ありがとうございます。
私が「バインド」や「プレイペアドステートメント」の意味を正しく理解していないのが原因かと思います。
それぞれの言葉を使わずに質問したいと思います。
下記のコードで動作するかと思います。
【手順1】prepare
$stmt = $pdo->prepare('SELECT name FROM fruit WHERE price=?')
【手順2】bindValue
$stmt->bindValue(1, 100);
【手順3】execute
$stmt->execute();
静的プレースホルダは「SELECT name FROM fruit WHERE price=?」と「1, 100」の命令文を別々にデータベースに送ってデータベース側で結合して実行しているとの認識でおります。
「手順3」では「SELECT name FROM fruit WHERE price=?」と「1, 100」の命令文を別々にデータベースに送っているのでしょうか?
【追記】※2015.03.13 20:33
※この質問は、luckerさんのお陰で解決済みです。
私の日本語力の無さが原因でした。
「安全なSQLの呼び出し方」に下記の説明があります。
パラメータ部分を示す記号「?」のことをプレースホルダと呼び、そこへ実際の値を割り当てることを「バインドする」と呼びます。
日本語力のない私は、「バインドする」=「値を埋め込む」と勘違いしました。
PHPマニュアルの「PDOStatement::bindValue」の説明には下記のようにバインドすると記述があります。
値をパラメータにバインドする
bindValueメソッドは値を埋め込む処理をしていると勘違いしたため、上記のような質問を致しました。
bindValueメソッドを記述したところでプレースホルダに値が埋め込まれて一つのSQL文になっているわけではないようです。
executeされることではじめてプリペアドステートメントが実行されます。
executeすることでprepareに記述したSQL文がデータベース側で構文解析され、その後に値を当てはめるようになるようです。
ありがとうございました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/03/13 10:02
退会済みユーザー
2015/03/13 10:12
退会済みユーザー
2015/03/13 10:23
退会済みユーザー
2015/03/13 10:27
退会済みユーザー
2015/03/13 10:38
退会済みユーザー
2015/03/13 10:39
退会済みユーザー
2015/03/13 10:44
退会済みユーザー
2015/03/13 10:50