2014-09-05 5 views
1

Я использую довольно длинную форму HTML, чтобы обновлять множество деталей, относящихся к продукту, - для краткости я не буду делиться формой в полном объеме. Однако, для целей иллюстрации здесь отрывок:Как динамически генерировать инструкцию MYSQL UPDATE на основе определенных переменных из HTML FORM

HTML FORM

<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

+0

@Fluffeh - это не решает мою проблему, так как мне нужно будет проверить каждую возможную переменную на ISSET. Я пытаюсь избежать объявления более 50 переменных. – aphextwix

ответ

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); 

Таким образом, ваш запрос может содержать только параметры, которые вы set, и если кому-то удастся ввести дополнительные функции (например, изменив имена ваших входов формы), они не будут переданы в вашу базу данных.


Я также рекомендую вам прекратить использование mysql_ *, это deprecated. Вы должны посмотреть на MySQLi или PDO в качестве альтернативы.

+0

@nalply Я добавил в real_escape_string, тоже привыкший использовать готовые заявления сейчас. – Styphon

+0

@Styphon - Я только что понял, что строка 'WHERE product_id = $ product_id' отсутствует в конце инструкции. Я обновил код выше.Спасибо – aphextwix

+0

@nalply Я использую одинарные кавычки вокруг запроса, так что это не имеет значения, этот запрос защищен от этого. Также вы видели мой обновленный ответ с белым списком, прежде чем комментировать? – Styphon

Смежные вопросы