我正在使用一个相当长的HTML表单来更新与产品相关的许多细节——为了简洁起见,我不会完整地共享该表单。然而,为了便于说明,这里有一个片段:
HTML表单
<form name="form1" method="post" action="update_ac.php">
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td>
<input name="season" type="text" class="button_select" id="season" value="<?=$rows['season']; ?>" size="10" />
<input name="restock" type="checkbox" id="restock" value="on" <?php if($rows['restock']=='on') { echo 'checked="checked"'; } ?>/>
// other fields
</td>
</tr>
</table>
</form>
我的问题是,在将表单发布到update_ac.php
时,如何根据已完成的字段动态生成MYSQL更新语句?
以下是我的表单操作页面示例:
PHP FORM操作
<?php
foreach ($_POST as $key => $value) {
$$key = $value;
}
$sql= mysql_query ("
UPDATE product SET
title='".$title."',
rating='".$rating."',
season='".$season."',
brand_id='".$brand_id."',
category='".$category."',
... etc ");
?>
我不想在UPDATE语句中声明每一个可能需要更新的字段。我希望UPDATE语句只处理相关字段,因为存在从表单发布的已定义PHP变量
目前,我收到了很多NOTICE: Undefined variable x
,在发布表单时有空字段。
我希望这是有道理的——有点长篇大论。
有什么建议吗?感谢
更新
根据@Styphon的回答,我对其进行了轻微修改,在查询的末尾包含了WHERE
条件。
$query = "UPDATE product SET";
$comma = " ";
foreach($_POST as $key => $val) {
if( ! empty($val)) {
$query .= $comma . $key . " = '" . mysql_real_escape_string(trim($val)) . "'";
$comma = ", ";
}
}
$product_id = $_POST['product_id'];
$query = $query . "WHERE product_id = '".$product_id."' ";
假设表中的所有字段名称与表单输入的名称相同,这是直接的。你可以使用这个:
$query = "UPDATE product SET";
$comma = " ";
foreach($_POST as $key => $val) {
if( ! empty($val)) {
$query .= $comma . $key . " = '" . mysql_real_escape_string(trim($val)) . "'";
$comma = ", ";
}
}
$sql = mysql_query($query);
为了更安全,您应该创建一个可接受参数的白名单,即表中的列如下:
$query = "UPDATE product SET";
$comma = " ";
$whitelist = array(
'title',
'rating',
'season',
'brand_id',
'cateogry',
// ...etc
);
foreach($_POST as $key => $val) {
if( ! empty($val) && in_array($key, $whitelist)) {
$query .= $comma . $key . " = '" . mysql_real_escape_string(trim($val)) . "'";
$comma = ", ";
}
}
$sql = mysql_query($query);
这样,您的查询只能包含您设置的参数,如果有人设法注入额外的参数(例如,通过更改表单输入的名称),它将不会传递到您的数据库。
我还建议您停止使用Mysql_*,它已被弃用。您应该将MySQLi或PDO作为备选方案。