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

Que*_*low 4 php mysql alter-table prepared-statement

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

(我使用的是 PHP 5.5.11)

这是使用准备好的语句的代码,它不起作用(mysqli_stmt_execute() 调用返回 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);
Run Code Online (Sandbox Code Playgroud)

这是使用连接和纯查询执行的(不安全)代码,它确实有效(mysqli_query() 调用返回 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);
Run Code Online (Sandbox Code Playgroud)

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

Fel*_*ira 5

实际上,从关于准备好的语句的文档中

通常,参数仅在数据操作语言 (DML) 语句中合法,在数据定义语言 (DDL) 语句中无效。

因此,DDL 准备语句中的绑定参数不应该起作用。我认为您需要验证参数preg_match以通过“不安全”方式执行。