Optioneel datum veld
In mijn database is de standaard waarde van einddatum NULL.
Wanneer ik mijn veld open laat wil ik dus dat de standaard waarde ingevuld wordt. Echter krijg ik de volgende melding steeds:
Quote:
Er is iets mis gegeaan tijdens het invoeren van gegevens in de lidmaatschap database. klik hier om terug te keren en opnieuw te proberen. Incorrect date value: 'NULL' for column 'Datumeinde' at row 1.
De code die ik geschreven heb:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
$einddatum = mysqli_real_escape_string ($connect, trim($_POST['einddatum']));
if (empty($einddatum)){
$einddatumfinal = "NULL";
}else{
$einddatum = explode('-', $_POST['einddatum']);
$einddatumfinal = $einddatum[2].'-'.$einddatum[1].'-'.$einddatum[0];
}
if (empty($einddatum)){
$einddatumfinal = "NULL";
}else{
$einddatum = explode('-', $_POST['einddatum']);
$einddatumfinal = $einddatum[2].'-'.$einddatum[1].'-'.$einddatum[0];
}
Wanneer ik $einddatumfinal = "NULL"; vervang door: $einddatumfinal = NULL; of door: return NULL;
Krijg ik nog steeds een foutmelding over de invoer in de database, waar gaat het fout?
Als je NULL wil invoeren moet dat zonder quotes. Dat zul je dus in het opbouwen van je query moeten opvangen.
Ik had nl in eerste instantie:
Quote:
$einddatumfinal = NULL;
Daarna geprobeerd met:
Quote:
return NULL;
Uiteindelijk geprobeerd met:
Quote:
$einddatumfinal = "NULL";
Omdat de bovenstaande codes ook deze foutmelding gaven. (de quotes heb ik dus als laatste geprobeerd)
Gewijzigd op 25/10/2017 12:32:33 door Ben van Velzen
Code (php)
1
2
3
4
5
2
3
4
5
$lidmaatschapQuery = "INSERT INTO lidmaatschap (
Datumeinde) VALUES
('$einddatumfinal')";
$lidmaatschapResult = mysqli_query($connect, $lidmaatschapQuery) or die( "Er is iets mis gegeaan tijdens het invoeren van gegevens in de lidmaatschap database. <a href=index.php>klik hier</a> om terug te keren en opnieuw te proberen." . " " . mysqli_error($connect).".");
Datumeinde) VALUES
('$einddatumfinal')";
$lidmaatschapResult = mysqli_query($connect, $lidmaatschapQuery) or die( "Er is iets mis gegeaan tijdens het invoeren van gegevens in de lidmaatschap database. <a href=index.php>klik hier</a> om terug te keren en opnieuw te proberen." . " " . mysqli_error($connect).".");
Quote:
Incorrect date value: '' for column 'Datumeinde' at row 1.
Zie regel 3. Daar gaat het mis, omdat daar quotes altijd in de query gezet worden. Als je NULL wilt invoeren moet dat zonder quotes, dus zul je ze daar afhankelijk van de situatie wel of niet neer moeten zetten.
En als je iets expliciet wilt vergelijken met NULL moet dit met IS NULL, en niet met = NULL.
Daar heb ik een zelfde soort constructie en als dat niks wordt ingevuld werkt het wel.
Een tekstveld kan wel een lege string zijn (dat is tenslotte ook tekst), maar een datumveld niet (dat is tenslotte *geen* datum). Daarom moet je bij een datumveld expliciet null gebruiken, en kom je bij een tekstveld met "" weg.
Zeg ik het dan goed dat als ik er If empty
$einddatumfinal = 0000-00-00;
Etc.
Van maak dat het opgelost is?!
Je probleem is dan inderdaad opgelost. Persoonlijk vind ik "0000-00-00" echter een draak. Eigenlijk bedoel je "niets", maar dat is even een beetje moeilijk, dus dan maar zo'n niet bestaande datum als 0000-00-00. Een flink aantal PHP functies struikelen hierover (ivm ongeldig jaartal/maand/dag). Je moet dus altijd kijken of het om een "echte" datum gaat, of om zo'n bosje nullen. Als je d'r null van maakt is het eenvoudiger: iets = datum, niets = geen datum.
Een beetje goed geconfigureerde MySQL of MariaDB weigert dit soort datums ook. Gebruik gewoon NULL wanneer je NULL bedoelt, maar wel op de juiste manier.
Quote:
Incorrect date value: '0000-00-00' for column 'Datumeinde' at row 1
Dat werkt dus ook niet zoals ik wil, waar ga ik de fout in?
Wanneer ik de NULL oplossing wil gebruiken moet ik dus een query maken voor wanneer er geen datum is ingevuld, en een query voor wanneer er wel een datum is ingevuld. Klopt dit?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$einddatum = trim($_POST['einddatum']);
if (empty($einddatum)){
$einddatumfinal = "NULL";
}else{
$einddatum = explode('-', $_POST['einddatum']);
$einddatumfinal = "'" . mysqli_real_escape_string($connect, $einddatum[2].'-'.$einddatum[1].'-'.$einddatum[0]) . "'";
}
$lidmaatschapQuery = "INSERT INTO lidmaatschap (
Datumeinde) VALUES
(" . $einddatumfinal . ")";
$lidmaatschapResult = mysqli_query($connect, $lidmaatschapQuery) or die( "Er is iets mis gegeaan tijdens het invoeren van gegevens in de lidmaatschap database. <a href=index.php>klik hier</a> om terug te keren en opnieuw te proberen." . " " . mysqli_error($connect).".");
?>
$einddatum = trim($_POST['einddatum']);
if (empty($einddatum)){
$einddatumfinal = "NULL";
}else{
$einddatum = explode('-', $_POST['einddatum']);
$einddatumfinal = "'" . mysqli_real_escape_string($connect, $einddatum[2].'-'.$einddatum[1].'-'.$einddatum[0]) . "'";
}
$lidmaatschapQuery = "INSERT INTO lidmaatschap (
Datumeinde) VALUES
(" . $einddatumfinal . ")";
$lidmaatschapResult = mysqli_query($connect, $lidmaatschapQuery) or die( "Er is iets mis gegeaan tijdens het invoeren van gegevens in de lidmaatschap database. <a href=index.php>klik hier</a> om terug te keren en opnieuw te proberen." . " " . mysqli_error($connect).".");
?>
Je kan meteen zien dat een aantal zaken in de code zijn gewijzigd, en de escaping nu ook meteen correct is.
Gewijzigd op 26/10/2017 16:32:27 door Ben van Velzen
prepared statements bieden mogelijk uitkomst als je null als waarde gebruikt en niet "NULL" als string. Then again, ik heb geen idee of mysqli daar slim genoeg voor is.
Ben van Velzen op 26/10/2017 16:31:12:
Wat je zou kunnen doen is iets als volgt:
Je kan meteen zien dat een aantal zaken in de code zijn gewijzigd, en de escaping nu ook meteen correct is.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$einddatum = trim($_POST['einddatum']);
if (empty($einddatum)){
$einddatumfinal = "NULL";
}else{
$einddatum = explode('-', $_POST['einddatum']);
$einddatumfinal = "'" . mysqli_real_escape_string($connect, $einddatum[2].'-'.$einddatum[1].'-'.$einddatum[0]) . "'";
}
$lidmaatschapQuery = "INSERT INTO lidmaatschap (
Datumeinde) VALUES
(" . $einddatumfinal . ")";
$lidmaatschapResult = mysqli_query($connect, $lidmaatschapQuery) or die( "Er is iets mis gegeaan tijdens het invoeren van gegevens in de lidmaatschap database. <a href=index.php>klik hier</a> om terug te keren en opnieuw te proberen." . " " . mysqli_error($connect).".");
?>
$einddatum = trim($_POST['einddatum']);
if (empty($einddatum)){
$einddatumfinal = "NULL";
}else{
$einddatum = explode('-', $_POST['einddatum']);
$einddatumfinal = "'" . mysqli_real_escape_string($connect, $einddatum[2].'-'.$einddatum[1].'-'.$einddatum[0]) . "'";
}
$lidmaatschapQuery = "INSERT INTO lidmaatschap (
Datumeinde) VALUES
(" . $einddatumfinal . ")";
$lidmaatschapResult = mysqli_query($connect, $lidmaatschapQuery) or die( "Er is iets mis gegeaan tijdens het invoeren van gegevens in de lidmaatschap database. <a href=index.php>klik hier</a> om terug te keren en opnieuw te proberen." . " " . mysqli_error($connect).".");
?>
Je kan meteen zien dat een aantal zaken in de code zijn gewijzigd, en de escaping nu ook meteen correct is.
Ik zie dat dit goed werkt, echter heb ik na het einddatum veld nog een aantal velden staan waaronder een met een dropdown menu. Door de punten er voor en erachter te zetten bij einddatumfinal bij de query neem ik aan dat ik daardoor een volgende foutmelding krijg. (excuses voor de vele vragen, echter ben ik net begonnen met een opleiding php. Hier krijg ik helaas niet genoeg informatie. Het statements gedeelte heb ik nog niet gehad in de opleiding en begrijp ik ook nog niet helemaal, vandaar dat ik de bovenstaande oplossing graag wil gebruiken voor nu.)
Deze situatie werkt correct voor de datum, andere velden kun je hier doodeenvoudig in verwerken. Als je iets concreets hebt dat fouten oplevert kun je die code gewoon posten.
Gewijzigd op 27/10/2017 11:35:17 door Michel Bak
krijg ik een foutmelding:
Quote:
Incorrect date value: '09-02-2000' for column 'Einddatum' at row 1.
Hoe los ik dit op?
Daarnaast wil ik dat wanneer de gebruiker dit doet deze een melding krijgt om het op te lossen.
Ik heb bij verschillende velden een opzet waarbij het wel werkt en de gebruiker een melding krijgt alleen bij deze datum lijkt het niet te werken. Ook staan er controle velden onder deze controle maar deze fout krijg ik pas te zien NA de controles onder deze?
Gewijzigd op 21/11/2017 11:24:27 door Michel Bak