質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

4189閲覧

PHPのbindValueの第2引数の型指定について教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/03/16 06:30

お世話になります。
現在、プリペアドステートメントについて調べている初心者です。

PHPのbindValueの第2引数の型指定について教えてください。
質問内のエミュレーションOFFとは「PDO::ATTR_EMULATE_PREPARES => false」のことを指しております。

下記ような記述があったとします。

$price = '100'; $prepare = $dbh->prepare('SELECT name FROM fruit WHERE price = ?'); $prepare->bindValue(1,$price,PDO::PARAM_INT);

$priceの値を整数型として扱いたい場合は、エミュレーションがON・OFFにかかわらず、下記のように第2引数で型変換をする必要があるという認識でよろいしでしょうか?

$price = '100'; $prepare = $dbh->prepare('SELECT name FROM fruit WHERE price = ?'); $prepare->bindValue(1,(int)$price,PDO::PARAM_INT);

今度は$priceの値を整数型として、下記のように記述した場合です。

$price = 100; $prepare = $dbh->prepare('SELECT name FROM fruit WHERE price = ?'); $prepare->bindValue(1,$price,PDO::PARAM_INT);

値も整数型でそのまま整数型として処理したいとします。

エミュレーションがOFFの場合は、上記のように第2引数に型を明示しなくても問題ないでしょうか?
エミュレーションがONの場合は、下記のように型を明示しないといけないのでしょうか?

$price = 100; $prepare = $dbh->prepare('SELECT name FROM fruit WHERE price = ?'); $prepare->bindValue(1,(int)$price,PDO::PARAM_INT);

【質問】
まとめると下記のような認識でおりますが、正しいでしょうか?

![イメージ説明]WIDTH:600

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

PDO::PDO_PARAM_BOOLを指定したときに、パラメータとして与えた0や空文字列が、クエリの中でfalseに変換されて入る、と理解しています。

投稿2015/03/17 21:55

chokojori

総合スコア971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/03/18 04:24

回答ありがとうございます。 falseに変換されるのは、はじめて知りました。 時間があるときにそれぞれの環境でどのような動作になるか試してみましたいと思います。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2015/03/18 11:05

PostgreSQL等ではBoolean型があるのでPDOがFalseに変換するのでしょうし、MySQLではBoolean型は無くTINYINT型が代用されるので0に置き換えられるのでしょうね。 そういったDBの差異を吸収してくれるということかなと。
退会済みユーザー

退会済みユーザー

2015/03/18 13:29

luckerさん いつもありがとうございます。 なるほどです。DBの差異の話だったんですね。 コメント頂いたのに全然理解しておりませんでした(・ω・`;) 私が勝手にDB=MySQLという認識だったので、MySQLでの話かと勘違いしておりました。すいません^^; 今度からそこについても意識して調べてみてたいと思います。 ありがとうございました。
chokojori

2015/03/18 23:12

DBの差異の話もありますが、Oracleなどはプリペアドクエリをネイティヴに持っています。プリペアドクエリは、それ自体が先にパースされて実行計画を持っており、すでに準備されているところに後からパラメータだけを渡すので効率的なのです。だから、PDOやPerlのDBIでは、prepareしてからexecuteするようにインターフェースが設計されているわけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問