« [CSS&JavaScript]CSSでダイアログの作成 パート1 | トップページ | [CSS&JavaScript]CSSでダイアログの作成 パート2 »

2006年11月 8日 (水)

[PHP]PDOではまったこと

PHPのPDOで開発を行っていますが、基本的にWindows環境で試験などを行っています。それでたまにLinux上で試験を実行してみととたんに動かなくなることがあります。今日は、ちょっとした思い込みで動かないことになってしまっていたのでそのことを書いておきます。

データベースからデータを取り込むときにPDOを使用している場合、

$db = new PDO( 'pgsql:host=localhost port=5432 dbname=testdb user=bruce password=mypass' );
$stmt = $db->prepare( 'SELECT * FROM testtable WHERE id = :id' );
$stmt->execute( array( ':id'=>$id ) );
$result = $stmt->fetch( PDO::FETCH_ASSOC );

というような一度、「prepare」をしてクエリーの発行準備をおこなってそれから「execute」にパラメータを渡して実際の実行を行うといった書き方をします。

ここまでは、別に何ということもないのですが、複数のパラメータを「execute」に渡すときに落とし穴がありました。

たとえば

$stmt = $db->prepare( 'SELECT * FORM shouhin WHERE price > :min AND price < :max';
$stmt->execute( array( ':min'=>10000, ':max'=>50000 );
$result = $stmt->fetchAll( PDO::FETCH_ASSOC );

というような別の値をとるような変数がある場合は問題ないのですが、同じ値を使う場合、何も考えないで

$stmt = $db->prepare( 'SELECT * FORM seiseki WHERE kokugo = :tensu AND sansu = :tensu';
$stmt->execute( array( ':tensu'=>100 );
$result = $stmt->fetchAll( PDO::FETCH_ASSOC );

という感じに「tensu」を使いまわしてクエリーを発行しようとしました。これは、Windows版で実行すると問題なく国語と算数の点数が100点のデータを取得できるのですが、Linux版に持っていくとクエリーエラーが発生して落ちてしまいます。

よくよくドキュメントを見てみるときちんと「prepare」の中にも書かれていましたし、オンラインのドキュメントの囲みの中で書かれていますがこちらにも同じようにはまった人がいたようです。

つまりは、

$stmt = $db->prepare( 'SELECT * FORM seiseki WHERE kokugo = :kokugo AND sansu = :sansu';
$stmt->execute( array( ':kokugo'=>100, ':sansu'=>100 );
$result = $stmt->fetchAll( PDO::FETCH_ASSOC );

といった感じに同じ値を使うのでもそれぞれ別の名前として使用しろということらしいです。

まあ、いろいろとありましたが結論としてはきちんとドキュメントに目を通せということなんでしょうけど、どう考えても「prepare」に名前をつけれるのであれば使い回しができてもよさそうな気がします。

|

« [CSS&JavaScript]CSSでダイアログの作成 パート1 | トップページ | [CSS&JavaScript]CSSでダイアログの作成 パート2 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/191694/12609036

この記事へのトラックバック一覧です: [PHP]PDOではまったこと:

« [CSS&JavaScript]CSSでダイアログの作成 パート1 | トップページ | [CSS&JavaScript]CSSでダイアログの作成 パート2 »