safeMysqlを使えば簡単です:
include 'safemysql.class.php';
$db = new safeMysql();
$allowed = array('name', 'surname', 'all the fields you want to save');
foreach ($_POST['changed'] as $SubArray)
{
$insert = $db->filterArray($SubArray, $allowed);
$db->query("UPDATE clients SET ?u WHERE id = ?s", $insert, $SubArray['recid']);
}
PDOに欠陥があると、さらに多くの問題が発生します。まず、値のリストを
動的
に作成する関数を用意する必要があります。まともな開発者はフィールドを 1 つずつ更新しないからです。
function pdoSet($fields, &$values, $source = array()) {
$set = '';
$values = array();
if (!$source) $source = &$_POST;
foreach ($fields as $field) {
if (isset($source[$field])) {
$set.="`".str_replace("`","``",$field)."`". "=:$field, ";
$values[$field] = $source[$field];
}
}
return substr($set, 0, -2);
}
これで、更新の実行を開始できます
$allowed = array('name', 'surname', 'all the fields you want to save');
foreach ($_POST['changed'] as $SubArray)
{
$set = pdoSet($allowed, $values, $SubArray);
$sql = "UPDATE clients SET $set WHERE id = :id";
$stm = $dbh->prepare($sql);
$values["id"] = $SubArray['recid'];
$stm->execute($values);
}
コメントから質問に回答するには:
まず第一に、自分の分野を知らない開発者はナンセンスです。それはあり得ません。phpmyadmin のような自由形式のアプリケーションはまれな例外であり、明らかにそうではありません。
結局のところ、それはセキュリティの問題です。自由形式の配列には 2 つの危険があります。
- テーブルには、顧客が許可されていないフィールドが含まれている可能性があります。そして、このコードを再利用して、顧客が詳細を編集できるようにすることは間違いありません。そのため、更新する必要のあるフィールドを常に把握しておくことをお勧めします。
- 名前付きプレースホルダーを介した単純な SQL インジェクション (ユーザー入力から直接変更されていないことに気付くかもしれません)。
したがって、人工フィールドを追加できないことが 100% 確実な場合は、このチェックを省略できますが、常に危険にさらされます。とにかく、str_replace を使用したこのことは、フィールド名で使用する必要がありますが、名前付きプレースホルダーの代わりに位置 (?) プレースホルダーを使用する必要があります。