如何基于HTML FORM中的已定义变量动态生成MYSQL UPDATE语句

aph*_*wix 2 html php mysql forms

我正在使用相当长的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>
Run Code Online (Sandbox Code Playgroud)

我的问题是将表格发布到 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 ");

?>
Run Code Online (Sandbox Code Playgroud)

我不想在UPDATE语句中声明可能需要更新的每个字段。我希望UPDATE语句仅考虑到存在从表单中发布的已定义PHP变量的情况下涉及的字段。

此刻,我得到了很多 NOTICE: Undefined variable x发布表单时空字段。

我希望这是有道理的-有点long绕。

有什么建议吗?谢谢

更新

在@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."' ";
Run Code Online (Sandbox Code Playgroud)

Sty*_*hon 5

假设表中的所有字段名称都与表单输入的名称相同,这很简单。您可以使用此:

$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);
Run Code Online (Sandbox Code Playgroud)

为了更安全,您应该创建一个接受参数的白名单,即表中的列,如下所示:

$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);
Run Code Online (Sandbox Code Playgroud)

这样,您的查询只能包含您设置的参数,并且如果有人设法注入额外内容(例如,通过更改表单输入的名称),则不会将其传递到数据库。


我也建议您停止使用Mysql_ *,它已被弃用。您应该将MySQLiPDO视为替代方案。