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