I am trying to implement a relatively complete login system code for my
website, but the code is a bit dated ($HTTP_POST_VARS for example).
I am not too familiar with classes and I'm having trouble with this one.
I have an include which is the login form if the SESSION is not set, and a
mini control panel when it is.
I will post the code below because it is a bit extensive. My problem: When I
try to log in (POST username/password to same page and validate with the
class, the page simply reloads MINUS THE FORM SUBMIT BUTTON. It's very odd.
I have a working system on another website without using this class, I just
hoping to be more object-oriented with this one.
Like I said, the code is a bit lengthy, and if you are kind enough to take a
look at I can even send you the php files for the sake of readability (ie.
formatted better than here).
Anything you can help with would be greatly appreciated; I'll have my wife
bake you some cookies or something!
The basic page looks like this:
<?php
// Get the PHP file containing the DbConnector class
require_once('../includes/DbConnector.php');
// Create an instance of DbConnector
$connector = new DbConnector();
// sets $thispage and $directory
include('../includes/pagedefinition.php');
// Include functions
require_once('../includes/functions.php');
//content
include('../includes/signupform.php');
include('../includes/signup_val_inser_eml.php');
include('../includes/signinform.php');
include('../includes/header.php');
include('../includes/body.php');
?>
The page definition file looks like this:
<?php
require_once("Sentry.php");
if ($_GET['action'] == 'logout'){
if ($sentry->logout()){
echo '<p align=\"center\" class=\"confirm\">You have been logged
out</p><br>';
}
}
. . . // site content-grabbing code excluded ///
// Attempted login url - use for redirect after login.
$redirect =
"http://mwclans.com/{$_SERVER['REQUEST_URI'<http://mwclans.com/%7B$_SERVER['REQUEST_URI'>
]}";
// Defined in includes/Sentry.php
$sentry = new Sentry();
// If logging in, POST['login'] will be set - check credentials (9 is used
to specify the minimum group level that's allowed to access this resource)
if ($_POST['login'] != ''){
$sentry->checkLogin($_POST['username'],$_POST['password'],9,'$redirect',/user/index.php');
}
if ($minlevel < 9)
{
if (!$sentry->checkLogin($minlevel) ){ header("Location:
/user/<http://www.mwclans.com/user/>");
die(); }
}
?>
Here is the Sentry class:
<?php
////////////////////////////////////////////////////////////////////////////////////////
// Class: sentry
// Purpose: Control access to pages
///////////////////////////////////////////////////////////////////////////////////////
class sentry {
var $loggedin = false; // Boolean to store whether the user is logged in
var $userdata; // Array to contain user's data
function sentry(){
session_start();
header("Cache-control: private");
}
//======================================================================================
// Log out, destroy session
function logout(){
if (is_object($this->userdata))
{
unset($this->userdata);
$session_name = session_name();
return true;
}
else
{
$message = "<p align=\"center\" class=\"error\">Call to non-object by
function: logout()</p>";
}
}
//======================================================================================
// Log in, and either redirect to goodRedirect or badRedirect depending on
success
function checkLogin($username = '',$password = '',$role_id =
9,$goodRedirect = '',$badRedirect = ''){
// Include database and validation classes, and create objects
require_once('DbConnector.php');
require_once('Validator.php');
$validate = new Validator();
$loginConnector = new DbConnector();
// If user is already logged in then check credentials
if ($_SESSION['username'] && $_SESSION['password']){
// Validate session data
if (!$validate->validateTextOnly($_SESSION['username'])){return false;}
if (!$validate->validateTextOnly($_SESSION['password'])){return false;}
$getUser = $loginConnector->query("SELECT * FROM user WHERE username =
'".$_SESSION['username']."' AND password = '".$_SESSION['password']."' AND
role_id <= ".$role_id.' AND verified = 1');
if ($loginConnector->getNumRows($getUser) > 0){
// Existing user ok, continue
if ($goodRedirect != '') {
header("Location: ".$goodRedirect."?".strip_tags(session_id())) ;
}
return true;
}else{
// Existing user not ok, logout
$this->logout();
return false;
}
// User isn't logged in, check credentials
}else{
// Validate input
if (!$validate->validateTextOnly($username)){return false;}
if (!$validate->validateTextOnly($password)){return false;}
// Look up user in DB
$getUser = $loginConnector->query("SELECT * FROM user WHERE username =
'$username' AND password = PASSWORD('$password') AND role_id <= $role_id AND
verified = 1");
$this->userdata = $loginConnector->fetchArray($getUser);
if ($loginConnector->getNumRows($getUser) > 0){
// Login OK, store session details
// Log in
$_SESSION["username"] = $username;
$_SESSION["password"] = $this->userdata['password'];
$_SESSION["user_id"] = $this->userdata['user_id'];
$_SESSION["role_id"] = $this->userdata['role_id'];
if ($goodRedirect) {
header("Location: ".$goodRedirect."?".strip_tags(session_id())) ;
}
return true;
}else{
// Login BAD
unset($this->userdata);
if ($badRedirect) {
header("Location: ".$badRedirect) ;
}
return false;
}
}
}
}
?>
And here is the login page:
<?php
$loginsettingquery = "SELECT * FROM site_settings WHERE name='login'";
$loginsettingresult = $connector->query($loginsettingquery);
$loginsettinginfo = $connector->fetchArray($loginsettingresult);
$currentpage =
"http://mwclans.com/{$_SERVER['REQUEST_URI'<http://mwclans.com/%7B$_SERVER['REQUEST_URI'>
]}";
if (isset($_SESSION['username']) && isset($_SESSION['password'])) // display
other info, else display login form
{
// logged-in user tools
}
else
{
if ($loginsettinginfo['value'] == 1 || $directory == "cmsadmin")
{
$signinform = <<<END
<table width="250" align="center" border="0" cellspacing="0" cellpadding="3"
class="contentbox">
<tr>
<td colspan="2" bgcolor="#000000"><b>Login</b></td>
</tr>
<tr>
<td align="right"><span style="cursor:default;">Username:</td>
<td style="vertical-align:top">
<form name="login" method="post" action="$currentpage">
<input type="hidden" name="login" value="1">
<input name="username" type="text" size="15" id="username" /></td>
</tr>
<tr valign="center">
<td align="right"><span style="cursor:default;">Password:</td>
<td style="vertical-align:top;">
<input name="password" type="password" size="15" id="password" /></td>
</tr>
<tr>
<td colspan="2" align="right"></td>
</tr>
</table></form>
END;
}
else
{
// login disabled message
}
}
?>