1

正しい方法でパラメータをバインドしようとしていますが、MySQLから1064エラーが発生し、引用符が多すぎることを示しています。書かれたコードは次のようになります。

$db_host = 'localhost';
$db_username = 'root';
$db_password = 'Password123';
$db_database = 'db_test';

$dbh = new PDO("mysql:host=$db_host", $db_username, $db_password);
$stmt = $dbh->prepare("DROP DATABASE :db_database;");
$stmt->bindParam(':db_database', $db_database, PDO::PARAM_STR, 7);
$stmt->execute() or exit(print_r($stmt->errorInfo(), true));

エラーメッセージを表示します。

配列([0] => 42000 [1] => 1064 [2] => SQL構文にエラーがあります。「db_test」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。 1行目)

変数$db_databaseを間違った方法で挿入した場合、つまりSQL構文に直接挿入した場合は正常に機能しました。また、magic_quotesが影響を与える場合は、オフになっていることを確認しました。私は物事を正しく行ったように感じるので、今私は立ち往生しています(しかし明らかに私はしていません)。誰かがエラーを見ることができますか?

4

2 に答える 2

3
  1. データベースではこれさえ許可されないため、エミュレーションを使用しているようですPREPARE(set $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);)
  2. パラメータで識別子(列/テーブル/データベース名)、関数などに名前を付けることはできません。これは、準備されたステートメントがどのように機能するかではなく、「真の」文字列/浮動小数点数/整数のみを送信できます。要するに、どこかに識別子または関数名が必要な場合、それはクエリの前にある必要があります->prepare()
于 2012-06-27T18:22:08.970 に答える
1

次のことを試してください。

$dbh->query("DROP TABLE `{$db_database}`");

データベースではなくテーブルを操作する場合は、準備/実行に固執する必要があります。また、複数の同様のクエリを発行するときにのみ、準備と実行によるパフォーマンスの向上が見られます。PHPマンページからの引用:

複数回発行する必要があるクエリの場合、PDO::prepare() を使用して PDOStatement オブジェクトを準備し、PDOStatement::execute() を複数回呼び出してステートメントを発行すると、パフォーマンスが向上します。

于 2012-06-27T18:23:26.453 に答える