0

特定の MySQL クエリを PDO の名前のないプレースホルダーで動作させようとしましたが、問題は 3 番目のクエスチョン マークの周りにある ' ' に関係していると思われますが、それを理解することはできません。

例外が発生します:「無効なパラメーター番号: バインドされた変数の数がトークンの数と一致しません」

関数の関連部分、try-catch などは、読みやすくするために削除されています。関数は、PDO-MySQL に変更する前の以前の純粋な MySQL コードで正常に機能した単純な英数字文字列を含む $column および $mytype で呼び出されるため、問題ないはずです。

define('SQL_TABLE', 'mytable');

function listThem($column, $mytype) {

   # These lines succeed
   $databaseHandle = new PDO('mysql:host=' . SQL_HOST . ';dbname=' . SQL_DATABASE, SQL_USER, SQL_PASSWORD);
   $databaseHandle->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

   # The following three lines cast the exception
   $input = array(SQL_TABLE, $column, $mytype);
   $statementHandle = $databaseHandle->prepare('SELECT *, ((100 * likes) / (dislikes + 1)) '
      . "AS rating FROM ? WHERE ? REGEXP '?' ORDER BY rating DESC;");
   $statementHandle->execute($input);

   # . . .  more code here
}
4

1 に答える 1

4

準備済みステートメントを使用して、テーブルまたはフィールド名を引数としてバインドすることはできません。パラメータ バインディングは、値専用です。

それらを文字列に組み込む必要があります。値を適切にフィルタリングするようにしてください。

また、「?」を使用する必要はありません。バインドされた引数がこれを処理します。

于 2012-08-18T17:59:49.627 に答える