Toon posts:

[PHP+IIS] Problemen met PHP_SELF en Sessions

Pagina: 1
Acties:
  • 93 views sinds 30-01-2008

Verwijderd

Topicstarter
Tweakers,

Ik loop weer eens tegen iets aan. Ik heb voor een bedrijf een intranetsite gemaakt met behulp van PHP en mysql. Nu draaien ze op de uiteindelijke omgeving geen mysql maar mssql. Dus moet het een en ander omgezet worden, maar toen begonnen de problemen.

Ik heb mssql en PHP nu goed geconfigureerd, dit werkt. Ik heb een nieuwe database aangemaakt met bijhorende users, werkt ook. Ik krijg nu alleen problemen met het starten van de sessions en de inlogpagina.

Eerst de inlogpagina: als ik wil inloggen stuurt IIS mij door naar de volgende link http://localhost/<br%20/><b>Notice</b>:%20%20Undefined%20variable:%20%20PHP_SELF%20in%20<b>F:/Intranet/page/inlog.php</b>%20on%20line%20<b>15</b><br%20/>

Heel vaag, want PHP_SELF is toch een standaard functie? Dit werkte eerder (met Apache en MySql wel).

De (relevante code) van de inlogpagina (die ge-included wordt via de index.php) ziet er als volgt uit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
include ('include_db_gegevens.php');

mssql_connect($host, $user, $password) //connectie opzetten met database
or die ("Kan geen verbinding maken met de database"); 
mssql_select_db($database) 
or die ("Het selecteren van de database is mislukt"); 

$query_select = "SELECT gebruiker_id, gebruiker_groep, inlognaam, voornaam, achternaam, wachtwoord 
                 FROM gebruikers 
                 WHERE inlognaam = '$inlognaam_form'"; //query
$result = mssql_query($query_select);  //voer de select query uit
$password_array = mssql_fetch_array($result); //mssql_fetch_array maakt van de SQL uitvoer een array

if ($_POST['submit']){ //kijk of het formulier verzonden is
..invoercontrole (knip)
header("Location: index.php");//laad de pagina
else {      
    print ("<p class=\"fout\">Foutmelding: u heeft een verkeerd wachtwoord ingevoerd!</p>");
    } 
}


Dan het probleem met de sessions, in IIS krijg ik de volgende melding:
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at F:\Intranet\index.php:8) in

Dit schijnt te maken te hebben met het feit dat er spaties of tekens voor het aanroepen van session_start staan, maar dit werkte eerder wel binnen de Apache/MySql omgeving? Ik had daar ook het weergeven van alle fouten aanstaan. Kan ik dit oplossen door session_start op te nemen boven aan de index.php (welke de andere pagina's included)?

[ Voor 5% gewijzigd door Verwijderd op 08-02-2005 02:42 ]


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 21:18
Heb je in php.ini wel een goed path aangegeven waar de session-files worden opgeslagen?

Verwijderd

Topicstarter
Ja, hij maakt het bestandje van die sessie ook aan. Het bestand bevat alleen geen data, omdat de gebruiker niet kan inloggen omdat de inlogpagina niet (meer) werkt.

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 21:18
Als je inderdaad gegevens verstuurd naar de browser krijg je deze foutmelding. Je moet dus zorgen dat de headers (dus ook de session_start) plaatsvinden vóór je ook maar één byte naar de browser stuurt.

Bovenaan zetten zal inderdaad helpen.

Verwijderd

Topicstarter
Dan zet ik die session_start wel bovenaan, dan zou dat opgelost moeten zijn. Blijft het probleem van PHP_SELF over..

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 21:18
Nee, het is $_SERVER['PHP_SELF']

Verwijderd

Topicstarter
Stom, is dat soms een verschil tussen php4 en php5? Nog een vraagje, weet iemand een tool waarmee je direct data kan invoeren in de tabellen van mssql? Met de enterprise manager lukt het me niet. Ik bedoel net zoiets als PhpMyAdmin, zodat ik ook kan zien er daadwerkelijk data in de tabellen staat..

Verwijderd

Verwijderd schreef op dinsdag 08 februari 2005 @ 03:08:
Stom, is dat soms een verschil tussen php4 en php5? Nog een vraagje, weet iemand een tool waarmee je direct data kan invoeren in de tabellen van mssql? Met de enterprise manager lukt het me niet. Ik bedoel net zoiets als PhpMyAdmin, zodat ik ook kan zien er daadwerkelijk data in de tabellen staat..
Dat is geen verschil tussen php4 en 5. De latere versies van php4 werken standaard met superglobals op OFF vanwegen veiligheidsredenen. PHP5 heeft ze ook standaard op OFF staan. En ik denk dat jij gewoon op een wat oudere PHP4 zat te werken waar ze op ON stonden.

mssql admin, bijvoorbeeld: http://hotscripts.com/Detailed/17328.html

Verwijderd

Topicstarter
Ok dan, ben al een stuk verder. Krijg nu ook wat meer inzicht in de mogelijkheden van de enterprise manager. Ik heb nu alleen wel problemen met het wijzigen en versturen van de headers. Het inloggen gaat goed, de session wordt aangemaakt.

Alleen op bepaalde pagina's krijg ik nu de volgende melding: Warning: Cannot modify header information - headers already sent by (output started at F:\Intranet\index.php:9) in

De code die de gebruiker doorstuurt is:
PHP:
1
2
3
4
5
6
7
if ($_POST['submit']){ //kijk of het formulier verzonden is
    if ($inlognaam !="" && ($gebruiker_groep!="" && ($voornaam !="" && ($achternaam !="" && ($wachtwoord !=""))))){ //invoercontrole
    $query_update = "INSERT INTO gebruikers (gebruiker_groep, inlognaam, voornaam, achternaam, wachtwoord, tijd) 
                     VALUES ('$gebruiker_groep', '$inlognaam', '$voornaam', '$achternaam', '$wachtwoord', '$tijd')"; //de update query
    $result = mssql_query($query_update);  //voer de query uit
    print ("<b>Melding:</b> De nieuwe gebruiker is aangemaakt!<br>");
    header ("Location: index.php?page=page/beheer_gebruiker.php"); //renew de pagina


Kan ik dit nu niet meer zo gebruiken, of staat er gewoon iets verkeerd? Ik heb nu bovenaan de index.php pagina (en dus op elke pagina bovenaan) staan:
PHP:
1
<?session_start(); ?>

en de andere aanroepen van session_start heb ik weggehaald.

[ Voor 14% gewijzigd door Verwijderd op 08-02-2005 03:47 ]


  • Noodels
  • Registratie: Februari 2004
  • Niet online
Je doet eerst een print en dan pas een header.

Dus lees deze post nog eens:
Dennis schreef op dinsdag 08 februari 2005 @ 02:43:
Als je inderdaad gegevens verstuurd naar de browser krijg je deze foutmelding. Je moet dus zorgen dat de headers (dus ook de session_start) plaatsvinden vóór je ook maar één byte naar de browser stuurt.

Bovenaan zetten zal inderdaad helpen.
Dus ik zou zeggen haal die print een weg....
en het is print "bladiebla";

Verwijderd

Topicstarter
Ik begrijp dat ik niks voor het aanroepen van de header mag doen, maar daar ontkom je toch niet aan? Dat session_start bovenaan moet staan is geen probleem, maar dat je voordat je de header aanroept geen byte naar de browser mag sturen lijkt me vrijwel onmogelijk of ben ik nou gek?

Ik zag in een ander topic dat ob_start(): het probleem zou kunnen oplossen? Kan iemand me vertellen wat de gangbare manier is?

Het valt me trouwens op dat sinds ik de formulier actie veranderd heb in $_SERVER['PHP_SELF'] ik elke na het submitten geredirect wordt naar de index.php? Eerder gebeurde dit ook niet?

Het wordt steeds gekker 8)7

[ Voor 39% gewijzigd door Verwijderd op 08-02-2005 04:27 ]


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 21:18
Verwijderd schreef op dinsdag 08 februari 2005 @ 04:14:
Ik begrijp dat ik niks voor het aanroepen van de header mag doen, maar daar ontkom je toch niet aan? Dat session_start bovenaan moet staan is geen probleem, maar dat je voordat je de header aanroept geen byte naar de browser mag sturen lijkt me vrijwel onmogelijk of ben ik nou gek?
Zoek nou eerst eens uit hoe dingen werken voordat je alles hier neer dumpt! Volgens mij doe je zelf weinig moeite om je probleem op te lossen. Als je hebt gezien dat ob_start het oplost ga dan naar http://nl2.php.net/ob_start ofzo en kijk wat het is en wat het doet.

Verder is het natuurlijk helemaal niet moeilijk dat er geen byte naar de browser wordt gestuurd. Als jij session_start of een header bovenaan zet dan gebeurt dat niet. Dus ook hier geldt weer: probeer het eerst eens uit voordat je komt zeggen dat het onmogelijk is.

ob_start ís inderdaad een oplossing als het niet anders kan maar heb je in principe helemaal niet nodig en maakt het alleen maar nodeloos ingewikkeld. Beter is om met templates te werken bijvoorbeeld, dan werkt het ook allemaal zonder problemen.

Succes.

  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

Verwijderd schreef op dinsdag 08 februari 2005 @ 03:46:
PHP:
1
2
    print ("<b>Melding:</b> De nieuwe gebruiker is aangemaakt!<br>");
    header ("Location: index.php?page=page/beheer_gebruiker.php"); //renew de pagina


Kan ik dit nu niet meer zo gebruiken, of staat er gewoon iets verkeerd? Ik heb nu bovenaan de index.php pagina (en dus op elke pagina bovenaan) staan:
PHP:
1
<?session_start(); ?>
De melding lijkt me vrij duidelijk : Er is al uitvoer geweest voordat PHP header wil sturen. Die uitvoer kont van de print(). Conclusie : De print() weghalen.

Verwijderd

Topicstarter
@Dennis: ik doe zeker zelf wel moeite om het probleem op te lossen, het verwarrende voor mij is alleen dat eerder alles probleemloos werkte en dat ik nu allemaal vage problemen krijg. Logisch toch dat het een beetje verwarrend wordt? Ik ben vannacht tot 5 uur bezig geweest en je kan er vanuit gaan ik niet alleen een beetje hier zit te posten, maar ook zelf zoek.

Ik heb nu in de eerste regel van de index.php staan:
PHP:
1
<?session_start(); ob_start();?>


En op andere pagina's roep ik dan de headers aan, maar dat werkt niet want hij redirect me altijd naar de index.php.

Je zegt dat het niet zo moeilijk is om geen byte naar de browser te sturen voordat je redirect en dat ik beter metr templates kan werken, hoe bedoel je dat dan?

[ Voor 58% gewijzigd door Verwijderd op 08-02-2005 12:40 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:11

Creepy

Tactical Espionage Splatterer

belgie: Maar het lijkt er wel erg op dat we je een behoorlijk eind aan het handje moeten houden.
Heb je P&W FAQ - Leer **** debuggen!! al eens gezien?
Bekijk nou eens precies welke output er al gestuurd is voordat je header() gebruikt. Hieraan kan je precies zien welk stuk code voor de header output heeft gegenereerd en er wat aan doen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Ik begrijp dat het zo overkomt, maar ik heb zelf geen idee waar ik het moet zoeken momenteel. Ik krijg nu de volgende melding:
PHP:
1
Warning: Cannot modify header information - headers already sent by (output started at F:\Intranet\index.php:9) in F:\Intranet\page\inlog.php on line 65


Ik kijk dus naar regel 9 van de index.php en daar begint een javascript in de head van de index.php. Op regel 65 staat de redirect. Ik kan toch moeilijk die javascript uit de index.php weghalen? Ik begrijp gewoon even niet hoe dit in de praktijk toegepast moet worden.. Als ik de session_start weghaal van de eerste regel in de index.php en net boven het zetten van de header plaats dan geeft ie:
PHP:
1
2
3
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at F:\Intranet\index.php:2) in F:\Intranet\page\inlog.php on line 65

Warning: Cannot modify header information - headers already sent by (output started at F:\Intranet\index.php:2) in F:\Intranet\page\inlog.php on line 66


Ik snap heel goed wat er fout gaat, ik begrijp alleen niet wat wel een werkbare oplossing is? Met het plaatsen van ob_start(); krijg ik foutmeldingen, maar dan werken de headers weer niet goed..

Zou het te maken kunnen hebben dat ik eerder php5 gebruikte en nu php4? Lijkt me niet, maar goed.

[ Voor 4% gewijzigd door Verwijderd op 08-02-2005 13:07 ]


  • blizt
  • Registratie: Januari 2003
  • Laatst online: 01-05 08:39

blizt

Wannabe-geek

Je zou zoiets kunnen doen:
PHP:
1
2
3
4
5
6
7
<?php
sesson_start();
ob_start();
//javascriptje en andere output
header();
ob_end_flush();
?>

Of iets dergelijks ...
Denk dat je hier wel mee verder moet komen in ieder geval.

[ Voor 3% gewijzigd door blizt op 08-02-2005 13:13 . Reden: typo'tje ;) ]

United we stand, and divided we fall


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 21:18
Verwijderd schreef op dinsdag 08 februari 2005 @ 13:05:
Ik begrijp dat het zo overkomt, maar ik heb zelf geen idee waar ik het moet zoeken momenteel. Ik krijg nu de volgende melding:
PHP:
1
Warning: Cannot modify header information - headers already sent by (output started at F:\Intranet\index.php:9) in F:\Intranet\page\inlog.php on line 65

Ik kijk dus naar regel 9 van de index.php en daar begint een javascript in de head van de index.php. Op regel 65 staat de redirect. Ik kan toch moeilijk die javascript uit de index.php weghalen? Ik begrijp gewoon even niet hoe dit in de praktijk toegepast moet worden..
Okay, laat ik dan maar even zeggen waar het op staat zonder onaardig te willen zijn, maar blijkbaar snap je de essentie van netjes programmeren in php dan niet. Het is echt niet zo moeilijk om die header ergens anders in je script te krijgen, dat moet te doen zijn. Als je het niet begrijpt, misschien moet je dan niet met headers gaan werken ;). Overigens zijn op internet echt talloze voorbeelden hierover te vinden dus daar moet je opzich wel uit kunnen komen lijkt mij :).

Verwijderd

Topicstarter
Als ik dat doe kom ik inderdaad wat verder, alleen werkt het nog niet helemaal. Het gekke is dat de redirect op de inlogpagina wel goed werkt (hij renewt de index.php met daarin de inlog.php om te laten zien dat je ingelogd bent), alleen op de andere pagina's niet, terwijl de opbouw van het formulier e.d. exact hetzelfde is! Het valt me ook op dat ik uitgelogd wordt zodra ik ene redirect aanroep die niet van de inlogpagina is, de session wordt destroyed.

Op de inlogpagina zijn trouwens geen kunstgrepen toegepast. Hoe kan het dat die andere pagina's het dan niet doen, als ze vrijwel hetzelfde zijn?

Verwijderd

Waarom zetten heleboel mensen altijd gewoon ob_start() neer? :?

Meestal kun je het door een if om te draaien gewoon oplossen.
Verwijderd schreef op dinsdag 08 februari 2005 @ 13:39:
Als ik dat doe kom ik inderdaad wat verder, alleen werkt het nog niet helemaal. Het gekke is dat de redirect op de inlogpagina wel goed werkt (hij renewt de index.php met daarin de inlog.php om te laten zien dat je ingelogd bent), alleen op de andere pagina's niet, terwijl de opbouw van het formulier e.d. exact hetzelfde is! Het valt me ook op dat ik uitgelogd wordt zodra ik ene redirect aanroep die niet van de inlogpagina is, de session wordt destroyed.

Op de inlogpagina zijn trouwens geen kunstgrepen toegepast. Hoe kan het dat die andere pagina's het dan niet doen, als ze vrijwel hetzelfde zijn?
Zonder de code van die andere pagina's kunnen we sowieso niet zien wat er fout gaat.
Maar probeer het eerst is zonder output buffering op te lossen.

Verwijderd

Topicstarter
Dennis schreef op dinsdag 08 februari 2005 @ 13:32:
[...]

Okay, laat ik dan maar even zeggen waar het op staat zonder onaardig te willen zijn, maar blijkbaar snap je de essentie van netjes programmeren in php dan niet. Het is echt niet zo moeilijk om die header ergens anders in je script te krijgen, dat moet te doen zijn. Als je het niet begrijpt, misschien moet je dan niet met headers gaan werken ;). Overigens zijn op internet echt talloze voorbeelden hierover te vinden dus daar moet je opzich wel uit kunnen komen lijkt mij :).
Misschien snap ik essentie van netjes programmeren in PHP ook wel niet helemaal, maa rdat wil nog niet zeggen dat ik dit probleem niet op wil lossen. Het is blijkbaar een klein iets, alleen krijg ik het nou niet voor elkaar. Ik ben echt wel bereid er tijd in te steken om het op te lossen. Als het toch niet zo moeilijk is, waarom leg je dan niet de vinger op de zere plek en geef je me een duw in de goeie richting? ;)

[ Voor 7% gewijzigd door Verwijderd op 08-02-2005 14:04 ]


Verwijderd

Topicstarter
Verwijderd schreef op dinsdag 08 februari 2005 @ 14:01:
Waarom zetten heleboel mensen altijd gewoon ob_start() neer? :?

Meestal kun je het door een if om te draaien gewoon oplossen.


[...]


Zonder de code van die andere pagina's kunnen we sowieso niet zien wat er fout gaat.
Maar probeer het eerst is zonder output buffering op te lossen.
Bij deze de code van de beheers pagina voor de producten:
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
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
 <table class="formulier" cellspacing="0" cellpadding="0">
<knip>
  <tr>
   <td class="formulier" colspan="2">
    <center>
     <input type="submit" name="submit" value="Aanmaken" class="knop">
     <input type="reset" name="reset" value="Reset" class="knop">
    </center>
   </td>
  </tr>
 </table>
</form>

<?php
// Producten toevoegen aan de database
if ($_POST['submit']){ //kijk of het formulier verzonden is
    $productnaam = $_POST['productnaam']; 
    if ($productnaam !=""){ //invoercontrole
    
    $query_update = "INSERT INTO producten (productnaam)
                     VALUES('$productnaam')"; //de update query
    $result = mssql_query($query_update);  //voer de query uit
    header ("Location: index.php?page=page/beheer_producten.php"); //renew de pagina
}


De opbouw van de inlogpagina is exact hetzelfde, maar daar werkt de redirect wel.

[ Voor 19% gewijzigd door Verwijderd op 08-02-2005 14:10 ]


Verwijderd

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
<?php
// Producten toevoegen aan de database
if ($_POST['submit']){ //kijk of het formulier verzonden is
    $productnaam = $_POST['productnaam']; 
    if ($productnaam !=""){ //invoercontrole
    
    $query_update = "INSERT INTO producten (productnaam)
                     VALUES('$productnaam')"; //de update query
    $result = mssql_query($query_update);  //voer de query uit
    header ("Location: index.php?page=page/beheer_producten.php"); //renew de pagina
}
else
{
    ?>
    <form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
 <table class="formulier" cellspacing="0" cellpadding="0">
<knip>
  <tr>
   <td class="formulier" colspan="2">
    <center>
     <input type="submit" name="submit" value="Aanmaken" class="knop">
     <input type="reset" name="reset" value="Reset" class="knop">
    </center>
   </td>
  </tr>
 </table>
</form>
<?php
}
?>


Zo moet het denk wel lukken. Ik heb niet ingesprongen, maar je het is zo wel duidelijk genoeg.
Succes.

  • blizt
  • Registratie: Januari 2003
  • Laatst online: 01-05 08:39

blizt

Wannabe-geek

Dit ljikt me toch niet zo moeilijk?
code:
1
2
3
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
[...]
</form>

Dat noemen we nu output :)
Die staat voor je header()...
Nu, lees [rml]HaVri in "[ PHP+IIS] Problemen met PHP_SELF en Sess..."[/rml] nog 'ns (en dan vooral de 2e regel).

United we stand, and divided we fall


Verwijderd

Topicstarter
Dit werkt ook niet. Ik krijg die melding op practisch elke pagina, nu ook op de inlogpagina, het werkt pas als ik de inlogpagina 2x refresh. Ik heb bijvoorbeeld ook een uitlogpagina, welke alleen de sessie destroyed, ook daar krijg ik de melding. Komt het niet door die session_start in de index.php? Hoe kan ik dit anders doen?

Word er helemaal tureluurs van 8)7

Heb nu een test.php aangemaakt met daarin:
PHP:
1
2
3
<?php
header("Location: index.php?page=page/beheer_producten.php");
?>


Dit werkt wel. Moet ik dan elke pagina om gaan bouwen, zodat er totaal geen output plaatsvindt voor het versturen van de headers? Er is geen andere manier?

Hebben jullie mss een idee hoe het kan dat dit eerder dan allemaal wel werkte?

[ Voor 34% gewijzigd door Verwijderd op 08-02-2005 14:33 ]


Verwijderd

Topicstarter
Nog iets, ik heb de beheer pagina voor de producten omgebouwd en nog krijg ik de foutmelding headers already..

De code ziet er als volgt uit:
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
<?php
// het idee is om te kijken welke waarde 'gebruiker_groep heeft en aan de hand daarvan een nieuwe variabele aan te maken met de naam //toegang, met de waarde 0 of 1.
if ($_SESSION['gebruiker_groep'] == "Beheer"){
    $toegang = "1";
}

if ($_SESSION['gebruiker_groep'] == "Bewerk"){
    $toegang = "0 ";
}

if ($_SESSION['gebruiker_groep'] == "Gast"){
    $toegang = "0";
}

if ($toegang == '1') { 

include ('include_db_gegevens.php');
// Maak het overzicht van de productem

mssql_connect($host, $user, $password) //connectie opzetten met database
or die ("<p class=\"foutmelding\">Kan geen verbinding maken met de database</p>"); 

mssql_select_db($database) 
or die ("<p class=\"foutmelding\">Het selecteren van de database is mislukt</p>"); 

// Producten toevoegen aan de database
if ($_POST['submit']){ //kijk of het formulier verzonden is
    $productnaam = $_POST['productnaam']; 
    if ($productnaam !=""){ //invoercontrole
    
    $query_update = "INSERT INTO producten (productnaam)
                     VALUES('$productnaam')"; //de update query
    $result = mssql_query($query_update);  //voer de query uit
    header ("Location: index.php?page=page/beheer_producten.php"); //renew de pagina
}
else {
print ("<b>Melding:</b> U heeft niet alle velden ingevuld!<br><br>");
    }
}


Nu wordt er geen output verstuurt voor het aanroepen van de header en nog geeft hij die melding..

[ Voor 16% gewijzigd door Verwijderd op 08-02-2005 14:37 ]


  • blizt
  • Registratie: Januari 2003
  • Laatst online: 01-05 08:39

blizt

Wannabe-geek

Zeker dat er geen output verstuurd wordt?
En ja, er is wel 'n andere oplossing: output buffering. Dat is je al vaak genoeg gezegd in dit topic...

United we stand, and divided we fall


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:48

Janoz

Moderator Devschuur®

!litemod

Onder output wordt niet alleen de echos en prints verstaan. Ook alles wat niet binnen php haken valt is output. Wat vaak fout gaat is dat er nog een spatie of lege regel voor de open tag staat. Dit geld ook voor de bestanden die je include. In dit geval vermoed ik dat er na de sluithaak in include_db_gegevens.php nog een paar spaties of lege regels staan. De 'headers already sent' geeft trouwens keurig aan op welke positie de output al begonnen is. Het zoeken naar het probleem lijkt me dan ook helemaal niet zo moeilijk.

Output buffering zou ik trouwens pas als laatste redmiddel doen. in 99% van de gevallen is het compleet onnodig en over het algemeen wordt het alleen maar als symptoom bestreiding gebruikt zodat het echte probleem niet opgelost hoeft te worden.

[ Voor 39% gewijzigd door Janoz op 08-02-2005 15:07 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Verwijderd schreef op dinsdag 08 februari 2005 @ 14:36:
Nog iets, ik heb de beheer pagina voor de producten omgebouwd en nog krijg ik de foutmelding headers already..

De code ziet er als volgt uit:
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
<?php
// het idee is om te kijken welke waarde 'gebruiker_groep heeft en aan de hand daarvan een nieuwe variabele aan te maken met de naam //toegang, met de waarde 0 of 1.
if ($_SESSION['gebruiker_groep'] == "Beheer"){
    $toegang = "1";
}

if ($_SESSION['gebruiker_groep'] == "Bewerk"){
    $toegang = "0 ";
}

if ($_SESSION['gebruiker_groep'] == "Gast"){
    $toegang = "0";
}

if ($toegang == '1') { 

include ('include_db_gegevens.php');
// Maak het overzicht van de productem

mssql_connect($host, $user, $password) //connectie opzetten met database
or die ("<p class=\"foutmelding\">Kan geen verbinding maken met de database</p>"); 

mssql_select_db($database) 
or die ("<p class=\"foutmelding\">Het selecteren van de database is mislukt</p>"); 

// Producten toevoegen aan de database
if ($_POST['submit']){ //kijk of het formulier verzonden is
    $productnaam = $_POST['productnaam']; 
    if ($productnaam !=""){ //invoercontrole
    
    $query_update = "INSERT INTO producten (productnaam)
                     VALUES('$productnaam')"; //de update query
    $result = mssql_query($query_update);  //voer de query uit
    header ("Location: index.php?page=page/beheer_producten.php"); //renew de pagina
}
else {
print ("<b>Melding:</b> U heeft niet alle velden ingevuld!<br><br>");
    }
}


Nu wordt er geen output verstuurt voor het aanroepen van de header en nog geeft hij die melding..
Bij headers already sent staat ook altijd bij op welke lijn de output verstuurd wordt.
Kijk op die lijn, en kijk wat er mis is. En los het dan op. :)
Met een exacte foutmelding kunnen we trouwens wat meer.
De meeste mensen hebben namelijk geen zin om jouw code door te spitten.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:11

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op dinsdag 08 februari 2005 @ 14:26:
Dit werkt wel. Moet ik dan elke pagina om gaan bouwen, zodat er totaal geen output plaatsvindt voor het versturen van de headers?
Ja
Er is geen andere manier?
ob_start() gebruiken, maar dat is een geen oplossing voor het probleem, wel een verwijdering van het symptoom ;) En blijkbaar werkt dit bij jou niet dus zul je je pagina's moeten ombouwen.
Hebben jullie mss een idee hoe het kan dat dit eerder dan allemaal wel werkte?
Ik niet.

[ Voor 7% gewijzigd door Creepy op 08-02-2005 15:14 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Verwijderd schreef op dinsdag 08 februari 2005 @ 15:03:
[...]


Bij headers already sent staat ook altijd bij op welke lijn de output verstuurd wordt.
Kijk op die lijn, en kijk wat er mis is. En los het dan op. :)
Met een exacte foutmelding kunnen we trouwens wat meer.
De meeste mensen hebben namelijk geen zin om jouw code door te spitten.
Dit is een van de foutmeldingen: Warning: Cannot modify header information - headers already sent by (output started at F:\Intranet\index.php:9) in F:\Intranet\page\uitloggen.php on line 4

Die output op regel 9 is een javascript welke in de head van de index.php staat. Session_start() bovenin de index.php zetten werkt dus niet, want dat javascript moet daar staan.
maar session_start net boven de header in de individuele pagina's zetten werkt ook niet, omdat er dan ook al output is, van bijvoorbeeld die index.php.
Hoe kan het dan wel zonder gebruik te maken van output buffering? Dit is waar ik tegenaan loop. Ik snap wat er fout gaat, ik zie alleen geen praktische oplossing. :? Ik neem aan dat hier vaker mensen tegenaan gelopen zijn, want ik ben niet de enige die pagina's include en redirect gebruikt. Ben ik nou zo dom/gek?

[ Voor 9% gewijzigd door Verwijderd op 08-02-2005 15:53 ]


  • blizt
  • Registratie: Januari 2003
  • Laatst online: 01-05 08:39

blizt

Wannabe-geek

Dus uitloggen.php is een include in index.php?
Dan moet je wel werken met ob ben ik bang...

United we stand, and divided we fall


Verwijderd

Topicstarter
blizt schreef op dinsdag 08 februari 2005 @ 15:53:
Dus uitloggen.php is een include in index.php?
Dan moet je wel werken met ob ben ik bang...
Ja, dat geldt voor elke pagina. De index.php is een pagina, die het menu opbouwt en wat andere dingen en afhankelijk van de waarde van $page een pagina included.

  • blizt
  • Registratie: Januari 2003
  • Laatst online: 01-05 08:39

blizt

Wannabe-geek

Dan heb je er altijd output voor hè, dat had je zelf ook kunnen bedenken toch?
Zoals ik al zei in m'n vorige post: output buffering is nodig, dat weet ik nu wel bijna zeker.

United we stand, and divided we fall


Verwijderd

Topicstarter
Ok dan. Had ik zelf misschien ook wel kunnen bedenken, maar zoals eerder gezegd heeft deze code altijd zo gewerkt, dus de logica van de probloemen ontgaat mij een beetje. Maar goed, die output buffering, hoe pas ik die goed toe? Moet ik dan ob_start bovenaan de index.php zetten en dan ob_end_flush na elke redirect?

  • blizt
  • Registratie: Januari 2003
  • Laatst online: 01-05 08:39

blizt

Wannabe-geek

Zeg je dat je wat doet en doe je niets, of zeg je dat je wat doet en doe je dat niet goed?
Anders gezegd: doe zelf ook 'ns beetje onderzoek ...
[rml]blizt in "[ PHP+IIS] Problemen met PHP_SELF en Sess..."[/rml] -> het staat zelfs in je topic :x

United we stand, and divided we fall


Verwijderd

Topicstarter
blizt schreef op dinsdag 08 februari 2005 @ 16:03:
Zeg je dat je wat doet en doe je niets, of zeg je dat je wat doet en doe je dat niet goed?
Anders gezegd: doe zelf ook 'ns beetje onderzoek ...
[rml]blizt in "[ PHP+IIS] Problemen met PHP_SELF en Sess..."[/rml] -> het staat zelfs in je topic :x
Ik heb ook gekeken naar die post, alleen daar ging jij er volgens mij nog vanuit dat ik niet met een index.php werkte die alles included. Daar vraag ik toch ook specifiek naar? het komt blijkbaar heel precies aan met dat ob_start, session_start enz. dus vandaar dat ik het vraag.

Om antwoord te geven op je vraag: ik zeg dat ik wat doe, doe het ook, alleen doe ik het nog niet helemaal goed.. ;)

  • blizt
  • Registratie: Januari 2003
  • Laatst online: 01-05 08:39

blizt

Wannabe-geek

Dan speciaal voor jou nog even:
PHP:
1
2
3
4
5
6
<?php
sesson_start();
ob_start();
//javascriptje en andere output
include('jedingetje.php');
?>

In jedingetje.php:
PHP:
1
2
3
//code
header();
ob_end_flush();


Gaat dat lukken denk je?

United we stand, and divided we fall


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:11

Creepy

Tactical Espionage Splatterer

Zo gaat het nergens meer over.

belgie: je moet met de gegevens hint en tips nu echt wel in staat zijn om dit op te lossen.

[ Voor 63% gewijzigd door Creepy op 08-02-2005 16:51 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.