Hoe insert `NULL` in db veld dat UNIQUE moet zijn

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Danny von Gaal

Danny von Gaal

29/01/2016 17:11:42
Quote Anchor link
Ik heb een tabel met gebruikers en het email veld moet bij mij UNIQUE zijn. Het e-mailadres wordt namelijk ook gebruikt om in te loggen dus dat mag echt niet dubbel voorkomen omdat je anders misschien in iemand anders zijn account kan inloggen.

Maar wanneer ik met een HTML/PHP formulier een gebruiker wil update en het e-mailveld leeg maak dan krijg ik iedere keer een fout met het bijwerken van de database omdat die denkt dat het dubbel voorkomt. Er wordt dus eerder een string NULL ingevoerd ipv de SQL NULL jargon. Hoe kan ik dit oplossen?

Dit is een deel van me code waar het om gaat:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
// Gebruikersnaam leeg
    if(empty($formgebruikersnaam)) {
        
        $_SESSION['user-verwerken-melding'] = "<div class='warning'>Er moet een gebruikersnaam zijn ingevuld.</div>";
        header("Location:" . $formpagina . "");
        exit;
        
    }

    
    // Email leeg
    if(!empty($formemail)) {
    
        if (filter_var($formemail, FILTER_VALIDATE_EMAIL) == FALSE) {
        
            $_SESSION['user-verwerken-melding'] = "<div class='warning'>Het opgegeven e-mailadres is niet geldig.</div>";
            header("Location:" . $formpagina . "");
            exit;
            
        }
        
    }
else {
        
        $formemail = NULL;
        
    }

    
    // Status checked?
    if (isset($_POST['status'])) {
        
        $formstatus = "inactief";
        
    }
else {
        
        $formstatus = "actief";
        
    }

    
        $SQLUpdateClanlid = "UPDATE gebruikers
                             SET gebruikersnaam='"
. $formgebruikersnaam . "',
                             email = '"
. $formemail . "',
                             role = '"
. $formfunctie . "',
                             status = '"
. $formstatus . "'
                             WHERE id='"
. $formuserid . "'
                            "
;
        if ($conn->query($SQLUpdateClanlid) === FALSE) {
            echo "<div class='error'>MySQL Error 3!! GVD @#$!!!<br/>Raadpleeg een kut beheerder!!</div>";
            exit;
        }
else {
            $_SESSION['user-verwerken-melding'] = "<div class='success'>Clanlid succesvol bijgewerkt.</div>";
            header('Location: ' . $formpagina . '');
            exit;
        }

?>



Ik heb zowel $formemail = NULL; als $formemail = "NULL"; geprobeerd.
Gewijzigd op 29/01/2016 17:12:45 door Danny von Gaal
 
PHP hulp

PHP hulp

24/11/2024 11:12:30
 
Ben van Velzen

Ben van Velzen

29/01/2016 17:38:55
Quote Anchor link
NULL kun je alleen zonder quotes inserten, hier moet je dus apart rekening mee houden bij het opbouwen van je query.
 
Thomas van den Heuvel

Thomas van den Heuvel

29/01/2016 19:55:23
Quote Anchor link
Los daarvan.

Als (onder andere) het e-mail adres het identificerend attribuut van een account is mag deze nooit leeg zijn.

En kan deze dus ook nooit NULL zijn.

Tenzij je het probleem hebt dat je om bepaalde redenen (inactieve) accounts wilt bewaren maar er ten hoogste één actief account mag zijn met hetzelfde e-mailadres?

Dan zul je deze restrictie (op database niveau) moeten laten varen en deze programmamatig af moeten dwingen misschien.

In het bovenstaande controleer je daar ook niet op trouwens. Je zou dus theoretisch het e-mailadres van iemand anders kunnen kapen?

Eigenlijk zou je in een ondeelbare actie (transactie) moeten controleren, wanneer je je e-mailadres wijzigt, of het nieuwe adres nog niet in gebruik is door een actieve gebruiker, en anders de hele operatie terugdraaien.
 
Willem vp

Willem vp

29/01/2016 23:57:22
Quote Anchor link
Thomas van den Heuvel op 29/01/2016 19:55:23:
Als (onder andere) het e-mail adres het identificerend attribuut van een account is mag deze nooit leeg zijn.

En kan deze dus ook nooit NULL zijn.

Wat hier denk ik aan de hand is (maar ik ben gezegend met een flinke dosis onwetendheid over dit betreffende script) is dat een gebruiker met zowel zijn userid als zijn email-adres kan inloggen. Dat email-adres hoeft echter niet per se bekend te zijn.

Op zich is dat geen probleem: MySQL staat het toe dat je meerdere null-waardes hebt in een veld waarop een unique index is gedefinieerd.

Dit lijkt in ieder geval consistent te zijn met de SQL-standaard (ik heb SQL-92 en SQL:2011 gecheckt), waarin wordt bepaald dat bij een unique index alleen de non-null waardes worden vergeleken (tenzij het een primary key betreft; in dat geval zijn null-waardes helemaal uit den boze).

Het idee erachter lijkt me dat een vergelijking met een null-waarde altijd een onbekend (null) resultaat heeft. Het is dus niet mogelijk om twee rijen als identiek te beschouwen als ergens in die rij een null-waarde voorkomt.

Het probleem bij dit script is dat in PHP de null-waarde tussen quotes wordt gezet bij het construeren van het SQL-statement, waardoor er een string van wordt gemaakt. En dan krijg je wel te maken met de unique constraint.
 
Danny von Gaal

Danny von Gaal

31/01/2016 15:00:44
Quote Anchor link
Misschien handig voor jullie om te weten:
- Dit is geen inlogscript
- Dit is geen script zodat gebruikers zichzelf kunnen registreren.


Ik heb zelf een database met gebruikers gemaakt, mensen kunnen zichzelf dus niet registreren.
Niet van iedereen heb ik al een e-mailadres gekregen dus van die mensen is het veld leeg en zij kunnen dus ook nog niet inloggen.

Maar met dit script wil ik naast het emailadres ook andere velden kunnen bijwerken van een gebruiker. Wanneer het emailveld leeg is mag dit dus ook niet in de database worden geplaatst maar moet dat NULL blijven.
Zoals ik al zei ik heb het met en zonder "" in de variabele gedaan maar het werkt helaas niet.

Of kan het formemail = "" . NULL . ""; zijn?
 
Ben van Velzen

Ben van Velzen

31/01/2016 15:18:53
Quote Anchor link
Je moet ervoor zorgen dat in de uiteindelijke query formemail = NULL komt te staan, anders werkt het niet. Geen quotes dus. Hoe je dat in je PHP regelt is aan jou, maar het is logisch dat je bij het opbouwen van je query bijvoorbeeld een ternary gebruikt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sql
= ".... formemail = " . ($formemail === null ? 'NULL' : "'" . $formemail . "'")
?>

Of gebruik prepared statements, dan krijg je dit gratis.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

31/01/2016 15:20:02
Quote Anchor link
De formemail kolom moet wel "NULL enabled" zijn. Je kunt dit in phpMyAdmin nakijken en wijzigen.

Dan ziet een update query er als volgt uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
UPDATE tablename SET formemail = NULL WHERE id = 3;
Gewijzigd op 31/01/2016 15:21:07 door Frank Nietbelangrijk
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.