formulieren
Ik krijg de volgende foutmelding:
Warning: checkdate() expects parameter 1 to be long, string given in C:\xampp\htdocs\phpblad\verwerk2.php on line 49
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\phpblad\verwerk2.php:2) in C:\xampp\htdocs\phpblad\verwerk2.php on line 70
Dit is geen geldige datum
Nu zie ik in het werkend voorbeeld op de site dat daar gebruik is gemaakt van handmatig invoeren van datum onderdelen. Niet zo handig, denk ik dan.
Hoe kom ik nu verder?
http://www.php.net/checkdate
Die functie vereist dus dat de datumonderdelen apart als integer opgegeven worden. Hoe kom je verder? Door te zorgen dat je de datum onderdelen in aparte variabelen hebt. Bijvoorbeeld:
Zie: Die functie vereist dus dat de datumonderdelen apart als integer opgegeven worden. Hoe kom je verder? Door te zorgen dat je de datum onderdelen in aparte variabelen hebt. Bijvoorbeeld:
De functie checkdate() verwacht getallen en jij geeft tekst (string).
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\phpblad\verwerk2.php:2) in C:\xampp\htdocs\phpblad\verwerk2.php on line 70
Dit is geen geldige datum
Bovenstaande foutmelding blijf ik ontvangen.
Ik ben een super beginner en weet niet wat ik in de listning moet veranderen om een goede uitkomst te krijgen.
Hierbij de listning van verwerk2.php zoals die in de tutorial staat:
Code (php)
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?php
//Controle of formulier gepost is
if($_SERVER['REQUEST_METHOD']=='POST')
{
// arrays declareren voor opslag van fouten en data
$aErrors = array();
$aData = array();
// velden die in het formulier aanwezig moeten zijn
$aformulierVelden = array
(
'voornaam',
'achternaam',
'dag',
'maand',
'jaar'
);
// Alle formuliervelden doorlopen
foreach($aformulierVelden as $sVeld)
{
// Controleren of er een waarde voor het formulier bestaat
if(isset($_POST[$sVeld]))
{
//Spaties aan begin en eind weghalen
$sValue=trim($_POST[$sVeld]);
// Controleren of variabele gevuld is
//if(empty($sValue))
if($sValue=='')
{
// Foutmelding toevoegen
$aErrors[] = 'Je bent vergeten om ' .$sVeld. ' in te vullen';
}
// ingevulde waarden aan array toevoegen
$aData[$sVeld] = $sValue;
}
else
{
$aErrors[] = 'Het veld'.$sVeld.' is niet gepost!';
}
}
if(isset($aData['maand'],$aData['dag'],$aData['jaar'])&& checkdate(
$aData['maand'],$aData['dag'],$aData['jaar']))
{
$sDatum=$aData['dag'].'-'.$aData['maand'].'-'.$aData['jaar'];
}
else
{
$aErrors[]='Dit is geen geldige datum';
}
//Controleren of er geen fouten opgetreden zijn
if(empty($aErrors))
{
//Formulier succes
echo ' Je hebt het formulier goed ingevuld.<br /> De volgende gegevens zijn bekend: <br /> ';
echo ' Voornaam : '.$aData['voornaam'].'<br />';
echo 'Achternaam : '.$aData['achternaam'] ;
echo 'Geboortedatum: '.$sDatum;
}
else
{
// Fouten opgetreden; weergeven en terug naar formulier
header('Refresh: 3; url=form2.php');
foreach($aErrors as $sError)
{
echo '<p style="color:red">'.$sError.'</p>';
}
}
}
else
{
//Verwerk.php mag niet bezocht worden
header('Location: form2.php');
}
?>
//Controle of formulier gepost is
if($_SERVER['REQUEST_METHOD']=='POST')
{
// arrays declareren voor opslag van fouten en data
$aErrors = array();
$aData = array();
// velden die in het formulier aanwezig moeten zijn
$aformulierVelden = array
(
'voornaam',
'achternaam',
'dag',
'maand',
'jaar'
);
// Alle formuliervelden doorlopen
foreach($aformulierVelden as $sVeld)
{
// Controleren of er een waarde voor het formulier bestaat
if(isset($_POST[$sVeld]))
{
//Spaties aan begin en eind weghalen
$sValue=trim($_POST[$sVeld]);
// Controleren of variabele gevuld is
//if(empty($sValue))
if($sValue=='')
{
// Foutmelding toevoegen
$aErrors[] = 'Je bent vergeten om ' .$sVeld. ' in te vullen';
}
// ingevulde waarden aan array toevoegen
$aData[$sVeld] = $sValue;
}
else
{
$aErrors[] = 'Het veld'.$sVeld.' is niet gepost!';
}
}
if(isset($aData['maand'],$aData['dag'],$aData['jaar'])&& checkdate(
$aData['maand'],$aData['dag'],$aData['jaar']))
{
$sDatum=$aData['dag'].'-'.$aData['maand'].'-'.$aData['jaar'];
}
else
{
$aErrors[]='Dit is geen geldige datum';
}
//Controleren of er geen fouten opgetreden zijn
if(empty($aErrors))
{
//Formulier succes
echo ' Je hebt het formulier goed ingevuld.<br /> De volgende gegevens zijn bekend: <br /> ';
echo ' Voornaam : '.$aData['voornaam'].'<br />';
echo 'Achternaam : '.$aData['achternaam'] ;
echo 'Geboortedatum: '.$sDatum;
}
else
{
// Fouten opgetreden; weergeven en terug naar formulier
header('Refresh: 3; url=form2.php');
foreach($aErrors as $sError)
{
echo '<p style="color:red">'.$sError.'</p>';
}
}
}
else
{
//Verwerk.php mag niet bezocht worden
header('Location: form2.php');
}
?>
Wat krijg je dan te zien?
Er verschijnt niets.
Ik heb het een beetje gehad met dit voorbeeld.
Er zaten(zitten) een aantal fouten in waarvan ik er al een aantal heb hersteld maar voor een beginner is het (nog) onmogelijk om alles op een rijtje te krijgen. Zoals eerder gezegd gebruik de maker van deze tutorial een andere aanpak in het "werkend voorbeeld" Dat zegt, volgens mij genoeg. Overigens houd ik me toch aanbevolen als je toch een oplossing hebt(zie eerdere listning).
Verder hartelijk dank voor je inspanning tot nog toe.
Walter
Toevoeging op 12/03/2011 12:20:12:
Blanche,
Ik heb inmiddels begrepen dat jij de auteur van de tutorial"PHP voor beginners" bent.
Van deze tutorial ben ik bezig Formulieren te begrijpen en uit te werken.
Nu blijkt dat daar fouten in staan. Dat is erg frustrerend voor een beginneling (van 74).
Kan jij me een verbeterde versie bezorgen zodat ik met de tutorial verder kan?
Bij voorbaat dank.
Walter Vorst
ps
Tot nog toe werkten alle voorbeelden en was ik erg blij met deze uitleg.
Ik ben niet op de hoogte van het feit dat er fouten in die handleiding zouden staan waardoor bijvoorbeeld voorbeelden niet zouden werken. Waar basseer je op dat er fouten in staan? Weet je zeker dat je zelf geen fout maakt bij het uitproberen/overnemen van de voorbeelden?
bv. deze regel: {
echo '<option value="'.$i.'">'.$i.'</option>';
}
Al die aanhaalteken om $i
Dat werkt niet.
Oók de header aanroep geeft foutmeldingen. Ik ben nog niet zover dat ik dat begrijp.
Het gaat goed tot de invoer van voornaam en achternaam en de datum-delen in <select>
Daarna ben ik het spoor bijster.
Ik heb de listning tig keer nagekeken en moet hetzelfde zijn als in de tutorial.Ik heb zelfs de listning uit de tutorial gekopieerd en geplakt.
Alles wat ik ook probeer geeft maximaal de foutmeldingen zoals eerder boven vernoemd.
Het klinkt misschien wat hautain maar is niet zo bedoeld: heb je hemzelf al uitgeprobeerd??
En waarom heb je dan in het werkend voorbeeld een andere( volgens eigen zeggen) véél omslachtiger manier gebruikt?
Ik hoop uiteindelijk toch de juiste weg te kunnen vinden.
Groet,
Walter
Walter Vorst op 12/03/2011 13:47:15:
bv. deze regel: {
echo '<option value="'.$i.'">'.$i.'</option>';
}
Al die aanhaalteken om $i
Dat werkt niet.
echo '<option value="'.$i.'">'.$i.'</option>';
}
Al die aanhaalteken om $i
Dat werkt niet.
Waarom werkt dat niet? Volgens mij is dat de enige juiste methode. Let wel op de juiste hoeveelheid en volgorde van de " en '.
Walter Vorst op 12/03/2011 13:47:15:
Oók de header aanroep geeft foutmeldingen.
Je doelt op de melding 'already sent'? Dat is een gevolg van eerdere foutmelding(en) die word(en) weergegeven. Als de foutmelding(en) is/zijn opgelost, zal die header gewoon werken.
edit:
Heb de bovenstaande code gekopieerd en een formuliertje gemaakt.
De foutmelding volgt als er geen datum is ingevoerd. Dan zal niet alleen 'Dit is geen geldige datum' maar ook iets van 'Je bent vergeten om dag in te vullen
Je bent vergeten om maand in te vullen
Je bent vergeten om jaar in te vullen' verschijnen. Dat je dan geen foutmelding moet krijgen ivm de headers sent, is meer een schoonheidsfoutje.
Code werkt dus.
Gewijzigd op 12/03/2011 14:06:32 door Obelix Idefix
deze pagina onder het kopje 'Uitbreiden van het formulier' bedoelt?
En zoals Jasper ook al zegt, met het gebruik van de quotes in de regel code die je geeft, is niets mis...
Alle voorbeelden zijn uiteraard getest, en ik heb betreffend stukje code nogmaals getest. Bij mij levert het geen probleem op. Ik neem aan dat je het stukje code op En zoals Jasper ook al zegt, met het gebruik van de quotes in de regel code die je geeft, is niets mis...
Gewijzigd op 12/03/2011 13:56:56 door Joren de Wit
Als dit in kleuren kon worden weergegeven dan zag je een hoog rood hoofd verschijnen.
IK ben nog eens gaan uitproberen en weet nu niet wat ik veranderd heb maar EUREKA!! het werkt.
In ieder geval stonden de quotes om $i inderdaad verkeerd ( was dit het probleem?)
Gelukkig heb ik nog een print van de listning van vóór de verandering, dus ga ik nog maar ens goed zoeken wat ik verder nog verkeerd ingetypt heb.
REST MIJ HEEL DUIDELIJK MIJN WELGEMEENDE EXCUSES AAN TE BIEDEN VOOR DE OPMERKINGEN DIE IK GEDAAN HEB.
Toevoeging op 12/03/2011 14:20:06:
Beste Blanche,
Als dit in kleuren kon worden weergegeven dan zag je een hoog rood hoofd verschijnen.
IK ben nog eens gaan uitproberen en weet nu niet wat ik veranderd heb maar EUREKA!! het werkt.
In ieder geval stonden de quotes om $i inderdaad verkeerd ( was dit het probleem?)
Gelukkig heb ik nog een print van de listning van vóór de verandering, dus ga ik nog maar ens goed zoeken wat ik verder nog verkeerd ingetypt heb.
REST MIJ HEEL DUIDELIJK MIJN WELGEMEENDE EXCUSES AAN TE BIEDEN VOOR DE OPMERKINGEN DIE IK GEDAAN HEB.
Wat betreft die quotes: ja de volgorde maakt wel degelijk uit. De enkele quotes in dat stukje worden gebruikt om de strings binnen PHP te openen en af te sluiten, terwijl de dubbele quotes nodig zijn om e.e.a. in HTML correct weer te geven. Tip: kijk ook eens naar de HTML broncode die je script output, daarin zie je wél de dubbele quotes terug maar niet de enkele ;-)
Ik ben nog even met de listnings aan het vogelen geweest.
Ik weet achteraf niet meer wat ik veranderd heb maar EUREKA het werkt!!!
In ieder geval stonden de quotes om $i verkeerd ( was dat soms de fout?)
Verder zat er een foutje in het formulier zelf, Ik ben blij dat alles nu goed gaat en ga me verder verdiepen. Rest mij nog een welgemeend excuus aan te bieden voor de (valse) opmerkingen die ik heb gemaakt.
Ik hoop dat je dat accepteert.
Ik ga, met een opgelucht hart, verder aan de tutorial.
( Toch weer véél geleerd van dit probleem!)
Dank,
Walter Vorst
Haha, je bent zo blij dat je (ongeveer) hetzelfde bericht 3x post? Dat is natuurlijk niet nodig, maar ik neem aan dat het per ongeluk ging? :-)
fouten zijn er om van te leren
Daar gaat het mij allemaal om.
Bedankt voor je reactie.
Blanche,
Niet zozeer blij, alhoewel!!, maar even een verkeerde toets aangeraakt, met dit resultaat.
Toch nog een vraag: Bij eerdere voorbeelden gebruikte je vóór echo de tag <pre></pre>.
Welk doel heeft dit en wanneer gebruik je die?
Walter
Zoals je op de link van Vincent kunt lezen, gebruik ik <pre> bij het echoën van de inhoud van arrays om alles overzichtelijk weer te geven.
En als je dat niet wilt gebruiken, kan je naar de broncode gaan daar wordt het ook met een pre weergegeven (firefox, chrome doen dit iig)
Happy Walter