Forum Moderators: coopster
"http://www.evolt.org/article/comment/17/60265/index.html", and it says that it can let the user login automatically when the user come back next time, it is like the webmasterworld does. But i found it just works for sometimes, not all the time. Could you help, please.
The following code for setup two cookies to remenber the username, and passward, which is from the bottom code of login.php file.
<code>
/**
* This is the cool part: the user has requested that we remember that
* he's logged in, so we set two cookies. One to hold his username,
* and one to hold his md5 encrypted password. We set them both to
* expire in 100 days. Now, next time he comes to our site, we will
* log him in automatically.
*/
if(isset($_POST['remember'])){
setcookie("cookname", $_SESSION['username'], time()+60*60*24*100, "/");
setcookie("cookpass", $_SESSION['password'], time()+60*60*24*100, "/");
}
</code>
please go to the my website "<snip>", and type the user name with aaa, and the passward with 123. Then you will log in. but the website does not let me automatically log in next time after i close the website and come back to the website again( i didn't log out the page, i just close the website and leave away and come back).
Like the webmasterworld, i just type the url into the browser, then it let me automatically log into the page, and it does not ask me user name and passawrd.
[edited by: engine at 2:47 pm (utc) on Dec. 7, 2006]
[edit reason] See TOS [webmasterworld.com] [/edit]
You are sending something before setting the cookie (cookie has to be set before you send anything!).
Check if you don't echo anything, you can't even have one space or line before <?php sign.
Then it should work fine
Regards
Michal
<code>
/* Quick self-redirect to avoid resending data on refresh */
echo "<meta http-equiv=\"Refresh\" content=\"0;url=$HTTP_SERVER_VARS[PHP_SELF]\">";
return;
"
</code>
and it also give me massage as following, you can check my page <removed> which i take off the redirect code already.
Warning: Cannot modify header information - headers already sent by (output started at /home/wbusines/public_html/login.php:5) in /home/wbusines/public_html/login.php on line 155
Warning: Cannot modify header information - headers already sent by (output started at /home/wbusines/public_html/login.php:5) in /home/wbusines/public_html/login.php on line 156
[edited by: jatar_k at 4:44 pm (utc) on Dec. 7, 2006]
[edit reason] no urls thanks [/edit]
/* Username and password correct, register session variables */
$_POST['user'] = stripslashes($_POST['user']);
$_SESSION['username'] = $_POST['user'];
$_SESSION['password'] = $md5pass;
/**
* This is the cool part: the user has requested that we remember that
* he's logged in, so we set two cookies. One to hold his username,
* and one to hold his md5 encrypted password. We set them both to
* expire in 100 days. Now, next time he comes to our site, we will
* log him in automatically.
*/
if(isset($_POST['remember'])){
setcookie("cookname", $_SESSION['username'], time()+60*60*24*100, "/");
setcookie("cookpass", $_SESSION['password'], time()+60*60*24*100, "/");
}
<code>
<?
session_start();
?>
<?
/**
* Checks whether or not the given username is in the
* database, if so it checks if the given password is
* the same password in the database for that user.
* If the user doesn't exist or if the passwords don't
* match up, it returns an error code (1 or 2).
* On success it returns 0.
*/
function confirmUser($username, $password){
global $conn;
/* Add slashes if necessary (for query) */
if(!get_magic_quotes_gpc()) {
$username = addslashes($username);
}
/* Verify that user is in database */
$q = "select password from users where username = '$username'";
$result = mysql_query($q,$conn);
if(!$result ¦¦ (mysql_numrows($result) < 1)){
return 1; //Indicates username failure
}
/* Retrieve password from result, strip slashes */
$dbarray = mysql_fetch_array($result);
$dbarray['password'] = stripslashes($dbarray['password']);
$password = stripslashes($password);
/* Validate that password is correct */
if($password == $dbarray['password']){
return 0; //Success! Username and password confirmed
}
else{
return 2; //Indicates password failure
}
}
/**
* checkLogin - Checks if the user has already previously
* logged in, and a session with the user has already been
* established. Also checks to see if user has been remembered.
* If so, the database is queried to make sure of the user's
* authenticity. Returns true if the user has logged in.
*/
function checkLogin(){
/* Check if user has been remembered */
if(isset($_COOKIE['cookname']) && isset($_COOKIE['cookpass'])){
$_SESSION['username'] = $_COOKIE['cookname'];
$_SESSION['password'] = $_COOKIE['cookpass'];
}
/* Username and password have been set */
if(isset($_SESSION['username']) && isset($_SESSION['password'])){
/* Confirm that username and password are valid */
if(confirmUser($_SESSION['username'], $_SESSION['password'])!= 0){
/* Variables are incorrect, user not logged in */
unset($_SESSION['username']);
unset($_SESSION['password']);
return false;
}
return true;
}
/* User not logged in */
else{
return false;
}
}
/**
* Determines whether or not to display the login
* form or to show the user that he is logged in
* based on if the session variables are set.
*/
function displayLogin(){
global $logged_in;
if($logged_in){
echo "<h1>Logged In!</h1>";
echo "Welcome <b>$_SESSION[username]</b>, you are logged in. <a href=\"logout.php\">Logout</a>";
}
else{
?>
<html>
<center>
<h1>Login</h1>
</center>
<body>
<center>
<form action="" method="post" >
<table align="center" border="0" cellspacing="0" cellpadding="3">
<tr><td align="center">Username:</td><td align="center"><input type="text" name="user" maxlength="30"></td></tr>
<tr><td align="center">Password:</td><td align="center"><input type="password" name="pass" maxlength="30"></td></tr>
<tr><td align="center" colspan="2" ><input type="checkbox" name="remember">
<font size="2">Remember me next time</td></tr>
<tr><td colspan="2" align="center"><input type="submit" name="sublogin" value="Login"></td></tr>
<tr><td align="center" colspan="2" ><a href="register.php">Join</a></td></tr>
</table>
</form>
</center>
</body>
</html>
<?
}
}
/**
* Checks to see if the user has submitted his
* username and password through the login form,
* if so, checks authenticity in database and
* creates session.
*/
if(isset($_POST['sublogin'])){
/* Check that all fields were typed in */
if(!$_POST['user'] ¦¦!$_POST['pass']){
die('You didn\'t fill in a required field.');
}
/* Spruce up username, check length */
$_POST['user'] = trim($_POST['user']);
if(strlen($_POST['user']) > 30){
die("Sorry, the username is longer than 30 characters, please shorten it.");
}
/* Checks that username is in database and password is correct */
$md5pass = md5($_POST['pass']);
$result = confirmUser($_POST['user'], $md5pass);
/* Check error codes */
if($result == 1){
die('That username doesn\'t exist in our database.');
}
else if($result == 2){
die('Incorrect password, please try again.');
}
/* Username and password correct, register session variables */
$_POST['user'] = stripslashes($_POST['user']);
$_SESSION['username'] = $_POST['user'];
$_SESSION['password'] = $md5pass;
/**
* This is the cool part: the user has requested that we remember that
* he's logged in, so we set two cookies. One to hold his username,
* and one to hold his md5 encrypted password. We set them both to
* expire in 100 days. Now, next time he comes to our site, we will
* log him in automatically.
*/
if(isset($_POST['remember'])){
setcookie("cookname", $_SESSION['username'], time()+60*60*24*100, "/");
setcookie("cookpass", $_SESSION['password'], time()+60*60*24*100, "/");
}
}
/* Sets the value of the logged_in variable, which can be used in your code */
$logged_in = checkLogin();
?>
</code>
But i got some question from you
1)> You are sending something before setting the cookie (cookie has to be set before you send anything!).
Does the following code sending the url aways, and that why you disable it?
/* Quick self-redirect to avoid resending data on refresh */
echo "<meta http-equiv=\"Refresh\" content=\"0;url=$HTTP_SERVER_VARS[PHP_SELF]\">";
return;
"
2)>Check if you don't echo anything, you can't even have one space or line before
give me some example, please
> depends, what you are doing in that function... So it's not >working?
It works fine, I just wonder why it can let me log in automaticaly after i take off the "/* Quick self-redirect to avoid resending data on refresh */
echo "<meta http-equiv=\"Refresh\" content=\"0;url=$HTTP_SERVER_VARS[PHP_SELF]\">";
return; ". And you say the cookies have to set up befoer anything.
but in here, the redirect is placed after the cookies set up, That's why i am so confuse with the word you said. Could you explain agian,
why it work now after i disable the redirect? Thanks
>depends, what you are doing in that function...
and the fuction does the job of checking of the user name and passward exist in the database or not.
confirmUser($_POST['user'], $md5pass);
the whole code as following
/**
* Checks whether or not the given username is in the
* database, if so it checks if the given password is
* the same password in the database for that user.
* If the user doesn't exist or if the passwords don't
* match up, it returns an error code (1 or 2).
* On success it returns 0.
*/
function confirmUser($username, $password){
global $conn;
/* Add slashes if necessary (for query) */
if(!get_magic_quotes_gpc()) {
$username = addslashes($username);
}
/* Verify that user is in database */
$q = "select password from users where username = '$username'";
$result = mysql_query($q,$conn);
if(!$result ¦¦ (mysql_numrows($result) < 1)){
return 1; //Indicates username failure
}
/* Retrieve password from result, strip slashes */
$dbarray = mysql_fetch_array($result);
$dbarray['password'] = stripslashes($dbarray['password']);
$password = stripslashes($password);
/* Validate that password is correct */
if($password == $dbarray['password']){
return 0; //Success! Username and password confirmed
}
else{
return 2; //Indicates password failure
}
}
Headers consist of:
1. setting cookies (setcookie)
2. information about server
3. information about opened file
4. redirecting (header("Location: http://www.example.com");
However if you use the meta, then html is responsible for redirection, not the header. Therefore it will work after setcookie
2.
examples of wrong setcookie:
- character before <?
<?php
setcookie("name", "value", time()+60*60*24*100, "/");
?>
<?php
session_start();
?>
<?php
setcookie("name", "value", time()+60*60*24*100, "/");
?>
<?php
echo "This is test page. ";
setcookie("name", "value", time()+60*60*24*100, "/");
?>
<html>
<head>
<?php
setcookie("name", "value", time()+60*60*24*100, "/");
?>
The above examples are all wrong - headers are already sent. I hope this cleares things for you.
Michal