Bericht: Cannot modify header information - headers already sent by
Er is een fout opgetreden:
- Foutnummer: 2
- Bericht: Cannot modify header information - headers already sent by (SalonGrip/includes/header.php:12)
- Bestand: SalonGrip/register.php
- Regellijn: 86
- Tijd: 2025-01-29 21:16:50
Er is niets veranderd aan de header pagina en bovenstaande foutmelding krijg ik alleen, na het invullen van het registratieformulier.
Wat ik al heb gecontroleerd aan de registratie pagina:
Er is geen witte en/of spatie ruimte ergens die ik kan vinden.
Er wordt geen output gestuurd voor de functie header
Ik heb dus geen idee waar ik het moet nog gaan zoeken en hopelijk hebben jullie nog tips voor mij!
Voor de volledigheid, zie hieronder de code van registratiepagina:
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
87
88
89
90
91
92
93
94
95
96
97
98
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
87
88
89
90
91
92
93
94
95
96
97
98
<?php
/*ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);*/
require_once 'includes/config.php'; // Verbind met de database
require_once 'includes/functions.php'; // Importeer functies
require_once 'includes/header.php'; // Voeg de header toe
$message = [];
$success = "";
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Input valideren
$voornaam = sanitizeInput($_POST['voornaam']);
$achternaam = sanitizeInput($_POST['achternaam']);
$email = sanitizeInput($_POST['email']);
$mobiel = sanitizeInput($_POST['mobiel']);
$wachtwoord = $_POST['wachtwoord'];
$bevestig_wachtwoord = $_POST['bevestig_wachtwoord'];
$kapperszaak = sanitizeInput($_POST['kapperszaak']);
$straat = sanitizeInput($_POST['straat']);
$postcode = sanitizeInput($_POST['postcode']);
$plaats = sanitizeInput($_POST['plaats']);
// Controleer of velden ingevuld zijn
if (empty($voornaam) || empty($achternaam) || empty($email) || empty($mobiel) || empty($wachtwoord) || empty($bevestig_wachtwoord) || empty($kapperszaak) || empty($straat) || empty($postcode) || empty($plaats)) {
$message[] = "Alle velden zijn verplicht.";
}
// Controleer wachtwoord op sterkte
$wachtwoordFouten = valideerWachtwoord($wachtwoord);
if (!empty($wachtwoordFouten)) {
$message = array_merge($message, $wachtwoordFouten);
}
// Controleer of wachtwoord en bevestiging overeenkomen
if ($wachtwoord !== $bevestig_wachtwoord) {
$message[] = "Wachtwoorden komen niet overeen.";
}
if (empty($message)) {
// Controleer of e-mail of mobiel nummer al bestaat
$stmt = $mysqli->prepare("SELECT id FROM users WHERE email = ? OR mobielnummer = ?");
$stmt->bind_param("ss", $email, $mobiel);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
$message[] = "E-mailadres of mobiel nummer is al geregistreerd.";
} else {
$stmt->close();
// Controleer of kapperszaak naam al bestaat
$stmt = $mysqli->prepare("SELECT id FROM business WHERE name = ?");
$stmt->bind_param("s", $kapperszaak);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
$message[] = "Kapperszaak naam is al geregistreerd.";
} else {
$stmt->close();
// Genereer wachtwoord-hash
$passwordHash = password_hash($wachtwoord, PASSWORD_BCRYPT);
// Voeg kapperszaak toe aan de database
$volledig_adres = $straat . ", " . $postcode . ", " . $plaats;
$stmt = $mysqli->prepare("INSERT INTO business (name, address) VALUES (?, ?)");
$stmt->bind_param("ss", $kapperszaak, $volledig_adres);
$stmt->execute();
$businessId = $stmt->insert_id; // Haal ID op van de nieuwe kapperszaak
$stmt->close();
// Genereer verificatietoken en stel verificatiestatus in
$verification_token = bin2hex(random_bytes(16));
$verification_status = 0;
// Voeg gebruiker toe aan de database
$status = 'on hold';
$role = 'owner';
$stmt = $mysqli->prepare("INSERT INTO users (voornaam, achternaam, email, mobielnummer, password_hash, role, business_id, status, verification_status, verification_token) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->bind_param("ssssssisis", $voornaam, $achternaam, $email, $mobiel, $passwordHash, $role, $businessId, $status, $verification_status, $verification_token);
if ($stmt->execute()) {
// Verzend verificatiemail
$to = $email;
$subject = 'Bevestig uw e-mailadres';
$message = "Beste $voornaam,\n\nBedankt voor uw registratie. Klik alstublieft op de onderstaande link om uw e-mailadres te bevestigen:\n\n";
$message .= "https://salongrip.nl/verify.php?token=$verification_token\n\n";
$message .= "Met vriendelijke groet,\nSalongrip";
// Stel de headers in
$headers = 'From: info@salongrip.nl' . "\r\n" .
'Reply-To: info@salongrip.nl' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
// Verzend de e-mail
if (mail($to, $subject, $message, $headers)) {
$success = "Registratie succesvol! Controleer uw e-mail om uw registratie te bevestigen.";
} else {
$message[] = "Er is een fout opgetreden bij het verzenden van de verificatiemail.";
}
header("Location: wachtkamer.php");
exit();
} else {
$message[] = "Er is een fout opgetreden bij het registreren van de gebruiker.";
}
$stmt->close();
}
}
}
}
?>
/*ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);*/
require_once 'includes/config.php'; // Verbind met de database
require_once 'includes/functions.php'; // Importeer functies
require_once 'includes/header.php'; // Voeg de header toe
$message = [];
$success = "";
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Input valideren
$voornaam = sanitizeInput($_POST['voornaam']);
$achternaam = sanitizeInput($_POST['achternaam']);
$email = sanitizeInput($_POST['email']);
$mobiel = sanitizeInput($_POST['mobiel']);
$wachtwoord = $_POST['wachtwoord'];
$bevestig_wachtwoord = $_POST['bevestig_wachtwoord'];
$kapperszaak = sanitizeInput($_POST['kapperszaak']);
$straat = sanitizeInput($_POST['straat']);
$postcode = sanitizeInput($_POST['postcode']);
$plaats = sanitizeInput($_POST['plaats']);
// Controleer of velden ingevuld zijn
if (empty($voornaam) || empty($achternaam) || empty($email) || empty($mobiel) || empty($wachtwoord) || empty($bevestig_wachtwoord) || empty($kapperszaak) || empty($straat) || empty($postcode) || empty($plaats)) {
$message[] = "Alle velden zijn verplicht.";
}
// Controleer wachtwoord op sterkte
$wachtwoordFouten = valideerWachtwoord($wachtwoord);
if (!empty($wachtwoordFouten)) {
$message = array_merge($message, $wachtwoordFouten);
}
// Controleer of wachtwoord en bevestiging overeenkomen
if ($wachtwoord !== $bevestig_wachtwoord) {
$message[] = "Wachtwoorden komen niet overeen.";
}
if (empty($message)) {
// Controleer of e-mail of mobiel nummer al bestaat
$stmt = $mysqli->prepare("SELECT id FROM users WHERE email = ? OR mobielnummer = ?");
$stmt->bind_param("ss", $email, $mobiel);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
$message[] = "E-mailadres of mobiel nummer is al geregistreerd.";
} else {
$stmt->close();
// Controleer of kapperszaak naam al bestaat
$stmt = $mysqli->prepare("SELECT id FROM business WHERE name = ?");
$stmt->bind_param("s", $kapperszaak);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
$message[] = "Kapperszaak naam is al geregistreerd.";
} else {
$stmt->close();
// Genereer wachtwoord-hash
$passwordHash = password_hash($wachtwoord, PASSWORD_BCRYPT);
// Voeg kapperszaak toe aan de database
$volledig_adres = $straat . ", " . $postcode . ", " . $plaats;
$stmt = $mysqli->prepare("INSERT INTO business (name, address) VALUES (?, ?)");
$stmt->bind_param("ss", $kapperszaak, $volledig_adres);
$stmt->execute();
$businessId = $stmt->insert_id; // Haal ID op van de nieuwe kapperszaak
$stmt->close();
// Genereer verificatietoken en stel verificatiestatus in
$verification_token = bin2hex(random_bytes(16));
$verification_status = 0;
// Voeg gebruiker toe aan de database
$status = 'on hold';
$role = 'owner';
$stmt = $mysqli->prepare("INSERT INTO users (voornaam, achternaam, email, mobielnummer, password_hash, role, business_id, status, verification_status, verification_token) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->bind_param("ssssssisis", $voornaam, $achternaam, $email, $mobiel, $passwordHash, $role, $businessId, $status, $verification_status, $verification_token);
if ($stmt->execute()) {
// Verzend verificatiemail
$to = $email;
$subject = 'Bevestig uw e-mailadres';
$message = "Beste $voornaam,\n\nBedankt voor uw registratie. Klik alstublieft op de onderstaande link om uw e-mailadres te bevestigen:\n\n";
$message .= "https://salongrip.nl/verify.php?token=$verification_token\n\n";
$message .= "Met vriendelijke groet,\nSalongrip";
// Stel de headers in
$headers = 'From: info@salongrip.nl' . "\r\n" .
'Reply-To: info@salongrip.nl' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
// Verzend de e-mail
if (mail($to, $subject, $message, $headers)) {
$success = "Registratie succesvol! Controleer uw e-mail om uw registratie te bevestigen.";
} else {
$message[] = "Er is een fout opgetreden bij het verzenden van de verificatiemail.";
}
header("Location: wachtkamer.php");
exit();
} else {
$message[] = "Er is een fout opgetreden bij het registreren van de gebruiker.";
}
$stmt->close();
}
}
}
}
?>
Wat staat er op en rond lijn 12 vanSalonGrip/includes/header.php ?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// Controleer of sessies al zijn gestart
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
// Error handling toevoegen
require_once 'error_handling.php';
// Controleer of de gebruiker is ingelogd
$isLoggedIn = isset($_SESSION['user_id']);
?>
<!DOCTYPE html>
<html lang="nl">
// Controleer of sessies al zijn gestart
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
// Error handling toevoegen
require_once 'error_handling.php';
// Controleer of de gebruiker is ingelogd
$isLoggedIn = isset($_SESSION['user_id']);
?>
<!DOCTYPE html>
<html lang="nl">
Ik geloof niet dat het hiermee te maken heeft, want ik gebruik dezelfde header voor login pagina en na een redirect gaat het prima naar de index pagina. Daarom denk ik dat het iets te maken heeft met het registratie pagina.
Echt wel hoor! De error maakt dat ook duidelijk.
Quote:
Ik geloof niet dat het hiermee te maken heeft ...
En toch is dat wel wat de foutmelding aangeeft. ;-)
In de foutmelding staat:
Cannot modify header information - headers already sent by (SalonGrip/includes/header.php:12)
Het lijkt erop dat er in header.php op regel 12 al output naar de browser wordt gestuurd, waarna jij in register.php een header uitvoert. Voordat je een header uitvoert, mag je geen output naar de browser sturen.
Gewijzigd op 30/01/2025 13:48:50 door Ozzie PHP
Die houdt je output vast tot er, zeg, 2 MB aan output is, en stuurt het pas dan.
Gevolg: de ene keer gaat het goed als de pagina de tekst
"hallo Ivo" bevat, en fout als er staat "Hallo Jan-Willem-Frederik", omdat je dan nét over je buffersize heen gaat.
Maar zoals Arien en Ozzie al opmerken: de foutmelding zegt het heel precies. Dit is, als je weet hoe je hem leest, een van de duidelijkste meldingen in PHP.
Het klinkt misschien gek, maar ik denk dat het probleem enkel te maken heeft met registratie pagina.
Dezelfde geinclude bestanden gebruik ik in het inlogpagina en na een succesvolle inlog wordt er wel geredirect naar de index pagina.
Iemand nog ideeën?
De error zegt: headers already sent by (SalonGrip/includes/header.php:12)
Dus: header.php, lijn 12. Daar staat output wat niet voor een header() hoort.
Waarom zou je dan nog twijfelen?
Gewijzigd op 31/01/2025 00:29:20 door - Ariën -
Zoek in de resulterende pagina eens naar "output_buffering"
Staat daar een getal naast > 0 ?
Maar hoe dan ook: je volgorde klopt dus kennelijk niet.
Waarom bouwt je script een pagina op als je daarna gewoon doorgestuurd moet worden?
Logischer is:
- Handel de invoer van de gebruiker af
- kijk wat er moet gebeuren:
-- html pagina?
-- pdf output?
-- redirect ?
En doe daarna pas wat er nodig is.
header.php bevat bij jou een mix tussen "nodig voor de werking van het script (is ingelogd?)" en "begin van een htmlpagina"
Dat "begin van htmlpagina" verdient een eigen bestand: headerhtmlpagina.php en komt pas op het moment dat je een htmlpagina gaat opbouwen, NA de afhandeling van POST
Gewijzigd op 31/01/2025 12:54:26 door - Ariën -
Er mag geen output zijn voor header functie
Ik heb verplaatst naar net boven het formulier, dus na het hele post gebeuren en guess what: het werkt!
Bedankt allemaal voor het meedenken
Gewijzigd op 31/01/2025 22:55:17 door Mohamed nvt
Mohamed nvt op 30/01/2025 12:40:48:
Ik geloof niet dat het hiermee te maken heeft, want ...
Mohamed nvt op 31/01/2025 00:06:44:
Het klinkt misschien gek, maar ik denk dat het probleem enkel te maken heeft met ...
Graag gedaan, en volgende keer niet meer zo eigenwijs zijn. ;-)