Как динамически генерировать инструкцию MYSQL UPDATE на основе определенных переменных из HTML FORM

Я использую довольно длинную форму 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 как альтернативы.