Я пишу код PHP, чтобы изменить значение по умолчанию для поля varchar в базе данных MySQL. Для того, чтобы код был безопасным, я использую подготовленное утверждение, но по какой-то причине, по-видимому, невозможно заставить 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);
Вот (небезопасный) код, использующий конкатенацию и чистое выполнение запроса, который работает (вызов 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);
Может ли кто-нибудь сказать мне, почему это не работает, чтобы использовать подготовленные утверждения здесь, и что мне нужно изменить (если вообще возможно?), Чтобы заставить его работать с подготовленным утверждением?
На самом деле, из документы о подготовленных заявлениях:
В целом, параметры допустимы только в инструкциях на языке манипулирования данными (DML), а не в инструкциях на языке определения данных (DDL).
Таким образом, параметр связывания в подготовленном выражении DDL не должен работать. Я думаю, вам нужно проверить параметр с preg_match
выполнить «небезопасным» способом.
Других решений пока нет …