PDO Prepared Statement 未按预期在 MySQL 中创建表

问题描述

我已经花了 1 小时以上的时间查看代码,但我无法弄清楚为什么它不起作用,我正在寻求建议而不是扯掉我的头发。

我只是想写一个 PHP 脚本来在 MysqL 中创建一些表。

下面的代码根本不创建任何表。为什么?

//prepared statement to execute for table creation
$query = "CREATE TABLE IF NOT EXISTS :table (:columns)";
$stmt = $dbh->prepare($query);
$stmt->bindParam(":table",$table,PDO::ParaM_STR);
$stmt->bindParam(":columns",$columns,PDO::ParaM_STR);

//creating the members table
$table = "members";
$columns = "user VARCHAR(20),password VARCHAR(20),INDEX(user(5))";

try {
  $stmt->execute();
} catch (Exception $ex) {
    echo "Exception: ".$ex->getMessage(); }
/*
$sql = "CREATE TABLE IF NOT EXISTS $table ($columns)";
$dbh->query($sql);*/
echo "Table $table Now in database ". DB_NAME. "<br>";

当我注释掉准备好的 stmt 并使用直接查询时,它可以工作并创建表,因此 $dbh 没有任何问题。

//prepared statement to execute for table creation
/* 
$query = "CREATE TABLE IF NOT EXISTS :table (:columns)";
$stmt = $dbh->prepare($query);
$stmt->bindParam(":table",PDO::ParaM_STR);
*/
//creating the members table
$table = "members";
$columns = "user VARCHAR(20),INDEX(user(5))";
/*
try {
  $stmt->execute();
} catch (Exception $ex) {
    echo "Exception: ".$ex->getMessage(); }
*/
$sql = "CREATE TABLE IF NOT EXISTS $table ($columns)";
$dbh->query($sql);
echo "Table $table Now in database ". DB_NAME. "<br>";

解决方法

来自:优秀的https://phpdelusions.net/pdo#bindable

查询可以绑定的部分

了解哪些查询部分可以使用准备好的语句绑定,哪些不能绑定,这一点非常重要。事实上,该列表非常短:只能绑定字符串和数字文字。所以你可以说只要你的数据可以在查询中表示为数字或带引号的字符串文字 - 它可以被绑定。对于所有其他情况,您根本不能使用 PDO 准备好的语句:标识符、逗号分隔列表、带引号的字符串文字的一部分或任何其他任意查询部分都不能使用准备好的语句进行绑定。

最常见用例的解决方法可以在文章的相应部分找到