たとえば、これは正常に機能します。
$dropTable = $dbConnection->prepare('DROP TABLE IF EXISTS announcements');
$dropTable->execute();
$createTable = $dbConnection->prepare('CREATE TABLE announcements(
id MEDIUMINT NOT NULL AUTO_INCREMENT,
announcements TEXT NOT NULL,
PRIMARY KEY (id))');
$createTable->execute();
しかし、これは失敗します:
$dropTable = $dbConnection->prepare('DROP TABLE IF EXISTS :tableToDrop');
$dropTable->bindParam(':tableToDrop', $_GET['table']);
$dropTable->execute();
$createTable = $dbConnection->prepare('CREATE TABLE announcements(
id MEDIUMINT NOT NULL AUTO_INCREMENT,
announcements TEXT NOT NULL,
PRIMARY KEY (id))');
$createTable->execute();
エラーあり:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]:
Syntax error or access violation: 1064 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 '?' at line 1' in xxxx/createTables.php:9
Stack trace: #0 xxxxx/createTables.php(9):
PDO->prepare('DROP TABLE IF E...') #1 {main} thrown in xxxx/createTables.php on line 9
些細なことだと思いますが、何時間もやっています。乾杯。
編集:テーブル名でbindParamを使用できないことが判明しました。動的なテーブル名で安全なプリペアドステートメントを実行する方法はありますか?