Wat doet REQUEST_METHOD?
Nu staat er onderaan de pagina met de invoervelden:
Code (php)
Nu vraagt de docent:
Waarom test u op if($_SERVER['REQUEST_METHOD'] == 'POST') in invoer.php?
Mijn antwoord was dus: Om te controleren of er iets is gepost en vervolgens door te gaan naar de volgende pagina
Op dit forum was ik namelijk ergens dit tegengekomen:
Je controle of een formulier verzonden is, doe je met if($_SERVER['REQUEST_METHOD'] == 'POST')
De reactie van de docent weer:
Dat doet REQUEST_METHOD niet. Dat levert andere informatie op, niet wat u
denkt. Vervolgens verwijst hij naar de help van PHP.
Maar ik weet dus niet waar ik het zoeken moet, kom geen stap verder. Kan iemand uitleggen wat het dan wel doet?
Als de pagina aangeroepen wordt met een POST request mag je er 99.9999999% zeker van zijn dat dat komt omdat het formulier is ingevuld.
Waarschijnlijk gaat jouw docent klagen over dat je 'isset($_POST['submit'])' moet gaan gebruiken. Laat hem dan maar lekker praten, dat is de oude en verkeerde methode.
Code (php)
Of staat er nog iets tussen? Nu controleer je inderdaad of er iets gepost wordt, maar als dat zo is wordt je direct doorgestuurd naar de gastenboek pagina...
De REQUEST_METHOD geeft terug op welke manier de pagina is aangeroepen. Indien er een formulier is verzonden / gepost dan is de waarde van REQUEST_METHOD gelijk aan "POST". Op deze manier weet je dus dat er een formulier is verzonden. Vervolgens ga je dan de invoervelden controleren.
Marianne M op 14/01/2013 17:45:27:
Ik neem aan dat je bovenaan de pagina bedoeld, anders zou het script niet werken (headers already sent)
• Je PHP-scriptblok met header() staat "onderaan de pagina met invoervelden"? Dan gaat het niet werken omdat je éérst de HTTP-headers moet verzenden, daarna pas de (X)HTML-code.
• Strikt genomen is HTTP niet hoofdlettergevoelig. Het mag dus bijvoorbeeld 'post' zijn in plaats van 'POST'.
• De HTTP-header Location moet een volledige, absolute URL bevatten, geen relatieve URL.
Wouter J op 14/01/2013 17:49:27:
Waarschijnlijk gaat jouw docent klagen over dat je 'isset($_POST['submit'])' moet gaan gebruiken. Laat hem dan maar lekker praten, dat is de oude en verkeerde methode.
Ozzie PHP op 14/01/2013 17:57:13:
Op deze manier weet je dus dat er een formulier is verzonden. Vervolgens ga je dan de invoervelden controleren.
Nou ja, enige nuance (of verdere uitleg) is denk ik wel op zijn plaats. Jullie reacties lezend zou ik tot de conclusie kunnen komen dat met alleen de check op de request method je kan weten of je formulier is verstuurd. Strikt genomen is dat natuurlijk niet waar. Je weet dan alleen dat er een post request is gedaan, niet waarvandaan en niet of het form dat je verwacht wel is verstuurd. Additionele checks blijven dus altijd nodig. Checken op de submit button heeft dan geen zin meer (want dit gaat niet altijd mee), maar je moet nog wel altijd checken of al je formuliervelden zijn meegegaan zoals je verwacht. Ik gok dat die docent daar op doelt.
Erwin H op 14/01/2013 18:05:10:
Jullie reacties lezend zou ik tot de conclusie kunnen komen dat met alleen de check op de request method je kan weten of je formulier is verstuurd. Strikt genomen is dat natuurlijk niet waar. Je weet dan alleen dat er een post request is gedaan, niet waarvandaan en niet of het form dat je verwacht wel is verstuurd. Additionele checks blijven dus altijd nodig. Checken op de submit button heeft dan geen zin meer (want dit gaat niet altijd mee), maar je moet nog wel altijd checken of al je formuliervelden zijn meegegaan zoals je verwacht. Ik gok dat die docent daar op doelt.
Ozzie PHP op 14/01/2013 17:57:13:
... Vervolgens ga je dan de invoervelden controleren.
"Dat levert andere informatie op, niet wat u denkt."
Niet denken maar testen en die "andere informatie" is een PHP-foutmelding.
"Nu vraagt de docent:
Waarom test u op if($_SERVER['REQUEST_METHOD'] == 'POST') in invoer.php?"
"De reactie van de docent weer:
Dat doet REQUEST_METHOD niet. Dat levert andere informatie op..."
de REQUEST_METHOD geeft de methode weer waarmee de pagina wordt aangeroepen.
Is dit correct?
Ozzie PHP op 14/01/2013 17:57:13:
Staat deze code achter elkaar?
Of staat er nog iets tussen? Nu controleer je inderdaad of er iets gepost wordt, maar als dat zo is wordt je direct doorgestuurd naar de gastenboek pagina...
Code (php)
Of staat er nog iets tussen? Nu controleer je inderdaad of er iets gepost wordt, maar als dat zo is wordt je direct doorgestuurd naar de gastenboek pagina...
Staat inderdaad achter elkaar. Het is ook de bedoeling dat je wordt doorgestuurd naar de gastenboek pagina.
Ger van Steenderen op 14/01/2013 18:00:00:
Ik neem aan dat je bovenaan de pagina bedoeld, anders zou het script niet werken (headers already sent)
Staat inderdaad onderaan de pagina en het script werkt gewoon hoor.
Maar ik heb het verplaatst naar boven <html> en dan werkt het ook.
Ward van der Put op 14/01/2013 18:01:59:
De HTTP-header Location moet een volledige, absolute URL bevatten, geen relatieve URL.
Het gastenboek staat niet op een website, maar lokaal. Moet ik er dan nu localhost/ voorzetten? Is nu toch nog niet nodig om een URL mee te geven?
Wat er nu gebeurt, is dat als het formulier wordt verzonden, je wordt doorgestuurd naar de gastenboek pagina. De gegevens in het formulier worden dus niet gecontroleerd en ook niet opgeslagen.
Als ik het goed heb begrepen zal de controle op het invullen verderop in de "lessen" behandeld worden.
Ik maak mijn borst alvast maar nat ;-)
En de gegevens worden wel degelijk opgeslagen in de database, maar dat is weer een heel ander stuk code.
Die heb ik hier niet geplaatst omdat ik dacht dat het niet relevant zou zijn.
Toevoeging op 14/01/2013 18:56:32:
Overigens vreemd dat de docent juist geen opmerkingen heeft over de regel
Heb ik inmiddels wel al veranderd in:
naar aanleiding van reacties op dit forum op een andere vraag over dit gastenboek.
Gewijzigd op 14/01/2013 18:51:36 door Marianne M
Als die 2 dingen na elkaar komt, dan heeft het allemaal niet zoveel nut.
Daarom alvast een stukje wat je verder brengt zodat je de theorie wat beter begrijpt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
//maken een variabele array om evt. fouten op te vangen..
$error = array();
// hier moeten de controles worden gedaan niet netjes, maar even als voorbeeld.
if( trim( $_POST['naam'] ) == '' )
{
$error['naam'] = 'U moet een naam invullen';
}
// geen foutjes? ok inserten in de database
// en dan pas de header plaatsen..
header('Location:gastenboek.php');
// om er zeker van te zijn dat het afsluit
exit();
}
?>
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
//maken een variabele array om evt. fouten op te vangen..
$error = array();
// hier moeten de controles worden gedaan niet netjes, maar even als voorbeeld.
if( trim( $_POST['naam'] ) == '' )
{
$error['naam'] = 'U moet een naam invullen';
}
// geen foutjes? ok inserten in de database
// en dan pas de header plaatsen..
header('Location:gastenboek.php');
// om er zeker van te zijn dat het afsluit
exit();
}
?>
edit typo.
Gewijzigd op 14/01/2013 22:27:39 door Bart V B
moet dat persé?
Ik kan me dat nog herinneren van het stukje Java wat ik voorafgaand aan deze cursus heb gedaan.
Alleen: waarom zou dat nodig zijn?
En ik krijg nu wel een foutmelding:
Parse error: syntax error, unexpected 'exit' (T_EXIT)
Gewijzigd op 14/01/2013 22:20:46 door Marianne M
Dus kan daar niet een zinnig antwoord op geven.
die exit zorgt ervoor dat je script niet meer doorloopt. Maar kan goed zijn dat het qua opbouw anders zal moeten.
kortom laat eens wat meer code zien.
Toevoeging op 14/01/2013 22:25:48:
ik weet niet hoe je script er nu uitziet.
Dus kan daar niet een zinnig antwoord op geven.
die exit zorgt ervoor dat je script niet meer doorloopt. Maar kan goed zijn dat het qua opbouw anders zal moeten.
kortom laat eens wat meer code zien.
Marianne M op 14/01/2013 22:16:45:
Die exit()
moet dat persé?
moet dat persé?
Die is er om er zeker van te zijn dat je script niet verder gaat na de header.
Het schaadt niet, je kunt er alleen baat bij hebben.
In ieder geval allen bedankt voor het meedenken en de aanwijzingen.
Marianne M op 15/01/2013 14:17:35:
het script stopt toch vanzelf als je doorgaat naar een andere pagina?
Nee, dat is net het punt.
De code wordt nog uitgevoerd.
Test maar eens uit met bv. SESSION['teller']++ , onder de header.
Je zal zien dat de ++ wordt uitgevoerd.
-------
Een typisch voorbeeld; bij een verwerking van een formulier
Code (php)
Met behulp van die exit kan je de else weglaten, en hoeft dus niet alles binnen de accolades.
Je weet ook zeker dat de server geen extra energie zal verliezen aan code die nutteloos is in deze toestand.
Code (php)
Ik vind het wel meer gebruiksvriendelijk.
Gewijzigd op 15/01/2013 14:36:30 door Kris Peeters
Want nu krijg ik geen foutmelding meer (behalve als die ... op regel 4 blijven staan) en wel het formulier te zien, maar je wordt niet doorgestuurd naar de volgende pagina en de informatie uit de velden worden niet in de database geplaatst.
Ik zet even de volledige code neer zoals ik hem tot nu toe had:
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
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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<?PHP
if($_SERVER['REQUEST_METHOD'] == 'POST') // er is iets gepost dus kunnen we door naar de volgende pagina
{
header("Location: gastenboek.php");}
?>
<html>
<head>
<title>Gastenboek invoerpagina</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<style>
<!--
a{text-decoration:none}
//-->
</style>
</head>
<body bgcolor="#FFFFFF">
<form method="post">
<br><table width="70%" border="0" cellspacing="0" cellpadding="3" align="center">
<tr>
<td>
<strong>Naam </strong><br>
<input value="" type="text" name="naam">
</td>
</tr>
<tr>
<td>
<strong>Boodschap </strong><br>
<textarea name="boodschap" rows="8" cols="50"></textarea><br>
<input type="submit" value="Verstuur">
</td>
</tr>
</table>
<?php
mysql_connect("localhost","root","");
mysql_select_db("voorbeeld");
if(isset($_POST['naam']) and isset($_POST['boodschap']) and $_POST['naam']!='naam' and $_POST['boodschap']!='boodschap' ) {
$boodschap = $_POST['boodschap'];
$naam = $_POST['naam'];
$datum = date("d-m-Y");
$boodschap = str_replace("\n", "<br>", $boodschap);
$query = "INSERT INTO gastenboek(boodschap, naam , datum) VALUES ('".$boodschap."', '".$naam."', CURDATE())";
$sql=mysql_query($query) or die (mysql_error());
}
?>
</body>
</html>
"http://www.w3.org/TR/html4/loose.dtd">
<?PHP
if($_SERVER['REQUEST_METHOD'] == 'POST') // er is iets gepost dus kunnen we door naar de volgende pagina
{
header("Location: gastenboek.php");}
?>
<html>
<head>
<title>Gastenboek invoerpagina</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<style>
<!--
a{text-decoration:none}
//-->
</style>
</head>
<body bgcolor="#FFFFFF">
<form method="post">
<br><table width="70%" border="0" cellspacing="0" cellpadding="3" align="center">
<tr>
<td>
<strong>Naam </strong><br>
<input value="" type="text" name="naam">
</td>
</tr>
<tr>
<td>
<strong>Boodschap </strong><br>
<textarea name="boodschap" rows="8" cols="50"></textarea><br>
<input type="submit" value="Verstuur">
</td>
</tr>
</table>
<?php
mysql_connect("localhost","root","");
mysql_select_db("voorbeeld");
if(isset($_POST['naam']) and isset($_POST['boodschap']) and $_POST['naam']!='naam' and $_POST['boodschap']!='boodschap' ) {
$boodschap = $_POST['boodschap'];
$naam = $_POST['naam'];
$datum = date("d-m-Y");
$boodschap = str_replace("\n", "<br>", $boodschap);
$query = "INSERT INTO gastenboek(boodschap, naam , datum) VALUES ('".$boodschap."', '".$naam."', CURDATE())";
$sql=mysql_query($query) or die (mysql_error());
}
?>
</body>
</html>
Dus niet:
Code (php)
Maar:
- eerst kijken of er een request post is
- dan controles doen
- query uitvoeren
- naar andere pagina.
Even in code met jou opzet:
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
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
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST') //gaan we controles doen, en inserten, dan pas naar volgende pagina..
{
if(isset($_POST['naam']) and isset($_POST['boodschap']) and $_POST['naam']!='naam' and $_POST['boodschap']!='boodschap' )
{
//connecten met database
mysql_connect("localhost","root","");
mysql_select_db("voorbeeld");
// query string maken
$query = "INSERT INTO gastenboek(boodschap, naam , datum) VALUES ('".mysql_real_escape_string($_POST['boodschap'])."',
'".mysql_real_escape_string($_POST['naam'])."',
CURDATE())";
// query uitvoeren
$result = mysql_query($query);
// iets fout? debuggen
if($result === false)
{
echo '<pre>';
echo $query;
echo '</pre>';
mysql_error();
}
else
{
// nu pas naar andere pagina..
header("Location: gastenboek.php");
exit();
}
}
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Gastenboek invoerpagina</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<style>
<!--
a{text-decoration:none}
//-->
</style>
</head>
<body bgcolor="#FFFFFF">
<form method="post">
<br><table width="70%" border="0" cellspacing="0" cellpadding="3" align="center">
<tr>
<td>
<strong>Naam </strong><br>
<input value="" type="text" name="naam">
</td>
</tr>
<tr>
<td>
<strong>Boodschap </strong><br>
<textarea name="boodschap" rows="8" cols="50"></textarea><br>
<input type="submit" value="Verstuur">
</td>
</tr>
</table>
</body>
</html>
if($_SERVER['REQUEST_METHOD'] == 'POST') //gaan we controles doen, en inserten, dan pas naar volgende pagina..
{
if(isset($_POST['naam']) and isset($_POST['boodschap']) and $_POST['naam']!='naam' and $_POST['boodschap']!='boodschap' )
{
//connecten met database
mysql_connect("localhost","root","");
mysql_select_db("voorbeeld");
// query string maken
$query = "INSERT INTO gastenboek(boodschap, naam , datum) VALUES ('".mysql_real_escape_string($_POST['boodschap'])."',
'".mysql_real_escape_string($_POST['naam'])."',
CURDATE())";
// query uitvoeren
$result = mysql_query($query);
// iets fout? debuggen
if($result === false)
{
echo '<pre>';
echo $query;
echo '</pre>';
mysql_error();
}
else
{
// nu pas naar andere pagina..
header("Location: gastenboek.php");
exit();
}
}
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Gastenboek invoerpagina</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<style>
<!--
a{text-decoration:none}
//-->
</style>
</head>
<body bgcolor="#FFFFFF">
<form method="post">
<br><table width="70%" border="0" cellspacing="0" cellpadding="3" align="center">
<tr>
<td>
<strong>Naam </strong><br>
<input value="" type="text" name="naam">
</td>
</tr>
<tr>
<td>
<strong>Boodschap </strong><br>
<textarea name="boodschap" rows="8" cols="50"></textarea><br>
<input type="submit" value="Verstuur">
</td>
</tr>
</table>
</body>
</html>