if/else
Wanneer ik de combinatie if/else en header("Location: http://... gebruikt krijg ik dus die welbekende header already sent foutmelding.
Laat eens de code met de header() zien?
Een minder elegante work-around is output buffering inschakelen. Zolang je de output buffer (ob) niet leegt, kun je namelijk nog HTTP-headers toevoegen én headers wijzigen:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
session_start();
// Declareren van sessievariabelen van de vorige pagina
$vraag_nummer_teller = $_SESSION["vraag_nummer_teller"];
// Vraag nummer teller (nodig om te beginnen met vraag 1 uit te lezen uit SQL)
if(empty($_SESSION['vraag_nummer_teller'])) $_SESSION['vraag_nummer_teller'] = 0;
$order = $_SESSION['vraag_nummer_teller']+1;
$_SESSION['vraag_nummer_teller'] = $vraag_nummer_teller;
if($vraag_soort==1)
{
header("Location: http://website.nl/vraagsoort1.php");
}
elseif ($vraag_soort==2)
{
header("Location: http://website.nl/vraagsoort2.php");
}
elseif ($vraag_soort==3)
{
header("Location: http://website.nl/vraagsoort3.php");
}
?>
session_start();
// Declareren van sessievariabelen van de vorige pagina
$vraag_nummer_teller = $_SESSION["vraag_nummer_teller"];
// Vraag nummer teller (nodig om te beginnen met vraag 1 uit te lezen uit SQL)
if(empty($_SESSION['vraag_nummer_teller'])) $_SESSION['vraag_nummer_teller'] = 0;
$order = $_SESSION['vraag_nummer_teller']+1;
$_SESSION['vraag_nummer_teller'] = $vraag_nummer_teller;
if($vraag_soort==1)
{
header("Location: http://website.nl/vraagsoort1.php");
}
elseif ($vraag_soort==2)
{
header("Location: http://website.nl/vraagsoort2.php");
}
elseif ($vraag_soort==3)
{
header("Location: http://website.nl/vraagsoort3.php");
}
?>
Code (php)
Of gestructureerder:
Heel erg bedankt! Met exit werkt het nu wel gelukkig. Alleen heb ik nu hetzelfde probleem op de volgende pagina. Hier wordt de vraag gesteld en moet je die beantwoorden. Na het beantwoorden ga je via header/location weer terug naar script 1. Dit gaat dus niet omdat er al output is (heb ik gegoogled). Moet ik soms deze "vraag script" splitsen in 2 scripts (HTML en PHP)? Functie ob_start werkt helaas niet in dit geval.
Het gaat om output die naar het scherm (de browser) wordt gestuurd. Daarvan is in jouw geval geen sprake.
Zolang jij geen informatie (output) naar de browser stuurt, kun je een header uitvoeren. Een header moet altijd als eerste naar de browser worden gestuurd. Daarna mag pas de "inhoud" (je html, teksten, plaatjes enz.) worden verstuurd.
Gewijzigd op 22/11/2014 16:33:12 door Ozzie PHP
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
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
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<!-- myform.php -->
<form name="my-form" method="POST" action="">
<span>Which do you like better?</span>
<label for="steak">steak</label>
<input type="radio" name="food" id="steak" value="steak" <?php if(isset($food) && $food == 'steak') echo 'checked="checked"';?> />
<label for="lobster">lobster</label>
<input type="radio" name="food" id="lobster" value="lobster" <?php if(isset($food) && $food == 'lobster') echo 'checked="checked"';?> />
<input type="hidden" name="submitted" value="submitted" />
<input type="submit" name="submit" value="submit" />
</form>
<?php
if (isset($_POST['submitted'])) {
$errors = array();
if (isset($_POST['degree'])) {
$degree = $_POST['degree'];
} else {
$errors[] = 'Please select your degree type.';
} else {
// redirect user to another page
header('Location: http://website.nl/eerste_script.php');
exit;
}
}
?>
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<!-- myform.php -->
<form name="my-form" method="POST" action="">
<span>Which do you like better?</span>
<label for="steak">steak</label>
<input type="radio" name="food" id="steak" value="steak" <?php if(isset($food) && $food == 'steak') echo 'checked="checked"';?> />
<label for="lobster">lobster</label>
<input type="radio" name="food" id="lobster" value="lobster" <?php if(isset($food) && $food == 'lobster') echo 'checked="checked"';?> />
<input type="hidden" name="submitted" value="submitted" />
<input type="submit" name="submit" value="submit" />
</form>
<?php
if (isset($_POST['submitted'])) {
$errors = array();
if (isset($_POST['degree'])) {
$degree = $_POST['degree'];
} else {
$errors[] = 'Please select your degree type.';
} else {
// redirect user to another page
header('Location: http://website.nl/eerste_script.php');
exit;
}
}
?>
Gewijzigd op 22/11/2014 17:55:50 door Jac E
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
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
<?php
// bovenaan onder session_start, controleren of er errors zijn
if (isset($_SESSION['errors']) && !empty($_SESSION['errors'])) {
print_r($_SESSION['errors']); // de meldingen moet je zelf even fatsoeneren
$_SESSION['errors'] = null;
}
// ... hier het formulier
if ($_SERVER['REQUEST_METHOD'] === 'POST') { // dit is de juiste manier om te controleren of er gepost is
$errors = array();
if (!isset($_POST['degree'])) {
$errors[] = 'Please select your degree type.';
}
if (!empty($errors)) {
// er is een error
$_SESSION['errors'] = $errors;
header('Location: http://website.nl/huidige_script.php');
} else {
// alles gaat goed, naar eerste script
header('Location: http://website.nl/eerste_script.php');
}
exit;
}
?>
// bovenaan onder session_start, controleren of er errors zijn
if (isset($_SESSION['errors']) && !empty($_SESSION['errors'])) {
print_r($_SESSION['errors']); // de meldingen moet je zelf even fatsoeneren
$_SESSION['errors'] = null;
}
// ... hier het formulier
if ($_SERVER['REQUEST_METHOD'] === 'POST') { // dit is de juiste manier om te controleren of er gepost is
$errors = array();
if (!isset($_POST['degree'])) {
$errors[] = 'Please select your degree type.';
}
if (!empty($errors)) {
// er is een error
$_SESSION['errors'] = $errors;
header('Location: http://website.nl/huidige_script.php');
} else {
// alles gaat goed, naar eerste script
header('Location: http://website.nl/eerste_script.php');
}
exit;
}
?>
P.S. Ik heb het niet getest, dus er kunnen fouten inzitten.
Gewijzigd op 22/11/2014 18:12:09 door Ozzie PHP
Dat kan niet: HTTP-headers komen voor HTTP-content.
Zoals al eerder gezegd: verplaats die beslissingsregels die in header() eindigen naar een eerder stadium, vóórdat er HTML-content wordt geproduceerd.
Heb nu e.e.a. toegepast op jullie advies, ook die beslissingsregels verplaatst.
Maar helaas... Warning: Cannot modify header information - headers already sent
Wat doe ik fout?
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
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
<?php
session_start();
?>
<?php
// bovenaan onder session_start, controleren of er errors zijn
if (isset($_SESSION['errors']) && !empty($_SESSION['errors'])) {
print_r($_SESSION['errors']); // de meldingen moet je zelf even fatsoeneren
$_SESSION['errors'] = null;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') { // dit is de juiste manier om te controleren of er gepost is
$errors = array();
if (!isset($_POST['degree'])) {
$errors[] = 'Please select your degree type.';
}
if (!empty($errors)) {
// er is een error
$_SESSION['errors'] = $errors;
header('Location: http://website.nl/huidige_script.php');
} else {
// alles gaat goed, naar eerste script
header('Location: http://website.nl/eerste_script.php');
}
exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<!-- myform.php -->
<form name="my-form" method="POST" action="">
<span>Which do you like better?</span>
<label for="steak">steak</label>
<input type="radio" name="food" id="steak" value="steak" <?php if(isset($food) && $food == 'steak') echo 'checked="checked"';?> />
<label for="lobster">lobster</label>
<input type="radio" name="food" id="lobster" value="lobster" <?php if(isset($food) && $food == 'lobster') echo 'checked="checked"';?> />
<input type="hidden" name="submitted" value="submitted" />
<input type="submit" name="submit" value="submit" />
</form>
session_start();
?>
<?php
// bovenaan onder session_start, controleren of er errors zijn
if (isset($_SESSION['errors']) && !empty($_SESSION['errors'])) {
print_r($_SESSION['errors']); // de meldingen moet je zelf even fatsoeneren
$_SESSION['errors'] = null;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') { // dit is de juiste manier om te controleren of er gepost is
$errors = array();
if (!isset($_POST['degree'])) {
$errors[] = 'Please select your degree type.';
}
if (!empty($errors)) {
// er is een error
$_SESSION['errors'] = $errors;
header('Location: http://website.nl/huidige_script.php');
} else {
// alles gaat goed, naar eerste script
header('Location: http://website.nl/eerste_script.php');
}
exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<!-- myform.php -->
<form name="my-form" method="POST" action="">
<span>Which do you like better?</span>
<label for="steak">steak</label>
<input type="radio" name="food" id="steak" value="steak" <?php if(isset($food) && $food == 'steak') echo 'checked="checked"';?> />
<label for="lobster">lobster</label>
<input type="radio" name="food" id="lobster" value="lobster" <?php if(isset($food) && $food == 'lobster') echo 'checked="checked"';?> />
<input type="hidden" name="submitted" value="submitted" />
<input type="submit" name="submit" value="submit" />
</form>
Gewijzigd op 22/11/2014 19:50:16 door Jac E
Ook regel 7 kan een probleem geven.
Klopt... het werkt nu! Bedankt iedereen weer :)
Correct. Dat was in mijn snelle opzetje ook nog niet helemaal correct zie ik nu.
Doe in plaats van dit:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
eens dit...
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
session_start();
// bovenaan onder session_start, controleren of er errors zijn
// ...
?>
session_start();
// bovenaan onder session_start, controleren of er errors zijn
// ...
?>
Het kan zijn dat er witruimte tussen de sluiting- en openingstag zit, en daarnaast is het sluiten en direct openen nutteloos. Je doet een deur dicht, om 'm direct daarna weer open te doen. Dat heeft geen nut.
Gewijzigd op 22/11/2014 20:30:25 door Ozzie PHP
Super, bedankt ook voor je advies! Weer een leermoment geweest...