Om midden in een script naar een ander bestand te gaan maak ik gebruik van header (location:xxx.php). Op mijn lokale server geeft het geen problemen, maar na de boel geupload te hebben werkt dat niet meer. Ik heb gelezen dat vóór de header geen output mag zijn. Maar waarom werkt het dan wel op mijn eigen server? Zijn er misschien andere (betere) oplossingen hiervoor?
Om je pagina in verschillende acties te verdelen kan een switch zeker erg handig zijn:
<?php
if(isset($_GET['action'])) {
switch ($_GET['action']) {
case "add":
echo "De actie voor toevoegen";
break;
case "edit":
echo "De actie voor wijzigen";
break;
case "delete":
echo "De actie voor verwijderen.";
break;
}
} else {
echo "als er geen aanroep in de URL is gedaan, dus script.php.";
}
?>
De eerste 'headerfout' was opgelost en de tweede diende zich al weer aan. Ik dacht ook dat een switch handig zou zijn, doch had ik nog wat div's boven de switch staan voor de opmaak. Zeer waarschijnlijk dat dat de boosdoeners zijn geweest. Ik plaats dit item nu in een apart bestand en daarmee is het probleem ook opgelost. In de eerste instantie had ik het graag binnen de index.php gehouden dmv een switch. Graag wil ik jullie allemaal bedanken voor de hulp.
in php.ini kun je een output buffer instellen. Bijvoorbeeld dat de eerste 4K aan bytes gebufferd worden. Stuur je voor je buffer vol is een header, dan gaat het toch nog goed.
Een bron van dit soort fouten:
staat op je productieserver de buffer uit, of lager heb je een fout te pakken.
staat de buffer kantje boort, dan gaat het altijd goed met de username 'test' en het adres 'plein 1' in beeld, maar gaat het fout als de user 'willem-alexander van Oranje nassau' heet en op de 'Laan van Meerdevoorden 1209' woont, omdat je dan net over je header heen gaat.
Het probleem wat hier aan ten grondslag ligt is dat je meerdere dingen tegelijkertijd aan het doen bent. Bijvoorbeeld: terwijl je een HTML-document aan het uitdraaien bent ben je een formulier aan het verwerken. Je bent dan met verschillende acties tegelijkertijd bezig. Dit kun je vermijden door acties strict gescheiden te behandelen. Hoe je dit verder doet/implementeert is een tweede, al lijkt mij een switch-statement een goed recept voor spaghetti-code.
In zijn simpelste vorm zou ik opteren voor een "paginatype" klasse die als een raamwerk dient voor eigenlijk alle (vervolg)pagina's (die hiervan afgeleid zijn) die een dynamisch karakter hebben. Maar dit is wederom een keuze. In plaats van methoden die elk een specifieke actie implementeren zou je ook kunnen kiezen voor een apart PHP-bestand voor elke specifieke taak. Welke oplossing je kiest is afhankelijk van persoonlijke voorkeur, niveau en complexiteit van je applicatie. De onderliggende aanpak (behandel maximaal één actie tegelijkertijd) blijft echter hetzelfde.