我試圖更新我用下面的數據庫:PDO預處理語句 - 語法和消毒
$fields = array(
'titulo',
'tipo_produto',
'quantidade_peso',
'unidade_de_venda',
'unidades_por_caixa',
'caixas_piso',
'pisos_palete',
'tipo_palete',
'unidades_palete',
'caixas_palete',
'uni_diametro',
'uni_largura',
'uni_profundidade',
'uni_altura',
'caixa_largura',
'caixa_profundidade',
'caixa_altura',
'altura_palete',
'volume_unidade',
'volume_caixa',
'volume_palete',
'peso_caixa',
'peso_palete'
);
$sql = 'UPDATE ficha_item SET '.implode(', ', array_map(create_function('$value', 'return "$value=\"" . $_POST["$value"] ."\"";'), $fields)).' WHERE id=?';
$stmt = $db->prepare($sql);
$stmt->execute(array($_POST['item_id']));
$stmt->closeCursor();
這似乎是工作得很好,但我想了解一下安全性,這是在消毒所有?
我想出了這個解決方案嘗試(沒有成功),另一種解決方案後:
$fields = array(
'titulo',
'tipo_produto',
'quantidade_peso',
'unidade_de_venda',
'unidades_por_caixa',
'caixas_piso',
'pisos_palete',
'tipo_palete',
'unidades_palete',
'caixas_palete',
'uni_diametro',
'uni_largura',
'uni_profundidade',
'uni_altura',
'caixa_largura',
'caixa_profundidade',
'caixa_altura',
'altura_palete',
'volume_unidade',
'volume_caixa',
'volume_palete',
'peso_caixa',
'peso_palete'
);
$sql = 'UPDATE ficha_item SET ? WHERE id=?';
$valuesClause = implode(', ', array_map(create_function('$value', 'return "$value=\"" . $_POST["$value"] ."\"";'), $fields));
$stmt = $db->prepare($sql);
$stmt->execute(array($valuesClause, $_POST['item_id']));
$stmt->closeCursor();
沒有錯誤可言,但我的數據庫將不會被更新。我的第一個解決方案是否被消毒?我最初的想法出了什麼問題?我認爲這與PDO如何清理執行上的查詢有關......但我不知道該如何處理它。
注意:數據庫列名稱和輸入名稱相同,這就是爲什麼$value
工作。如果你也想知道,由於PHP版本的活躍,匿名函數是沒有問題的。
參見[如何擠錯誤消息出來PDO的?](http://stackoverflow.com/q/3726505)如何得到一個有意義的錯誤消息。丹尼爾的答案是正確的,雖然,PDO的轉義是數據而已,不列名。 –