SQL error, wat gaat er mis?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Furio Scripting

Furio Scripting

18/04/2014 13:28:29
Quote Anchor link
Ik doe het volgende:

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
<?php

if(count($errors) <= 0)
                     {

                    
                        // Update email verzend gegevens in..
                        $query = 'UPDATE emails SET uitnodigings_datum ="'.getHuidigeDateTime().'", laatst_verzonden = 0000-00-00 00:00:00, status="In automatische wachtrij" WHERE klant_id="'.getKlantIdFromKlanten().'" AND domein_id = "'.getCurrentDomeinId().'" AND id= "'.$emailId.'"';  
                        echo $query;
                        $database->query($query);
                    
                    
                     }


?>


Helaas krijg ik de volgende error te zien als ik de query test:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
[SQL] UPDATE emails SET uitnodigings_datum ="2014-04-18 11:26:10", laatst_verzonden = 0000-00-00 00:00:00, status="In automatische wachtrij" WHERE klant_id="50" AND domein_id = "36" AND id= "115"

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '00:00:00, status="In automatische wachtrij" WHERE klant_id="50" AND domein_id = ' at line 1



Ik zou echt niet weten waar het mis gaat....
 
PHP hulp

PHP hulp

16/04/2024 11:50:21
 
Michael -

Michael -

18/04/2014 13:32:12
Quote Anchor link
Ik mis ten eerste al overzichtelijkheid en foutafhandeling, dat zou het al een stuk makkelijker maken.
Als je je query verdeelt over meerdere regels wordt het overzichtelijk en wordt de error nuttiger. Alles op 1 regel en dan een error 'on line 1' heb je weinig aan.
 
Furio Scripting

Furio Scripting

18/04/2014 13:36:52
Quote Anchor link
Michael - op 18/04/2014 13:32:12:
Ik mis ten eerste al overzichtelijkheid en foutafhandeling, dat zou het al een stuk makkelijker maken.
Als je je query verdeelt over meerdere regels wordt het overzichtelijk en wordt de error nuttiger. Alles op 1 regel en dan een error 'on line 1' heb je weinig aan.


Het gaat mis bij de: 0000-00-00 00:00:00, ik heb dit nu tussen qoutes gezet en het werkt weer prima! Bedankt voor de tip over het opbreken in ieder geval!
 
Michael -

Michael -

18/04/2014 13:37:04
Quote Anchor link
Wat krijg je als je het zo doet?

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
<?php
if(count($errors) < 1) {

    // Update email verzend gegevens in..
    $query = "
        UPDATE
            emails
        SET
            uitnodigings_datum ='"
.getHuidigeDateTime()."',
            laatst_verzonden = '0000-00-00 00:00:00',
            status='In automatische wachtrij'
        WHERE
            klant_id='"
.getKlantIdFromKlanten()."'
        AND
            domein_id = '"
.getCurrentDomeinId()."'
        AND
            id= '"
.$emailId."'";  

    $res = $database->query($query);

    if($res)
    {

        if($database->affected_rows > 0)
        {

            echo 'Geupdate';
        }

        else
        {
            echo 'Niks geupdate';
        }

    }

    else
    {
        echo $database->error;
    }
}

?>


edit: Ah was al opgelost. Succes!
Gewijzigd op 18/04/2014 13:40:33 door Michael -
 
Ivo P

Ivo P

18/04/2014 13:43:14
Quote Anchor link
'0000-00-00' is niet echt een geldige datum.

Gebruikelijk in databases is om in het geval "onbekend"/ "niet bestaand" NULL op te slaan:

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
<?php
$query
= "
        UPDATE
            emails
        SET
            uitnodigings_datum ='"
.getHuidigeDateTime()."',
            laatst_verzonden = NULL,
            status='In automatische wachtrij'
        WHERE
            klant_id='"
.getKlantIdFromKlanten()."'
        AND
            domein_id = '"
.getCurrentDomeinId()."'
        AND
            id= '"
.$emailId."'";  
?>


En ben je er 100% zeker van dat er niet met $emailId geknoeid kan zijn?
Anders mysql_real_escape_string() er op loslaten
 
Michael -

Michael -

22/04/2014 11:43:56
Quote Anchor link
>> '0000-00-00' is niet echt een geldige datum.
>> Gebruikelijk in databases is om in het geval "onbekend"/ "niet bestaand" NULL op te slaan:

Ivo, ik ben benieuwd hoe jij er anderen dit dan op de 'goede manier' oplossen.

Als ik namelijk iets anders dan een geldig datum wil opslaan (0000-00-00 of null) geeft PDO een foutmelding:
Integrity constraint violation: 1048 Column 'geboortedatum' cannot be null

$stmt->bindParam(':geboortedatum', $_POST['gegevens']['gebdatum'], PDO::PARAM_STR);

Controleer je dan van te voren of de datum geldig is en voer je het dan pas in?
 
Ivo P

Ivo P

22/04/2014 11:50:13
Quote Anchor link
'geboortedatum' cannot be null

Dat heb je dus zelf afgedwongen. Maar als het niet leeg mag zijn, is het wat raar om vervolgens wel toe te staan om onzin op te slaan. (0000-00-00 is een onzin-datum).

Ik zou inderdaad vooraf controleren wat voor invoer er binnenkomt, en ingeval van "geen datum", zou ik ofwel de user vragen een goede geboortedatum op te geven, ofwel er null van maken.
In geval van geboortedatum zou je zelf kunnen gaan voor "moet wel een datum in het verleden zijn" en als het om levende mensen gaat: dat de datum niet meer dan een redelijk aantal jaar in het velden mag liggen. Zeg een jaar of 115.
 
Michael -

Michael -

22/04/2014 11:59:07
Quote Anchor link
Nee 't is niet dat ik perse 0000-00-00 wil opslaan, maar dan null.
Maar ik begrijp dat het meer een instelling van de tabel is, waarbij default NULL moet worden gezet.
Nou wordt er inderdaad wel NULL opgeslagen.

Bedankt voor je reactie en de controle tips :)
 



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.