2014-12-15 4 views
4

Я работаю над запросом обновления, где значения должны обновляться только тогда, когда значение не равно null или пусто. Теперь он обновляет все, независимо от значения. Пожалуйста, помогите мне с этим.Обновление только тогда, когда значение не равно null mySQL

$query = "UPDATE bundels 
SET batchkosten = CASE WHEN ". $_POST['batchkosten'] . " IS NOT NULL 
        THEN ". $_POST['batchkosten'] . " 
        ELSE batchkosten 
       END CASE, 
       CASE WHEN ". $_POST['maandelijkse_kosten'] . " IS NOT NULL 
        THEN ". $_POST['maandelijkse_kosten'] . " 
        ELSE maandelijkse_kosten 
       END CASE, 
       CASE WHEN ". $_POST['aanmeldkosten'] . " IS NOT NULL 
        THEN ". $_POST['aanmeldkosten'] . " 
        ELSE aanmeldkosten 
       END CASE, 
       CASE WHEN ". $_POST['transactiekosten'] . " IS NOT NULL 
        THEN ". $_POST['transactiekosten'] . " 
        ELSE transactiekosten 
       END CASE, 
       CASE WHEN ". $_POST['referral'] . " IS NOT NULL 
        THEN ". $_POST['referral'] . " 
        ELSE referral 
       END CASE, 
       CASE WHEN ". $_POST['actief'] . " IS NOT NULL 
        THEN ". $_POST['actief'] . " 
        ELSE actief 
       END CASE 
       WHERE bundel_id = ". $_POST['bundel_id'] . ""; 
     $result = mysql_query($query, $db) or die ('FOUT: werkt niet'); 
      header ("Location: vergelijker_bewerken.php"); 
     } else { 
      $bundels = mysql_query("SELECT bundels.psp_id, psp.psp_id, psp_naam, bundels.bundel_id, batchkosten, maandelijkse_kosten, aanmeldkosten, transactiekosten, referral, actief from bundels 
            JOIN psp 
           ON psp.psp_id = bundels.psp_ID"); 
} 
+0

Какое значение вы имеете в виду? – Pupil

+3

1. Прекратите использование функций 'mysql_'. Они устарели и были годами. Они также не поддерживаются и не получают обновлений безопасности. 2. Ваш код очень открыт для SQL-инъекции. Используйте 'PDO' или' MySQLi' с подготовленными операторами и привяжите переменные. Нетрудно изменить '$ _POST ['bundel_id']' на ''' ИЛИ ​​1 = 1', чтобы изменить все записи в базе данных. Связанные переменные исправят это. – h2ooooooo

ответ

5
  1. Использование Подготовленные выражения избежать пользовательского ввода и избежать ошибок синтаксиса SQL и инъекции SQL.
  2. Вы можете использовать case

    UPDATE bundels 
    SET batchkosten = case when ? is not null and length(?) > 0 
             then ? 
             else batchkosten 
            end, 
    ... 
    

Ваш текущий запрос переводится (который должен бросить ошибку на самом деле)

UPDATE bundels 
SET batchkosten = CASE WHEN ? length(?) > 0 
         THEN ? 
         ELSE batchkosten 
        END 
WHERE bundel_id = ? 

Но использовать вместо:

SET batchkosten = CASE WHEN ? is not null and length(?) > 0 
+0

У меня теперь есть: $ query = "UPDATE bundels \t SET batchkosten = CASE WHEN". $ _POST ['batchkosten']. "НЕ НУЛЛ THEN". $ _POST ['batchkosten']. " ELSE batchkosten END, \t \t \t \t CASE WHEN". $ _POST ['maandelijkse_kosten']. "НЕ НУЛЛ THEN". $ _POST ['maandelijkse_kosten']. " ELSE maandelijkse_kosten END, и т.д .. пока он не работает, и я не могу найти решение. Можете ли вы помочь мне с этим? – Broodje

+0

не работает средство? –

+0

не обновляет // момент, когда я поставлю полный код в первом сообщении – Broodje

0

Измените запрос на это

$query= "UPDATE bundels SET 
batchkosten =    ' ". $_POST['batchkosten'] . " ', 
maandelijkse_kosten =  ' ". $_POST['maandelijkse_kosten'] . " ', 
aanmeldkosten =    ' ". $_POST['aanmeldkosten'] . " ', 
transactiekosten =   ' ". $_POST['transactiekosten'] . " ', 
referral =     ' ". $_POST['referral'] . " ', 
actief =      ' ". $_POST['actief'] . " ' 
WHERE bundel_id = ". $_POST['bundel_id'] . " ". 
"and your_attribut is not null and your_attribut != ''"; 

Не забудьте изменить «ваш_атрибут».

0

вы можете написать скрипт, некоторые, как это может быть:

$query = "Update bundels SET "; 
$columns = array("batchkosten", 
        "maandelijkse_kosten", 
        "aanmeldkosten",  
        "transactiekosten", 
        "referral", 
        "actief"); 

foreach($columns as $column){ 
    if(isset($_POST[$column]) && !empty($_POST[$column])){ 
     $query .= $column . " = " $_POST[$column] . " ";    
    } 
} 

$query .= " WHERE bundel_id = " . $_POST['bundel_id']; 
Смежные вопросы