次のようにデータベースを更新しようとしています。
$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のライブバージョンのため、無名関数は問題外です。