使用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 会给你带来更多的麻烦。
首先,您需要使用一个函数来动态创建值列表,因为没有理智的开发人员会一个一个地更新字段:
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 的东西,而必须使用位置 (?) 占位符而不是命名占位符。