2011-12-22 11 views
5

SELECT FROM sqlコマンド内で動的値を使用することは可能ですか?文字列でテーブル(FROM)を選択

Database->prepare("SELECT bomb FROM ? WHERE id=?") 
    ->execute($strTable,$strID); 

結果:

Fatal error: Uncaught exception Exception with message Query error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near...

+0

私は、これはPHPに関係しているかわからないんだけど... – BoltClock

+0

なぜここでプリペアドステートメントのコードはありますか?どのsqlコマンドも、間にレイヤーを持たないmysqlに直接アクセスできますか? – mate64

+0

あなたはどのライブラリを使用していますか? – RageZ

答えて

3

安全なソースから$strTableをされたと仮定すると、ちょうど

Database->prepare("SELECT bomb FROM $strTable WHERE id=?") 
    ->execute($strID); 
6

号テーブル名は、クエリのパラメータとすることができません。あなたには、テーブル名を連結し、最初のクエリ文字列を構築する必要があると思います。

+0

が不良です。あなたが共有できる回避策のコンセプトを知っていますか? – mate64

+0

これが文書化されているという手掛かりはありますか? – Alex

+1

@msec回避策を教えました。クエリを文字列に作成し、テーブル名をその文字列に連結します。 –

1

を使用し、通常はそれらのデータベース抽象化レイヤは、場所を処理するために準備されたステートメントに依存していますホルダー機能。準備されたRDBMのステートメント機能が照会をコンパイルするため、表が指定されていない場合は照会を準備することはできません。

ライブラリのエスケープ機能を使用し、クエリにテーブル名を含める必要があります。

例:

$tablename = escapement_function($strTable); 
Database->prepare("SELECT bomb FROM {$tablename} WHERE id=?") 
     ->execute($strID); 
2

あなたの不足しているTE bindParam文。 @AlexのようなPHP変数以外のテーブル名を使うことはできないと思います。

<?php 
$stmt = $dbh->prepare("SELECT bomb FROM $tablename WHERE id=:strID"); 
$stmt->bindParam(':strID', $id); 
$stmt->execute(); 
?> 

PHP Manaualのrefernce:http://php.net/manual/en/pdo.prepared-statements.php

+0

多くのSQLインジェクションの男;-) – RageZ

+0

?パラメータを使用すると、SQLインジェクションでは不可能に近くなります。つまり、ユーザーがテーブル名を入力できるようにしている場合を除き、その場合はハッキングする必要があります。 「アプリケーションがプリペアドステートメントを排他的に使用する場合、開発者はSQLインジェクションが発生しないことを確かめることができます。 – Robert

+0

about $ tablename = 'foobar WHERE 1 = 1 - '、$ tablenameが危険な種類のものであるかどうかわからないので、 – RageZ