Archief - PHP: inlogsysteem > inloggen lukt, maar klein probleem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

FmTx

Legacy Member
Hallo ;)

Ik ben php aan het leren (zelfstudie) met een online "cursus" die ik gevonden heb in de webmastergids hier op het forum. Nu, het inlogsysteem dat ik geschreven heb werkt, maar niet volledig zoals ik het zou willen.
PS: Ja, ik weet dat ik nog geen mogelijkheid voor uit te loggen heb geschreven, maar dat komt nog wel.

Even uitleggen:

eerste bezoek:
start sessie en kijken of de surfer al authenticated is, indien niet > toon login formulier'tje met de require()-functie. alles nog ok, ik log in: "Welcome" word weergegeven, maar het login-formulier verdwijnt niet tot ik de pagina nog eens herlaad.

Ik moet dus inloggen en pagina refreshen, dan pas verdwijnt het loginformulier
(username:__________ , password:_________ )


hoe kan ik dit probleem oplossen?? - zie code hieronder


test_login.php
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>

<?php
//-- connectie maken
require("connect.php");

//-- start sessie
session_start();
if (!$_SESSION['auth'] == 1)
{
	require("_login.php"); // toon login-formulier indien (nog) niet authenticated.
	
//-- formulier gepost?
	if(isset($_POST['submit'])) 
	{
//-- alles netjes ingevuld?
		if( !empty($_POST['username']) && !empty($_POST['password']) )
		{ // alles netjes ingevuld? -> ja
			$username=$_POST['username'];
			$password=$_POST['password'];
			if( isset($username, $password) )
			{
				$query="select user_id from `_users` where user_name=\"".$username."\" and user_password=\"".sha1($password)."\"";
				$result=mysql_query($query) or die(mysql_error());
				if( mysql_num_rows($result) )
				{ // account is geldig
					echo "Welcome, $username.";
					$_SESSION['auth'] = 1;
					setcookie("username", $_POST['username'], time()+(84600*30)); // 30 dagen geldig. 
					unset($username, $password);
				}
				else
				{ // foutieve username en/of password
					echo "Could not login. Please try again.";
				}
			}
			else 
			{ // iets misgelopen..
				echo "Error: Something's wrong!";
			}
		}
		else
		{ // alles netjes ingevuld? -> nee
			echo "Error: Please fill in your username and password.";
		}
	}
}
else
{
	echo "Welcome, ".$_COOKIE['username']; // probleem: er verschijnt wel "Welcome" maar login-formulier staat er nog, tot ge de pagina refresht/opnieuw open doe..
}
//-- free memory
mysql_free_result($result);

//-- disconnect
mysql_close($connection); 
?>
</body>
</html>


_login.php
PHP:
<form name="login" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  username: <input type="text" name="username" />
  password: <input type="password" name="password" />
  <input type="submit" name="submit" value="login" />
</form>

Indien nodig post ik de inhoud van connect.php ook, maar dit leek me niet relevant.
ALVAST BEDANKT


screenshots ter verduidelijking:

1) eerste_bezoek.png
2) ingelogd.png
3) ingelogd_en_refreshed.png

Radiance

Legacy Member
De cookie array wordt maar een keer gevuld, voor het inlezen van uw PHP code, aanpassingen die je doet met setcookie() zijn inderdaad pas beschikbaar in een volgende request.

Work Around : zelf $_COOKIE opvullen vlak na setcookie() of een andere variabele gebruiken enkel voor de eerste 'poging' tot lezen.

Dit staat ook in de common pitfalls op php.net ;)

killgore

Legacy Member
Of een refresh/redirect doen (zoals bv. vbulletin ook doet ;)).

Of werken met sessies (meestal worden cookies niet als working vars gebruikt).

FmTx

Legacy Member
ok het werkt nu, heb dit als oplossing gebruikt:

header("location:test_login.php"); toegevoegd na setcookie() in de zelfde blok nog.

PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>

<?php
//-- connectie maken
require("connect.php");

//-- start sessie
session_start();
if (!$_SESSION['auth'] == 1)
{
	require("_login.php"); // toon login-formulier indien (nog) niet authenticated.
	
//-- formulier gepost?
	if(isset($_POST['submit'])) 
	{
//-- alles netjes ingevuld?
		if( !empty($_POST['username']) && !empty($_POST['password']) )
		{ // alles netjes ingevuld? -> ja
			$username=$_POST['username'];
			$password=$_POST['password'];
			if( isset($username, $password) )
			{
				$query="select user_id from `_users` where user_name=\"".$username."\" and user_password=\"".sha1($password)."\"";
				$result=mysql_query($query) or die(mysql_error());
				if( mysql_num_rows($result) )
				{ // account is geldig
					echo "Welcome, $username.";
					$_SESSION['auth'] = 1;
					setcookie("username", $_POST['username'], time()+(84600*30)); // 30 dagen geldig. 
					unset($username, $password);
					header("location:test_login.php"); // oplossing :)
				}
				else
				{ // foutieve username en/of password
					echo "Could not login. Please try again.";
				}
			}
			else 
			{ // iets misgelopen..
				echo "Error: Something's wrong!";
			}
		}
		else
		{ // alles netjes ingevuld? -> nee
			echo "Error: Please fill in your username and password.";
		}
	}
}
else
{
	echo "Welcome, ".$_COOKIE['username'];
}
//-- free memory
mysql_free_result($result);

//-- disconnect
mysql_close($connection); 
?>
</body>
</html>
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan