Header (location: ) werkt niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ton Dekkers

Ton Dekkers

01/05/2017 14:14:42
Quote Anchor link
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?
 
PHP hulp

PHP hulp

26/11/2024 23:41:49
 
- Ariën  -
Beheerder

- Ariën -

01/05/2017 14:21:42
Quote Anchor link
Het enige wat ik mij kan bedenken waarom het op de andere server niet zou werken is dat er toch ergens output voor staat. Het kan zelfs al een onschuldige B-O-M zijn.

Zet foutafhandeling in PHP eens aan, en kijk eens wat voor fouten je zien omtrent je header. De foutmelding verwijst ook naar de plek waar de output zich bevindt, met de regel na de dubbele-punt.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

01/05/2017 14:26:06
Quote Anchor link
Ja helaas werkt het soms lokaal wel en op een andere machine weer niet.

De enigste juiste oplossing is je code zo op te bouwen dat je het splitst in twee gedeeltes:

Deel 1: je applicatie waarin je variabelen "klaar zet" voor de view (=deel 2). In dit deel doe je geen enkele output BEHALVE een fatal error waarna je applicatie dan ook direct stopt (exit;).

Deel 2: je view waarin je enkel HTML gebruikt en hele kleine blokjes PHP niet meer dan noodzakelijk en enkel om je variabelen te echoën al dan niet in een foreach lus.
Gewijzigd op 01/05/2017 14:32:05 door Frank Nietbelangrijk
 
Ton Dekkers

Ton Dekkers

01/05/2017 14:57:48
Quote Anchor link
Er staat idd output voor. Dat zal dan ook wel zeer waarschijnlijk de oorzaak zijn. Maar wat ik vreemd vind is dat het mijn eigen server wel werkt. Ik zou het wel kunnen oplossen dmv bijvoorbeeld een 'tussenscherm' zodat je van daaruit naar de betreffende pagina kunt (dus zonder gebruik te maken van de header), maar dat geniet bij mij niet de voorkeur. Frank: bedoel je dan ook om de query in een variabele te plaatsen?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

01/05/2017 15:09:40
Quote Anchor link
Queries voer je dan ook uit in deel 1, je applicatie.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
// DEEL 1: De Applicatie

// initialisatie van de variabelen

$users = array();

// maak verbinding met de mysql server
$con = mysqli_connect('','','','');

// verkrijg een lijst met gebruikers
$result = mysqli_query($con, 'SELECT name FROM users');
if(FALSE === $result) {
    echo 'FOUT: blablabla';
    exit;
}


while($row = mysqli_fetch_assoc($result)) {
    $users[] = $row;
}


// Hieronder komt DEEL 2: De View:
?>

<!doctype>
<html>
    <body>
        <h1>User list</h1>
        <ul>
<?php foreach($users as $user) { ?>
            <li><?php echo $user['name']; ?></li>
<?php } ?>
        </ul>
    </body>
</html>


Toevoeging op 01/05/2017 15:13:46:

In een beetje verder ontwikkeld systeem zullen de applicatie en de view ook in twee afzonderlijke bestanden staan. Een volgende stap is om ook je queries in een aparte class-methods te zetten waarna je vanuit je Applicatie gewoon een functie aanroep doet. Maar goed al begin je maar met het bovenstaande dan komt er al een stuk meer structuur je in code.
 
Ton Dekkers

Ton Dekkers

01/05/2017 16:52:44
Quote Anchor link
Beste Frank en Ariën, bedankt voor de reacties. Ik zal het toch op een andere manier moeten fixen. Dus zonder header helass. Het heeft idd te maken met de output.
 
- Ariën  -
Beheerder

- Ariën -

01/05/2017 17:03:59
Quote Anchor link
Dan zou ik dus de opbouw van je script aanpassen, zodat de headers als eerste worden gedaan.
Met de headers zelf is niks mis, dus waarom zou je daar vanaf stappen?
 
Ton Dekkers

Ton Dekkers

01/05/2017 19:17:02
Quote Anchor link
De headers kunnen eigenlijk pas halverwege dat script verzonden worden, daar het naar aanleiding van een voorwaarde pas aan de orde komt. Vóór de headers gebruikt worden is er al een query verzonden. Ook zijn er dan al wat commentaarregels de revue gepasseerd. Maar het zou mooi zijn als het zou werken ;)
Gewijzigd op 01/05/2017 19:18:13 door Ton Dekkers
 
- Ariën  -
Beheerder

- Ariën -

01/05/2017 19:26:17
Quote Anchor link
Zet je error-reporting eens aan. Ik vermoed dan dat je een foutmelding over je headers krijgt?
 
Ton Dekkers

Ton Dekkers

01/05/2017 20:31:09
Quote Anchor link
Nog steeds helemaal blanco.....
 
Thomas van den Heuvel

Thomas van den Heuvel

01/05/2017 22:21:10
Quote Anchor link
Frank Nietbelangrijk op 01/05/2017 14:26:06:
De enigste juiste oplossing is je code zo op te bouwen dat je het splitst in twee gedeeltes

Nou nee, niet per se.

Je zou je code ook kunnen laten draaien om / kunnen compartimenteren in acties. Deze acties bepalen op hun beurt of en wat voor output (lees: Content-Type) er geproduceerd moet worden. Op die manier heb je altijd de controle over wat voor output er gegenereerd wordt. De uit te voeren actie zou bijvoorbeeld tot uiting kunnen komen door een querystring-variabele: ?action=...

Denk bij acties bijvoorbeeld aan:
- een actie om een formulier weer te geven (myform.php?action=showForm). Dit zou dan moeten resulteren in het renderen van een HTML-pagina (een maintemplate met een formulier); het action-attribuut verwijst hierbij naar de URL om het formulier te verwerken (zie hieronder)
- een actie om een formulier te valideren en te verwerken (myform.php?action=processForm). Dit is enkel code die verder geen output produceert maar een die je direct doorstuurt naar een andere actie, bijvoorbeeld een bedank-boodschap (wederom een HTML-pagina; myform.php?action=thankYou) indien de invoer correct was of dat je teruggestuurd wordt naar de toon-formulier-actie met een foutmelding indien de invoer niet klopte (myform.php?action=showForm&error=1).
- een actie om een JSON-response te genereren waarmee je een dynamische dropdown vult in de eerdergenoemde formulier-actie (myform.php?action=JSONfillDropdown&param=123)

et cetera

NB als je geen errors ziet, zet dit bovenaan je script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
ini_set('display_errors', 'stdout'); // geeft aan waar foutmeldingen worden gemeld
error_reporting(E_ALL); // geeft aan welke foutmeldingen worden gemeld
?>

En/of controleer de netwerk-tab van je browser. Als je HTTP 500 errors (internal server errors) krijgt zou je ook je errorlogs kunnen (downloaden en) raadplegen.
Gewijzigd op 01/05/2017 22:28:37 door Thomas van den Heuvel
 
Ton Dekkers

Ton Dekkers

02/05/2017 10:25:46
Quote Anchor link
Ik krijg nu de foutmeldingen wel door. Ik dacht dat 'error_reporting(E_ALL)' voldoende was ;). Bedoel je het gebruik maken van 'switch' Thomas?
 
- Ariën  -
Beheerder

- Ariën -

02/05/2017 10:31:58
Quote Anchor link
Om je pagina in verschillende acties te verdelen kan een switch zeker erg handig zijn:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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.";
}

?>
 
Ton Dekkers

Ton Dekkers

02/05/2017 11:42:42
Quote Anchor link
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.
 
Ivo P

Ivo P

02/05/2017 13:29:51
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

02/05/2017 19:39:10
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.