Kereső
Kategóriák
Hasznos linkek
Hírdetés
Proba

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.

CREATE TABLE users(
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

<?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

<?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.

<?php
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 :

<?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($_SESSION['login'])):?>
<?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:

function validate_user($nick,$password,$private_key,$conn)
{
    $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

<?php
session_start();
session_destroy();
header('Location: index.php');

Ami még kimaradt a stíluslap. layout.css

.reg_input{
    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

  • Kefir szerint:

    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

  • Kefir szerint:

    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

  • requiem szerint:

    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.

  • sasa szerint:

    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.

    • noszii szerint:

      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 :)

    • don_peter szerint:

      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

  • Pepe szerint:

    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

  • KMartinR4 szerint:

    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.

  • peter szerint:

    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

    • peter szerint:

      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

  • Zoz szerint:

    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!

  • Isti szerint:

    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!!

    • peter szerint:

      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–>

      • Isti szerint:

        É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

Szólj hozzá

{"error":["Invalid domain (web.segedletek.hu) for this app"]}