为什么不能使用准备好的语句(基于 ALTER TABLE)来设置 PHP 中 MySQL 字段的默认值?

Why isn't it possible to use prepared statements (based on ALTER TABLE) to set default values of MySQL fields from PHP?

我正在编写 PHP 代码来更改 MySQL 数据库中 varchar 字段的默认值。为了代码的安全,我使用了准备好的语句,但由于某种原因,在这种特殊情况下似乎不可能 PHP/MySQL 接受它,这是为什么?

(我正在使用 PHP 5.5.11)

这是使用准备语句的代码,它不起作用(mysqli_stmt_execute() 调用 returns null,字段的默认值保持不变):

$new_field_default_value = 'test';
$field_modification_sql_command = "ALTER TABLE MyTable ALTER COLUMN MyColumn SET DEFAULT ?";
$stmt = mysqli_stmt_init($db_conn_handle);
mysqli_stmt_prepare($stmt, $field_modification_sql_command);
mysqli_stmt_bind_param($stmt, 's', $new_field_default_value);
$temp_db_res = mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);

这是使用串联和纯查询执行的(不安全)代码,它确实有效(mysqli_query() 调用 returns true,字段的默认值确实被更改) :

$new_field_default_value = 'test';
$field_modification_sql_command = "ALTER TABLE MyTable ALTER COLUMN MyColumn SET DEFAULT '" . $new_field_default_value . "'";
$temp_db_res = mysqli_query($db_conn_handle, $field_modification_sql_command);

谁能告诉我为什么在这里使用准备好的语句不起作用,以及我需要更改什么(如果可能的话?)以使其与准备好的语句一起使用?

实际上,从docs关于预处理语句:

In general, parameters are legal only in Data Manipulation Language (DML) statements, and not in Data Definition Language (DDL) statements.

因此,DDL 准备语句中的绑定参数不应该起作用。我认为您需要使用 preg_match 验证参数才能通过 "insecure" 方式执行。