PHP + MYSQL alapú beléptető rendszer
A következő segédletben egy PHP + MYSQL alapú beléptető rendszert mutatok be. A script mysql adatbázisban tárolja a felhasználók adatait. Lehetőség van regisztrációra, belépésre, kilépésre, valamint csak regisztrált felhasználóknak elérhető tartalom létrehozására.
Az adatbázis szerkezet így fog kinézni.
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
nick VARCHAR( 255 ) ,
password VARCHAR( 255 ) ,
email VARCHAR( 255 )
)
A jelszavakat egyirányú md5() függvénnyel hasheljük, valamint hozzá adunk egy privát kulcsot is. Így ha véletlen illetéktelen kezekbe kerül, az adatbázisunk, nem tudnak vele mit kezdeni.
Első lépésben íjuk meg a regisztrációt! register.php
include "config.php";
include "functions.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=iso-8859-2" />
<link href="layout.css" type="text/css" rel="stylesheet" />
<title>Regisztráció</title>
</head>
<body>
<?php if(!empty($_GET['ok'])):?>
Sikeres regisztráció!<br />
<a href='index.php'>Főoldal</a>
<?php else:?>
<?php
if(!empty($_POST['regisztracio']))
{
$result = reg_check($_POST,$conn);
if ($result === true){
add_user($_POST,$private_key,$conn);
header("Location: register.php?ok=1");
} else {
echo $result;
}
}
?>
<form method="post" action="">
<table>
<tr>
<td>Nick:</td>
<td><input type="text" name="nick" class='reg_input' value='<?php if(!empty($_POST['nick'])){echo $_POST['nick'];}?>'/></td>
</tr>
<tr>
<td>E-mail cím:</td>
<td><input type="text" name="email" class='reg_input' value='<?php if(!empty($_POST['email'])){echo $_POST['email'];}?>' /></td>
</tr>
<tr>
<td>Jelszó:</td>
<td><input type="password" name="pass1" class='reg_input' /></td>
</tr>
<tr>
<td>Jelszó mégegyszer:</td>
<td><input type="password" name="pass2" class='reg_input' /></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="regisztracio" value="regisztrálok" class='reg_button' />
</td>
</tr>
</table>
</form>
<?php endif;?>
</body>
</html>
Ez alapértelmezett állapotban egy regisztrációs űrlap. Ha az űrlapot kitöltötték, akkor a reg_check() függvény ellenőrzi az adatokat, majd az add_user() függvény beszúrja az új felhasználót. Ekkor eltűnik a form, és egy üzenet jelenik meg, a sikeres regisztrációról. A konfigurációs fájl így néz ki: config.php
$db_host = "localhost";
$db_user = "root";
$db_pass = "";
$db_name = "segedletek_demok";
$conn = mysql_connect($db_host,$db_user,$db_pass);
mysql_select_db($db_name);
mysql_query("SET NAMES LATIN2");
$private_key = "Ez egy zart kulcs!";
define('ERROR_ALL_MUST',"Minden mező kitőltése kötelező!");
define('ERROR_INVALID_NICK',"Nem megengedett karakterek a nickben!");
define('ERROR_INVALID_EMAIL',"Ez nem egy valós e-mail cím!");
define('ERROR_USED_NICK',"Ez a nick már használatban van!");
define('ERROR_USED_EMAIL',"Ez az e-mail cím már használatban van!");
define('ERROR_PASSWORD_NO_MATCH',"A két jelszó nem egyezik!");
define('ERROR_LOGIN_ERROR',"Hibás név vagy jelszó!");
Itt definiáljuk a mysql kapcsolathoz szükséges dolgokat, a zárt kulcsunkat, valamint a később használatos hibaüzeneteket.
A register.php függvényei a functions.php-ben vannak.
function reg_check($data,$conn)
{
if(!all_completed($data)){return ERROR_ALL_MUST;}
if(!valid_nick($data['nick'])){return ERROR_INVALID_NICK;}
if(!valid_email($data['email'])){return ERROR_INVALID_EMAIL;}
if(is_used_nick($data['nick'],$conn)){return ERROR_USED_NICK;}
if(is_used_email($data['email'],$conn)){return ERROR_USED_EMAIL;}
if(!password_match($data['pass1'],$data['pass2'])){return ERROR_PASSWORD_NO_MATCH;}
return true;
}
function all_completed($data)
{
return ( !empty($data['nick']) &&
!empty($data['email']) &&
!empty($data['pass1']));
}
function valid_nick($nick)
{
return(preg_match("/^[a-zA-Z0-9\-\_áéíóöüóűÁÉÍÓÖÜŐŰ]+$/i",$nick));
}
function valid_email($email)
{
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
function is_used_nick($nick,$conn)
{
$sql = "SELECT id FROM users WHERE(`nick` = '{$nick}')";
return (mysql_num_rows(mysql_query($sql,$conn)) > 0);
}
function is_used_email($email,$conn)
{
$sql = "SELECT id FROM users WHERE(`email` = '{$email}')";
return (mysql_num_rows(mysql_query($sql,$conn)) > 0);
}
function password_match($pass1, $pass2)
{
return $pass1 == $pass2;
}
function add_user($data,$private_key,$conn)
{
$nick = mysql_real_escape_string($data['nick']);
$email = mysql_real_escape_string($data['email']);
$password = md5($data['pass1'].$private_key);
$sql = "INSERT INTO `users` (
`nick`,
`email`,
`password`
) VALUES (
'{$nick}',
'{$email}',
'{$password}'
)";
$query = mysql_query($sql,$conn);
}
Ezek egyszerű függvények, nem szorulnak további magyarázatra.
Ha ez megvan, működik a regisztráció, készítsük el a főoldalt index.php :
include "config.php";
include "functions.php";
session_start();
?>
<!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=iso-8859-2" />
<link href="layout.css" type="text/css" rel="stylesheet" />
<title>Beléptető</title>
</head>
<body>
<?php include "login.php";?>
<p>Bárki láthatja a tartalmat!</p>
<?php if(!empty($_SESSION['login'])):?>
<p>Csak ha belépett</p>
<?php endif;?>
</body>
</html>
A felhasználók kezeléséhez sessiont (munkamenetet) használunk. A lap tetejére meghívjuk a login.php -t
<?php
if(!empty($_POST['login']))
{
if( validate_user($_POST['nick'],$_POST['pass'],$private_key,$conn))
{
$_SESSION['login'] = $_POST['nick'];
header("Location: index.php");
}
else
{
echo ERROR_LOGIN_ERROR;
}
}
?>
<form action="" method="post">
<table>
<tr>
<td>
Nick:
<input type="text" name="nick" class='login_input'/>
</td>
<td>
Jelszó:
<input type="password" name="pass" class='login_input' />
</td>
<td>
<input type="submit" name="login" value="Belépés" class='login_button'/>
</td>
<td>
<a href="register.php">regisztráció</a>
</td>
</tr>
</table>
</form>
<?php else: ?>
<span>Bejelentkezve: <?php echo $_SESSION['login'];?></span>
<span><a href='logout.php'>Kilépés</a></span>
<?php endif;?>
Ez alapértelmezettként egy űrlap, amit ha kitöltenek, meghívódik a validate_user() függvény. Ha ez igazat ad, akkor megtörténik a felhasználó beléptetése. Innentől kezdve már nincs kint a beléptető űrlap, hanem csak egy üzenet, hogy “Bejelentkezve xyz”. Itt van továbbá a kilépő oldal linkje is. A validate_user() függvény a functions.php – ben van:
{
$password = md5($password.$private_key);
$sql = "SELECT
id
FROM
users
WHERE(
`nick` = '{$nick}' AND
`password` = '{$password}')";
return mysql_num_rows(mysql_query($sql,$conn)) == 1;
}
A kilépő oldal a logout.php
Ami még kimaradt a stíluslap. layout.css
width:300px;
background-color:#ccc;
border:1px solid black;
}
.reg_button{
width:100px;
background-color:#ccc;
}
.login_input{
width:100px;
background-color:#ccc;
border:1px solid black;
}
.login_button{
width:100px;
background-color:#ccc;
}
Így ha bármelyik oldalra szeretnél védett tartalmat nincs más teendő, mint az oldal legelején (minden kimenet előtt) meghívod a session_start() függvényt, include-olod a login.php-t, és vizsgálod a $_SESSION['login'] értékét. Ha ez true, akkor be van jelentkezve. Ha üres, akkor nincs. Sok sikert!
requiem
Szia!
Egy kis segítséget szeretnék kérni, futtatva a fenti beléptetőt az alábbi hiba üzenetet írja ki. A progit wamp server 2.1 verzión localhoston futtatom és a php.iniben is betölti a php_msql.dll-t. Mi lehet a gond?
Fatal error: Call to undefined function validate_user() in C:\wamp\www\fejl\login_rend2\login.php on line 5
Call Stack
# Time Memory Function Location
1 0.0008 368536 {main}( ) ..\index.php:0
2 0.0450 408880 include( ‘C:\wamp\www\fejl\login_rend2\login.php’ ) ..\index.php:15
Segítséget megköszönve….
Kefir
Bocs, még egy észrevételem van, amire nem találok választ….és a segítségedet szeretném kérni.
Tesztelve a beléptetőt regisztráció esetén, ha szándékosan a két jelszó nem egyezik meg, akkor az alábbi hibákat írja ki….
( ! ) Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\wamp\www\fejl\login_rend2\functions.php on line 30
Call Stack
# Time Memory Function Location
1 0.0287 375784 {main}( ) ..\register.php:0
2 0.1643 408424 reg_check( ) ..\register.php:21
3 0.1659 408424 is_used_nick( ) ..\functions.php:7
4 0.1692 408576 mysql_num_rows ( ) ..\functions.php:30
( ! ) Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\wamp\www\fejl\login_rend2\functions.php on line 35
Call Stack
# Time Memory Function Location
1 0.0287 375784 {main}( ) ..\register.php:0
2 0.1643 408424 reg_check( ) ..\register.php:21
3 0.1700 408424 is_used_email( ) ..\functions.php:8
4 0.1745 408592 mysql_num_rows ( ) ..\functions.php:35
Köszönettel:
Kefir
Szia!
Az elso hiba az azt irja, hogy nem letezik a validate_user() fgv, ami azt jelenti, hogy vagy nincs benne a functions.php-ben vagy nem includeolod, vagy elirtal valamit.
A masodik warning, az nem tudom, hogy miert van, valoszinuleg elirtad az SQL-t.
Szia
Nekem az volna a problémám hogy a regisztrációnál hibát ír ki.
(Warning: Cannot modify header information – headers already sent by (output started at /register.php:14) in /register.php on line 24).
Sajna nem tudom mi lehet ott a hiba.Különben működik rendesen felírja MySQL-be az adatokat és a belépésnél be is tudok jelentkezni.
Nem írja ki a regisztrációnál hogy sikeres regisztráció stb.
A segítségedet előre is köszönöm.
Szia bár a kódot nem én írtam de a megoldás egyszerű nagyon
index.php
login.php
register.php
oldalak elejére közvetlenül a <?php után kell egy ob_start();és egy session_start(); és az oldal utána teljesen működőképes

Bár a register.php nál nem is kell session csak ob
Tehát
<?php
session_start();
ob_start();
.
.
..
…
Így induljon az oldal
Azon az oldalon ahol header infókat küldesz abban a fájlban a session_start(); fgv mellé egy ob_start(); fgv is meg kell hívni!
Szerintem ez lesz a gond!
pl:
Session_start();
ob_start();
…stb code
Szia!
Nekem az lenne a problémám, hogy regelek az oldalra és közvetlen utána megpróbálok bejelentkezni (közbe megnéztem az adatbázist és létrehozta a felhasználót) és azt írja ki, hogy hibás felh… pedig jó adatokat adok meg neki. A másik meg az lenne, hogy az ékezetes karaktereket nem rendesen jeleníti meg hanem ilyen kriksz-krakszokat jelenít meg. Az oldal freeweben futtatom lehet, hogy azzal van a hiba?
Mihamarabbi válaszodat előre is köszönöm Pepe
Nekem csak az a bajom ezzel, hogy egyszerűen minden parancsot (hol hiba, hol nem) kiír. Mindent, de mindent megjelenít.
Lehet, hogy a kódolással van a hiba? Milyen formában kell kódolni? ANSI? UTF-8? ISO-8859-2? Vagy mi?
Továbbá, a regisztrációt nem küldi el. A MySQL-lel pedig nincs probléma, és el sem írhattam semmit, mert innen másoltam ki (lusta vagyok, mi? XD)…
Előre is köszi a segítségért, és bocs az időd rablásáért.
Szia,
remek megoldas, konnyen ertheto. csak azt nem ertem, mert ad hibas regisztraciot a belepeshez?
a kod copy/paste, a kulon megadott usevalidaciot is beraktam a functions.php-ba. az adatbazisba beirja a usert, de belepesnel hibas jelszot vagy felhasznalonev -veljon vissza.
udv,
peter
a problemat megoldottam, a hiba nalam volt az adatbazis kapcsolattal:)
egy masik kiegeszites azoknak akik a
“Cannot modify header information – headers already sent by” uzenetet kapjak vissza:
ob_start() parancssal indtisd az index oldalt
ob_flush() -al zard.
udv,
peter
Szia!
Nekem ezt a hibaüzenetet jeleníti meg a regisztrációnál:
Notice: Constant ERROR_ALL_MUST already defined in C:\Users\zozy\Documents\xampp\htdocs\2\db\config.php on line 13
Notice: Constant ERROR_INVALID_NICK already defined in C:\Users\zozy\Documents\xampp\htdocs\2\db\config.php on line 14
Notice: Constant ERROR_INVALID_EMAIL already defined in C:\Users\zozy\Documents\xampp\htdocs\2\db\config.php on line 15
Notice: Constant ERROR_USED_NICK already defined in C:\Users\zozy\Documents\xampp\htdocs\2\db\config.php on line 16
Notice: Constant ERROR_USED_EMAIL already defined in C:\Users\zozy\Documents\xampp\htdocs\2\db\config.php on line 17
Notice: Constant ERROR_PASSWORD_NO_MATCH already defined in C:\Users\zozy\Documents\xampp\htdocs\2\db\config.php on line 18
Notice: Constant ERROR_LOGIN_ERROR already defined in C:\Users\zozy\Documents\xampp\htdocs\2\db\config.php on line 19
Fatal error: Cannot redeclare reg_check() (previously declared in C:\Users\zozy\Documents\xampp\htdocs\2\db\functions.php:2) in C:\Users\zozy\Documents\xampp\htdocs\2\db\functions.php on line 12
Kérlek írd le, hogy miként tudom javítani.
Még a Notice: Constant “xy” already definied sort ki tudom javítani, ha a configban a megfelelő részt /* közé */ helyezem, s így figyelmen kívül hagyja, de az utolsót:
Fatal error: Cannot redeclare reg_check() (previously declared in C:\Users\zozy\Documents\xampp\htdocs\2\db\functions.php:2) in C:\Users\zozy\Documents\xampp\htdocs\2\db\functions.php on line 12
Sajnos sehogy nem tudom kijavítani. Más mappába, más SQL adatbázisba is átraktam már az oldalt, de sajnos semmi…
Előre is köszönöm a segítséged!
Sziasztok!
Nekem is ugyan az a gond mint az első kérdezőnek:
Fatal error: Call to undefined function validate_user() in C:\wamp\www\fejl\login_rend2\login.php on line 5
Call Stack
# Time Memory Function Location
1 0.0008 368536 {main}( ) ..\index.php:0
2 0.0450 408880 include( ‘C:\wamp\www\fejl\login_rend2\login.php’ ) ..\index.php:15
Az lenne a kérdésem, hogy a validate_user() a function.php-be hova tegyem??
Még annyi lenne, h belépésnél hogyan kell rá linkelni azt az oldalt amit szeretnék, h megjelenítsen, ha jó a jelszó meg minden.
Előre is köszi!!
Szia, legegyszerubb, ha az oldal vegere masolod be.
ha automatikus atiranyitast akarsz, a “sikeres regisztracio” helyett ezt rakd be:
header(‘location: cel_oldal’);
pl:
<!–Sikeres regisztráció!
Főoldal–>
Értem, köszi szépen!
Abba tudnál segíteni, h a mysql-t hogyan kell beállítani hozzá? Sajnos teljesen kezdő vagyok..:S
Addig jutottam el, h feltelepítettem..:S