こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【PHP】PDOでのMysqlから値を取り出す時に

現在phpを勉強しております。
PDOオブジェクトを生成し、
prepareメソッドでMySQLで実行するクエリをセットして
executeメソッドで実行する。
というのを以下のようにしております

$pdo= new PDO($dsn, $user, $password);
$query = "SELECT * FROM table_name";
$stmt = $pdo->prepare();
$stmt->execute;

で、この場合でも正常に動くのですが
MySQL内のテーブルに「?」が含まれる場合だと
$query = "SELECT * FROM table_name?test";
$stmt = $pdo->prepare();
$stmt->execute;
とすると$queryの「?」をバインド変数とみなしてしまい
エラーで「?の数とバインド先の変数の数を合わせろ」と出てしまいます。

ですので、「?」をエスケープしようと思い
$query = "SELECT * FROM table_name\?test";
としたのですが、結局エスケープされず
同じエラーが出てしまいました。

エスケープできるならエスケープの方法か
?をバインド変数としてみなさない方法か
または他の解決方法かを
よろしければご教授願います。

投稿日時 - 2013-07-09 16:50:29

QNo.8169205

すぐに回答ほしいです

質問者が選んだベストアンサー

少し、調べてみましたが、?は全てバインドされてしまうようです。

めぼしい情報も見つけられませんでした。
大概少し特殊な情報も、PHPマニュアルのコメント欄なんかに書いてあることがありますが、ソレも無いようです。

解決策は、
・プリペアドステートメントを使わない
・テーブル名を変更する
のどちらかしか無いと思います。

ただ、今後のメンテナンスなども含めて考えると、テーブル名に半角英数以外の文字が入っているのは
少し実装としては厄介ではないかなと思います。

規模が大きくなり、フレームワークを利用することになった場合、フレームワークのORマッパーを使うことになると思いますが、
その場合でも、プリペアドステートメントのところで毎回引っかかるようなことになりそうです。

投稿日時 - 2013-07-10 01:27:35

お礼

回答ありがとうございます。
prepareかexecuteはoptionでバインド無効にできるかな~と思い調べていましたが
やはりありませんねぇ(^-^;)
確かに将来的にフレームワークを使ってデータベースを操作するとなると
テーブル名にややこしい記号が入ってるとまたエラーで苦しむことになりそうなので
おとなしくテーブル名を変更するようにします。
ありがとうございました!

投稿日時 - 2013-07-10 16:33:02

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

そもそもテーブル名に?は利用できないと思いますが。

投稿日時 - 2013-07-09 21:19:29

補足

返信ありがとうございます。
phpmyadmin上からSQL実行、
またはperlのDBI上から、
PHPのPDOのprepare,execute経由でのSQL実行で試しましたが
どのやり方でも、テーブル名に?を利用できました。
またデータベース名も可能でした。
記述し忘れていましたが
環境はMysql のVersion 5.5.25です。

投稿日時 - 2013-07-09 22:00:40

あなたにオススメの質問