Beste PHP'ers,

In de website van een kennis heb ik enige tijd geleden een inlogscript geimplementeerd. Hoewel deze heel eenvoudig in elkaar steekt, werkt hij bij sommige mensen structureel niet (in IE). Het vreemde is dat als iemand correct inlogt, er geen sessie aangemaakt wordt. Logt hij nog een keer correct in, dan wel. Zelf heb ik hier geen last van...

Om zeker te weten dat het aan het script ligt, heb ik het script uit de website gehaald, met hetzelfde resultaat. FF gebruikers loggen gewoon in, bij IE kunnen enkele gewoon inloggen.

Om in te loggen gewoon een formulier:


<form method="POST" action="checklogin.php" name="login">
				UserID: <input name="id" type="text" />
				Password: <input name="pass" type="password" />
				<input type="hidden" name="action" value="loginvenster1" />
				<input type="submit" value="Login" />
			</form> 


Checklogin.php controleert de code:

<?php

//Open sessions.
session_start();

//Controleer welk inlogmenu gebruikt is en stel in welk wachtwoord daar voor nodig is. In de website zitten namelijk twee verschillende inlogvensters...

switch ($_POST['action']) {
	case  'loginvenster1': 
		$id = "gebruikersnaam";
		$pass = "167cd0c7f052608fbeace43abdfbf792e034cbd7";
		$location = "inlogpagina1.php";
		$referrer = "beveiligdepagina1.php"; break;
	case 'loginvenster2':
		$id = "gebruikersnaam";
		$pass = "0307ccb8f25d95c29871da7abd56929376a093f2";
		$location = "inlogpagina2.php";
		$referrer = "beveiligdepagina2.php"; break;
}
	
//Vergelijk of het ingevoerde overeenkomt met het benodigde wachtwoord.
if($_POST['id'] == $id && sha1($_POST['pass']) == $pass) {
	$_SESSION[$_POST['action']] = "Session" . $_POST['action'];
	header('Location: ' . $referrer);
} else {
	header('Location: ' . $location . "?inlog=false");
}?>


Op de beveiligde pagina wordt gecontroleerd of ingelogd is door de sessie te controleren:

<?php
//Controleer of de gebruiker ingelogd is.
session_start();
if(isset($_SESSION['loginvenster1']) && $_SESSION['loginvenster1'] == 'Sessionloginvenster1') { ?>

<p>Succesvol ingelogd</p>

<?php
} else {
	header('Location: inlogpagina1.php');
}
?>


Er hebben al meerdere programmeurs naar dit probleem gekeken, geen weet de oplossing. Het uitlezen van de sessiewaardes laat zien dat hij bij sommige mensen na de eerste keer succesvol inloggen geen sessie wordt gemaakt. Waarom gaat dit de tweede keer dan wel goed? En waarom IE soms niet, mozilla en chrome wel? Als iemand een tip heeft, dan hoor ik het graag!

Bij voorbaat dank,

Theforce117
@arnout Rijpkema: in het laatste codeblok staat $_SESSION[$_POST['action']] = "Session" . $_POST['action'];. In het formulier staat een hidden 'action' met value 'leden'. Oftewel: $_SESSION['leden'] = "Sessionleden".

@Evert: Alle bestanden zijn nagelopen: er zit geen witruimte voor elke <?php...
Doe op eens print_r($_SESSION);

<?php

//Open sessions.
session_start();

ini_set('display_errors',1);
error_reporting(E_ALL);

//Controleer welk inlogmenu gebruikt is en stel in welk wachtwoord daar voor nodig is.

switch ($_POST['action']) {
    case  'leden': 
        $id = "gebruikersnaam";
        $pass = "433cd0c7f052608fbeace43abdfbf792e034cbd7";
        $location = "inlogvenster1.php";
        $referrer = "beveiligdepagina1.php"; break;
    case 'inlogvenster2':
        $id = "gebruikersnaam";
        $pass = "0807ccb8d25d95c29871da7abd56929376a093f2";
        $location = "inlogvenster2.php";
        $referrer = "beveiligdepagina2.php"; break;
}
    
//Vergelijk of het ingevoerde overeenkomt met het benodigde wachtwoord.
if($_POST['id'] == $id && sha1($_POST['pass']) == $pass) {
    $_SESSION[$_POST['action']] = "Session" . $_POST['action'];
     print_r($_SESSION); // geeft wel een fout op de volgende regel
    header('Location: ' . $referrer);
} else {
    //header('Location: ' . $location . "?inlog=false");
}
?> 
Met print_r($_SESSION) krijg ik bij mij de correcte sessiegegevens:

Array
(
[leden] => Sessionleden
[inlogvenster2] => Sessioninlogvenster2
)

Bij mensen waar de website niet goed werkte wordt de eerste keer geen sessievariabele aangemaakt en na de tweede keer inloggen wel. Kan dit wel aan PHP liggen? Aangezien PHP server-side is zou het overal op dezelfde manier moeten reageren. Maar aan de andere kant: waar kan het dan wel aan liggen, aangezien deze code bijna alleen uit PHP bestaat?
Misschien moet je met je html-headers de cache legen.

<meta http-equiv="expires" content="0" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
Het cache had inderdaad roet in het eten kunnen gooien. Helaas heb ik net een mail ontvangen dat het probleem nog steeds aanwezig is. sessions.use_cookies staat in het php ini bestand op "on" en sessions.use_only_cookies staat op "off". Zou het probleem hiermee te maken kunnen hebben? Dat IE bij bepaalde instellingen anders om gaat met cookies als dat het zou moeten?

Reageren