Creating a PHP Login
Notes
There are a
few things you should know
before you attempt to use
this script. The next
release of
PHP will have
register_globals set to Off
by default. You're
encouraged to write your
scripts with this in mind,
in this article we won't be
using normal variables, we
will be using $_POST,
$_GET... etc. These were
introduced in PHP 4.1.0,.
We will also
be using
sessions with PHP, if
you don't understand
sessions, or don't know what
they are it would be a good
idea to
read the page so you can
understand the coding, and
edit it to your needs.
I will be
using the
PEAR::DB classes to
access the database, so you
can easily make the scripts
work with whatever database
you are using. If you are
unfamiliar with PEAR::DB
read this great article:
Abstract PHP's database code
with PEAR::DB.
With this in
mind, I recommend using a .htaccess
file (if you use apache) to
set some PHP values, use the
following, if relevant.
php_value
register_globals
Off
php_value
track_vars
On
php_value
arg_separator.output
"&"
php_value
arg_separator.input
"&" |
|
Planning
We want a
system that will allow a
user to 'login', preserve
that user's login data
across multiple requests,
allow them access to certain
areas only when they are
logged in, and allow them to
be able to logout. So let's
think logically, what do we
need?
-
User
database, containing
their password,
username, and some
personal information to
create a community feel.
-
Allow
them to 'sign up' if
they aren't a member.
-
A method
of checking whether or
not the user is 'logged
in.'
-
Allow
them to 'log in' if
they're not.
-
Allow
them to 'log out' when
they are done.
Now we need
to turn that logic into
code, so let us continue....
User
database
We need a
place to store user
information. We need to be
able to extract this data to
authenticate them and insert
new data for new members.
This article will use an SQL
database for this. We need
to design the user database,
but first of all we need to
connect to the database.
Connecting
We are using
the PEAR::DB classes for
more portable database
coding, rather than using
database-specific functions.
db_connect.php
There we have
it, that script will create
a connection object which we
can use in other scripts to
do stuff with the database.
This script should be put
outside your document tree,
or in a protected directory
to prevent people accessing
it directly. There are
various things you need to
customise.
-
$db_engine
- Your database engine,
a list of possible
values is below.
-
$db_user
- Your username to
access the database.
-
$db_pass
- Your password.
-
$db_host
- The host of the
database server.
-
$db_name
- The name of the
database to connect to.
A list of
possible database engine
values are:
So now we
have our connection to the
database, save this file as
db_connect.php. Next we need
to design the database, I am
providing a script that will
create this table for you.
Our Table
(table.php)
That script
will create a table in the
database you specified, once
you have executed this
script you can take it out
of your document tree so
others cannot run it. We
will use this table to store
user information, retrieve
it and check it. Now we need
to allow users to become
members.
Allow Them To
"Sign Up"
A user
database is no good unless
we have users in it, so we
need to allow users to add
themselves, we use a simple
form to allow them to pick a
username, password, enter
their e-mail address and any
other information they
choose, and then insert this
data into the database.
Register.php
The above
script allows the user to
register an account,
inserting their data into
the database, we must
perform various checks
before we allow this.
Checking if the username has
been taken, if their
passwords matched, and a few
security checks. We also
encrypt the password in the
database for extra security.
If all checks are okay we
insert the data. Now the
user is in the database, we
still have to allow them to
login, but first we need to
write the script that will
check if they are logged in
or not.
Check if they
are "logged in"
This script
will assign a variable,
$logged_in to either 1 (if
they are logged in), or 0 if
they aren't. We can then use
this variable in our
scripts. A few points:
-
We are
going to use
$_SESSION['username']
for our user's username
and
$_SESSION['password']
for their password.
-
$_SESSION['password']
will be encrypted.
-
We need
to start our session
somewhere, here is a
good place.
check_login.php
|
|
What we did
here was:
If
session variables aren't
set, they're not logged
in. If they are set,
fetch the password row
from the database where
the username is equal to
the session variable
username. If password
cannot be fetched, the
username mustn't exist,
kill bad session
variables. If the
password is fetched,
username is correct,
compare the encrypted
password from the
database to the session
variable password, if it
matches log them in, if
not the password is
incorrect. Don't set
them as logged in and
kill bad session
variables.
So now we
have our database
connection, users can
register accounts, we are
capable of checking whether
they are logged in or not.
We can use $logged_in in our
scripts now. All that is
left is to allow users to
log in and log out.
Allow them to
'log in'
Now we need
to create the script that
will allow the user to
submit their username and
password, check if they are
correct and, if so, register
them as session variables.
Once we register the session
variables the user will be
deemed as "logged in",
$logged_in will be true
until they 'log out.'
login.php
|
|
Now we have
our 'log in' script. When
the user loads this page
they are presented with a
form that allows them to
submit their username and
password. We then check if
thatsuers is in the
database, if it is we take
the password associated with
that username and compare it
with the user's submitted
password, if they match the
user submitted the correct
information. We can register
the username and password
(encrypted) as session
variables. Now these session
variables will be subject to
inspection by the
check_login.php script,
authenticating the user each
time a page is loaded,
allowing us to use our
$logged_in variable to check
for a correct log in. When
the user has done, it's a
good idea to allow them to
"log out".
Allow them to 'log out'
To log a user
out we simply destroy their
session variables and their
session.
logout.php
That script
is very simple, once the
session variables are unset
the check_login.php script
will set $logged_in to zero,
so they will not be classed
as "logged in".
Usage
Now we have
the base of a login system,
so let's look at a practical
usage of these scripts. A
page would look like so:
example.php
|
|
This makes it
very easy to restrict access
to a document, only a person
whose information has been
authenticated by
check_login.php will be able
to view the page, the others
will be offered a link to
'log in.'
More...
There are
various ways we can jazz up
this little member system,
such as a user online
script, a member list,
member profiles, instant
message system... the list
goes on and on. This is the
bear minumum, it's up to you
to edit it to your needs, if
you need any help use the
comments system below and
someone will answer.
We can use
$_SESSION['username'] to
interact with the database
row associated with the
current logged in user,
$logged_in to check for a
positive login, we can do
just about anything now. We
could do this:
example2.php
|
|
Showing the
user what name they are
logged in as and offering a
link to logout, while they
are logged in, or telling
them they aren't logged in
and offering them a link to
do so, if they're not logged
in.
The list
really is endless, I cannot
really include more, this
article is long enough, if
you would like to see a
how-to on a few things you
can do with this, leave a
comment below, if there is
enough interest I will find
the time to write it.
Conclusion
Remember this
script isn't ready-to-go,
you will need to do some
editing. The layout of each
page leaves a lot to be
desired, jazz them up, you
can add more to the user
table, create different user
levels so members have
different access rights
depending on their rank --
be creative. Just rememeber
to include the
db_connect.php script in any
document that is part of the
member system.
Here are a
few links that may help you
get to grips with the
features discussed in this
article.
|