if/else
Ik ben dagen al aan het zoeken. Ik heb een SQL tabel waarde die 1 t/m 3 kan zijn. Die waarde uitlezen gaat goed. Wat ik wil is dat er een vraag wordt gesteld die afhankelijk is van die waarde. Bijvoorbeeld bij 1 is dat een INPUT TYPE="text" en bij 2 weer een INPUT TYPE="radio" vraag enz.
Wanneer ik de combinatie if/else en header("Location: http://... gebruikt krijg ik dus die welbekende header already sent foutmelding.
Wanneer ik de combinatie if/else en header("Location: http://... gebruikt krijg ik dus die welbekende header already sent foutmelding.
De keer je de logica van de if/else om zodat header() het eerst aan de beurt is.
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:
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:
De vraag wordt dus gesteld op een andere pagina (om het overzichtelijker te maken dacht ik). Als de vraag beantwoord is wordt weer terug gegaan naar dit gedeelte. Dat was dan de bedoeling...
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");
}
?>
Gebruik een exit na elke header() om de redirect onmiddellijk uit te voeren en te voorkomen dat het script verder nog output genereert.
Of gestructureerder:
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.
>> Dit gaat dus niet omdat er al output is (heb ik gegoogled).
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.
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
Dit is mijn test voor die 2e pagina. De bedoeling is dat je iets invoert en dat het script verder gaat naar het eerste script. Ik krijg bij onderstaand voorbeeld de header already sent foutmelding.
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
Als ik het goed zie dan zit er een fout in je if/else vergelijking. Je zet 2x een "else" na elkaar neer. Dat kan niet. Ik weet ook niet wanneer je die redirect wilt uitvoeren. Moet die altijd worden uitgevoerd? Zo ja, dan krijg je zoiets:
P.S. Ik heb het niet getest, dus er kunnen fouten inzitten.
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
Je stuurt eerst HTML uit en voert daarna pas in PHP een redirect uit.
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.
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.
Ik wilde alleen nog een soort beveiliging erin maken dat iemand altijd een keuze moet maken (dus een antwoord moet geven). Hiernaar dus weer naar dat eerste script weer terug.
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?
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
Na regel 3 staat een 'enter', dat kan al funest zijn.
Ook regel 7 kan een probleem geven.
Ook regel 7 kan een probleem geven.
Klopt... het werkt nu! Bedankt iedereen weer :)
>> Zoals al eerder gezegd: verplaats die beslissingsregels die in header() eindigen naar een eerder stadium, vóórdat er HTML-content wordt geproduceerd.
Correct. Dat was in mijn snelle opzetje ook nog niet helemaal correct zie ik nu.
Doe in plaats van dit:
eens dit...
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.
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...




