2017-04-05 5 views
-1

Wie aktualisiere ich nur die nicht leeren Werte?Wie aktualisiert man nur nicht leere Werte in einer Tabelle?

Ich habe einen SQL-Code zum Aktualisieren einer Ergebnismenge.

Aber nachdem ich mein Formular abgeschickt habe, werden die Werte, die ich nicht eingegeben habe, ebenfalls aktualisiert und als leere Werte in der Datenbank aufgezeichnet.

Hier ist mein Code

$insert = "UPDATE result SET test_1= '$test_1', test_2= '$test_2', 
       test_3= '$test_3', test_4= '$test_4', 
       test_5 = '$test_5' 
       WHERE roll_no = '$roll_no'"; 

Und die Form

<form action="#" method="post"> 
<input type="text" name="test_1" required="" class="" > 
<input type="text" name="test_2" required="" class="" > 
<input type="text" name="test_3" required="" class="" > 
<input type="text" name="test_4" required="" class="" > 
<input type="text" name="test_5" required="" class="" > 
<button type="submit" class="" name="sub">SUBMIT</button> 

Wenn ich in nur test_1 und test_2 füllen, ich andere Spalten nicht betroffen sein wollen, da es keine sind Eingaben.

+0

Was nicht leer ist, die Spalte oder Variablen auszudrücken? Wenn Variablen die Abfrage dynamisch erstellen. – chris85

+0

In Ihrem Code überprüfen, ob sie nicht eingegeben werden, und wenn sie nicht sind, setzen Sie diese Variable = etwas und setzen Sie es in Ihre Update-Abfrage. Wenn der Name leer oder nicht eingegeben ist, vergeben Sie name = "nicht mitgeliefert". – clearshot66

+0

Einige der Variablen wären leer, aber die Spalten enthalten einen Wert. Wenn ich nur die Eingaben einchege, die ich zum Aktualisieren ausgefüllt habe (z. B. nur test_1 und test_2), werden stattdessen die gesamten Spalten aktualisiert. –

Antwort

0

Erstens würden Sie brauchen eine Möglichkeit, um festzustellen, dass es für ein bestimmtes Formularfeld „keine Eingabe“ war. Nehmen wir an, dass das Formularfeld bereitgestellt wird und dass der Wert eine Zeichenfolge mit der Länge Null ist.

Das heißt, wir können einen bedingten Test des einer Variablen zugewiesenen Wertes (zB $ test_4`) machen, um zu bestimmen, ob das ein Wert von we ist, oder ob es "no input" ist, was wir wollen außer Acht lassen.


In SQL ist es möglich, einen Ausdruck auszuwerten und einen Wert zurückzugeben. Als Beispiel der ANSI-Standard:

CASE WHEN foo = '' THEN bar ELSE foo END 

oder MySQL-spezifische Kurzschrift:

IF(foo = '',bar,foo) 

In einer UPDATE-Anweisung ist es möglich, den aktuellen Wert einer Spalte zu verweisen, und wir können zurückkehren daß in einem Ausdruck ...

UPDATE mytable t 
    SET t.col = IF(foo='',t.col,foo) 
WHERE ... 

Wenn foo auf eine Null-Zeichenfolge der Länge gleich ist, dann gibt dem Ausdruck den aktuellen Wert der Spalte. Und das wird wieder zu der gleichen Spalte zugewiesen, was zu "keiner Aktualisierung" des Spaltenwerts führt.(Beachten Sie, dass, wenn es ein „vor der Aktualisierung“ ist Auslöser für die Tabelle definiert, würde der Trigger ausgelöst, und das könnte möglicherweise den Wert NEW.col ändern.)


Unter der Annahme, dass der Wert $test_4 wurde entkommen, um richtig zu mildern mögliche SQL-Injection-Schwachstellen, und es gibt einigen Grund, warum wir nicht eine vorbereitete Anweisung mit bind Platzhalter ...

Unter der Annahme, dass wir „keine Eingabe“

repräsentiert in $test_4 ein Null-Länge String gespeichert werden lassen, können

Wir könnten so etwas tun:

UPDATE result r 
    SET ... 
    , r.test_4 = IF('$test_4' = '', r.test_4, '$test_4') 
WHERE ... 

Je mehr ANSI-Standard Art und Weise, dass

UPDATE result r 
    SET ... 
    , r.test_4 = CASE WHEN '$test_4' = '' THEN r.test_4 ELSE '$test_4' END 
WHERE ... 
+0

Arbeitete !!!!!!! Ich danke dir sehr –

0

Wenn Sie bei der von Ihnen geposteten Abfrage bleiben möchten, kann Ihnen in diesem Fall COALESCE helfen.

UPDATE result 
SET test_1 = COALESCE('$test_1', test_1), test_2 = COALESCE('$test_2', test_2), 
    test_3 = COALESCE('$test_3', test_3), test_4 = COALESCE('$test_4', test_4), 
    test_5 = COALESCE('$test_5', test_5) 
WHERE roll_no = '$roll_no'; 

MySQL COALESCE() Funktion gibt den ersten Nicht-NULL-Wert aus einer Liste, oder Null, wenn es keine nicht-NULL-Werte sind.

Beispiel: MySQL COALESCE() Funktion

mysql> SELECT COALESCE(NULL, 2, 3); 
+----------------------+ 
| COALESCE(NULL, 2, 3) | 
+----------------------+ 
|     2 | 
+----------------------+ 
1 row in set (0.02 sec) 
mysql> SELECT COALESCE(NULL, NULL, NULL); 
+----------------------------+ 
| COALESCE(NULL, NULL, NULL) | 
+----------------------------+ 
|      NULL | 
+----------------------------+ 
1 row in set (0.00 sec) 

Hinweis: Dies funktioniert nur, wenn die leeren Werte in der Tat sind NULL. NULL <> Empty

+1

Ich denke, das ist die Lösung, aber die Parameter sind invertiert. Für das, was ich verstehe, ist '$ test_1' die Variable von der Seite und das kann' NULL' sein ... Also wird 'COALESCE ('$ test_1', test_1)' die Variable '$ test_1' nur dann zuweisen, wenn dies der Fall ist nicht 'NULL' behalten sonst den vorherigen Wert. –

+0

Vielen Dank @JuanCarlosOropeza. Ihre Meinung wird sehr geschätzt. – 1000111

-1

IFNULL Funktion Versuchen Sie, wie unten angegeben:

UPDATE result 
SET test_1 = ifnull(test_1,'$test_1'), 
    test_2 = ifnull(test_2,'$test_2'), 
    test_3 = ifnull(test_3,'$test_3'), 
    test_4 = ifnull(test_4,'$test_4'), 
    test_5 = ifnull(test_5,'$test_5') 
WHERE roll_no = '$roll_no' 
Verwandte Themen