@Diego は正しいです。テーブル名、列名、SQL キーワード、値のリスト (IN() 述語など)、またはその他の式に SQL パラメーターを使用することはできません。
SELECT :column FROM table -- NO, unless you want to select a constant string
SELECT * FROM :table -- NO
SELECT * FROM table WHERE column IN (:list) -- NO
SELECT * FROM table ORDER BY :column -- NO
SELECT * FROM TABLE ORDER BY column :asc_or_desc -- NO
基本的に、次の規則を覚えておいてください。SQL パラメータの代わりに定数値(引用符で囲まれた文字列、日付、または整数など) を配置できる場合、それはパラメータの正当な使用法です。そうでなければ、いいえ。
SELECT :string FROM table -- OK, but returns value of :string for every row
SELECT * FROM table WHERE column = :string -- OK
SELECT * FROM table WHERE column IN (:x, :y, :z) -- OK, one parameter per value
また、PDO をプログラミングするときは、常に と の戻り値を確認する必要がprepare()
ありexecute()
ます。これらはエラー時に戻りfalse
ます。これを検出して適切に応答するコードを記述する必要があります (つまり、エラーをログに記録し、エラー ページを表示し、ユーザーに別の機会を与えるなど)。
$stmt = $conn->prepare("SELECT * FROM :type"); // illegal use of parameter
if ($stmt === false) {
// check $pdo->errorInfo(), see documentation
}
$stmt->bindParam(':type', $type);
$status = $stmt->execute();
if ($status === false) {
// check $stmt->errorInfo(), see documentation
}
他の PDO 関数の戻り値を確認することもできます。ドキュメントを参照してください。それらの多くはfalse
エラーを返します。