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?
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.
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.
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?
Queries voer je dan ook uit in deel 1, je applicatie.


<?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>


[size=xsmall]Toevoeging op 01/05/2017 15:13:46:[/size]

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.
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.
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?
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 ;)
Zet je error-reporting eens aan. Ik vermoed dan dat je een foutmelding over je headers krijgt?
Nog steeds helemaal blanco.....
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:
<?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.

Reageren