2014-09-05 36 views
1

我使用一個相當長的HTML表單來更新與產品相關的大量細節 - 爲簡潔起見,我不會共享整個表單。然而,爲了說明的目的這裏有一個片段:如何根據HTML中定義的變量動態生成MYSQL UPDATE語句FORM

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表單操作

<?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,發佈表單時已經有空字段。

我希望這是有道理的 - 有點囉嗦。

有什麼建議嗎?由於

UPDATE

從@ 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."' "; 
+0

查看'isset'也許> – Fluffeh 2014-09-05 10:29:04

+0

@Fluffeh - 這並不能解決我的問題,因爲我不得不測試每個可能的變量對ISSET。我試圖避免必須聲明超過50個變量。 – aphextwix 2014-09-05 10:55:58

回答

3

假設表中的所有字段名稱與表單輸入的名稱相同,這是直接的。您可以使用此:

$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_ *,這是deprecated。你應該看看MySQLiPDO作爲替代。

+0

@nalply我已經在real_escape_string中添加了,現在也習慣於使用預準備語句。 – Styphon 2014-09-05 10:33:09

+0

@Styphon - 我剛剛意識到'WHERE product_id = $ product_id'行從語句結尾處缺少。我已經更新了上面的代碼。謝謝 – aphextwix 2014-09-05 11:23:55

+0

@nalply我在查詢周圍使用了單引號,所以這是無關緊要的,該查詢被保護。你在評論之前還看到了我的更新答案和白名單? – Styphon 2014-09-06 08:37:15