2016-01-16 23 views
4

我正在編寫PHP代碼來更改MySQL數據庫中varchar字段的默認值。爲了使代碼安全,我使用了準備好的語句,但出於某種原因,在這種特殊情況下讓PHP/MySQL接受這一點似乎是不可能的,爲什麼?爲什麼不可以使用預準備語句(基於ALTER TABLE)來設置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); 

任何人都可能告訴我,爲什麼在這裏使用準備好的語句無法正常工作,而我需要改變(如果可能的話)以使其與準備好的語句一起工作?

+0

'$ new_field_default_value'的值來自哪裏?那就是說,這個價值是來自一個值得信賴或不可靠的來源? –

+0

它來自一個不可信賴的源碼(一個HTTP參數),上面的代碼只是簡化了這個例子,所以是的,我確實需要一個準備好的語句(無論哪種方式,我仍然感興趣的是爲什麼這些不會在這種情況下工作!)。 – QuestionOverflow

+0

這可能是'mysqli'驅動程序的問題。也許嘗試使用'PDO'?另外,您應該嘗試直接使用[SQL語法](http://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html)來準備語句以確保它是可能的在所有。 –

回答

3

其實,從docs約預處理語句:

一般來說,參數是合法的只在數據操縱語言(DML)語句,而不是在數據定義語言(DDL)語句。

因此,在DDL預備語句中綁定參數應該不起作用。我認爲你需要驗證參數preg_match以「不安全」的方式執行。

+0

'mysqli :: prepare()'文檔中特別提到了這一點。相應的'PDO :: prepare()'文檔根本沒有提及它。 –

+0

@DarwinvonCorax我已經調整了鏈接引用以調用準備語句的正確方法。 –

+0

謝謝!但是,如何知道何時使用DML語句以及何時使用DDL語句,是否有任何簡單的方法可以區分它們?還是隻是像「如果操作以任何方式影響數據庫/表結構,它是DDL,如果不是,它是DML」? – QuestionOverflow

相關問題