PHP ile Üyelik Sistemi

Son güncelleme: 12.07.2008 19:00


  • Günümüzde internet dünyasında hemen hemen bir çok sitede üyelik sistemini görmekteyiz.Bu makaledede PHP ile üyelik sisteminin nasıl yapılacağı hakkında bilgiler edineceğiz.Makaleyi okumak için intermediate(orta) düzeyde PHP bilginiz olması gerekmektedir.

    Makalenin içerdiği sayfalar;
    fonksiyonlar.php = Fonksiyonları içeren sayfa
    kayit.html = Kullanıcıların siteye üye olabilmesini sağlayan sayfa
    uyepostala.php = Kullanıcının siteye üye olurken girdiği bilgileri veritabanına yazan ve aktivasyon linki gönderen sayfa.
    aktifle.php = Kullanıcının hesabını aktif eden sayfa.
    index.php = Anasayfa, kullanıcın karşılaştığı ilk sayfa (Login)
    giriskontrol.php = Kullanıcı adı ve parolasını kontrol eden sayfa
    yeni_sifre.html = Şifresini unutan kullanıcıların yeni bir şifre istemeleri için gereken form.
    sifre_unuttum.php = yeni_sifre.html den gelen email adresine yeni şifre gönderen sayfa.


    Öncelikle MySQL'de uyelik adında bir veritabanı yaratıp, şu sorguyu çalıştıralım:

    CREATE TABLE kullanicilar (
    id int(25) NOT NULL auto_increment,
    ad_soyad varchar(25) NOT NULL default '',
    kullanici varchar(25) NOT NULL default '',
    sifre varchar(255) NOT NULL default '',
    email varchar(25) NOT NULL default '',
    hakkinda text NOT NULL,
    kullanici_seviye enum('0','1','2','3') NOT NULL default '0',
    kayit_tarih datetime NOT NULL default '0000-00-00 0000',
    akod varchar(255) NOT NULL default '',
    aktiflik enum('0','1') NOT NULL default '0',
    PRIMARY KEY (id)
    ) TYPE=MyISAM;

    Sorguyu çalıştırdıktan sonra MySQL veritabanı bağlantısını yapalım.

    fonksiyonlar.php
    <?php
    // Db bağlantısı
    function db_baglanti()
    {
    $db_host = "localhost";
    $db_kullanici = "root"; // Db kullanıcı adınız
    $db_sifre = ""; // Db şifreniz
    $db_adi = "uyelik"; // Db adınız

    $baglanti = mysql_connect($db_host, $db_kullanici, $db_sifre);
    mysql_select_db($db_adi, $baglanti);

    if(mysql_errno())
    {
    echo 'Veritabanına bağlanılamıyor ...';
    exit;
    }
    }

    // Rastgele sayı Oluştur.
    function rastgelesayi() {
    $salt = "abchefghjkmnpqrstuvwxyz0123456789";
    srand((double)microtime()*1000000);
    $i = 0;
    while ($i <= 7) {
    $num = rand() % 33;
    $tmp = substr($salt, $num, 1);
    $pass = $pass . $tmp;
    $i++;
    }
    return $pass;
    }

    ?>

    Fonksiyonlara diğer sayfalardan ulaşabilmek için tek sayfada toplamak daha mantıklı olacaktır.Şimdi kullanıcıların kayıt olacağı basit bir form hazırlayalım.

    kayit.html
    <html>
    <head>
    <title>Kayıt ol</title>
    <style type="text/css">
    table {
    font-family: Arial;
    font-size: 9pt;
    }
    </style>
    </head>
    <body>
    <form action="uyepostala.php" method="post">
    <table border="0">
    <tr>
    <td>Ad Soyad: </td>
    <td><input type="text" name="ad"> *</td>
    </tr>

    <tr>
    <td>Kullanıcı adı: </td>
    <td><input type="text" name="kullanici"> *</td>
    </tr>

    <tr>
    <td>Şifre: </td>
    <td><input type="password" name="sifre"> *</td>
    </tr>

    <tr>
    <td>Şifre tekrar: </td>
    <td><input type="password" name="sifre2"> *</td>
    </tr>

    <tr>
    <td>Email: </td>
    <td><input type="text" name="email"> *</td>
    </tr>

    <tr>
    <td>Hakkında: </td>
    <td><textarea name="hakkinda" rows="10" cols="23"></textarea></td>
    </tr>

    <tr>
    <td></td>
    <td><input type="submit" onclick="javascript:this.form.submit(); this.disabled=true; this.value='Gönderiliyor...';"> </td>
    </tr>

    </table>
    </body>
    </html>



    Kullanıcı bu formu doldurup gönderdiğinde uyepostala.php sayfasına post ettireceğiz.Uyepostala.php sayfası kullanıcının girdiği bilgileri veritabanına kaydedip, kullanıcıya hesabını etkinleştirmesi için mail göndermesini sağlayacak olan sayfadır.Gerekli açıklamalar kod içinde.

    uyepostala.php
    <?php

    include ("fonksiyonlar.php");

    // Bağlantı oluştur.

    db_baglanti();

    // Formdan verileri alalım.

    $ad = stripslashes($_POST['ad']);
    $kullanici = stripslashes($_POST['kullanici']);
    $sifre = stripslashes($_POST['sifre']);
    $sifre2 = stripslashes($_POST['sifre2']);
    $email = stripslashes($_POST['email']);
    $hakkinda = stripslashes($_POST['hakkinda']);

    // Form kontrolleri

    if((!$ad) || (!$kullanici) || (!$sifre) || (!$sifre2) || (!$email))
    {
    echo '<font color="red">Gerekli bir bölümü boş bıraktınız.</font>';
    if(!$ad)
    {
    echo '<font color="red">Ad soyadı boş bıraktınız.</font>';
    }
    if(!$kullanici)
    {
    echo '<font color="red">Kullanıcı adını boş bıraktınız.</font>';
    }
    if(!$sifre)
    {
    echo '<font color="red">Şifre alanını boş bıraktınız.</font>';
    }
    if(!$sifre2)
    {
    echo '<font color="red">Şifrenizi tekrar yazmadınız.</font>';
    }
    if($sifre != $sifre2)
    {
    echo '<font color="red">Şifreler uyuşmuyor.</font>';
    }
    if(!$email)
    {
    echo '<font color="red">Emaili alanını boş bıraktınız.</font>';
    }
    include("kayit.html");
    exit;
    }
    // Yazılan kullanıcı adı veya email daha önce başkası tarafından alınmış mı?

    $email_kontrol = mysql_query("select email from kullanicilar where email='$email'");
    $kullanici_kontrol = mysql_query("select kullanici from kullanicilar where kullanici='$kullanici'");

    // Sonucu alalım
    $email_kontrol2 = mysql_num_rows($email_kontrol);
    $kullanici_kontrol2= mysql_num_rows($kullanici_kontrol);

    if(($email_kontrol2 > 0) || ($kullanici_kontrol2 > 0))
    {
    echo '<font color="red">Hata oluştu.</font>';

    if($email_kontrol2 > 0)
    {
    echo '<font color="red">Bu email adresi zaten kullanılıyor.</font>';
    unset($email);
    }
    if($kullanici_kontrol2 > 0)
    {
    echo '<font color="red">Bu kullanıcı adı zaten kullanılıyor.</font>';
    unset($kullanici);
    }
    include("kayit.html");
    exit;
    }


    $rastgele_sayi = rastgelesayi();
    $sifre2 = sha1($sifre);

    // Girilen Bilgileri Dbye yazdırıyoruz.

    $sql = "insert into kullanicilar (ad_soyad, kullanici, sifre, email, hakkinda, akod, kayit_tarih)
    values('$ad[/swf2][swf3]$kullanici[/swf2][swf3]$sifre2[/swf2][swf3]$email[/swf2][swf3]$hakkinda[/swf2][swf3]$rastgele_sayi', now())";
    $sql2 = mysql_query($sql);

    // Dbye yazdırırken bir hata oluşursa;

    if(!$sql2)
    {
    echo 'Bir hata oluştu.Lütfen daha sonra tekrar deneyin.';
    }
    else
    {
    $kullanici_id = mysql_insert_id();

    // Kullanıcıya hesabını etkinleştirmesi için mail gönderiyoruz.

    $konu = "Üyelik Onayı";
    $mesaj = " Sayın $ad

    Üyelik işleminizi tamamlamak için aşağıdaki linke tıklayın ya da adres çubuğuna kopyalayın.

    http://www.domain.com/aktifle.php?id=$kullanici_id&akod=$rastgele_sayi

    Giriş Bilgileriniz;

    Kullanıcı adı: $kullanici
    Şifre: $sifre

    Teşekkürler.";

    mail($email, $konu, $mesaj, "From: Domain.com<admin@domain.com>");

    echo 'Kullanıcı bilgileriniz email adresinize gönderildi.Üyeliğizi onaylamak için lütfen email adresinizdeki
    bağlantıya tıklayın.Aksi halde siteye giriş yapamazsınız .<br />';

    echo 'Anasayfa için <a href="index.php">tıklayın</a>';

    }
    ?>



    Kullanıcıya maili de gönderdikten sonra hesabını aktifleştirmesi için gereken sayfayı yani aktifle.php sayfasını yapalım.



    aktifle.php
    <?php

    include ("fonksiyonlar.php");

    db_baglanti();

    // Urlden verileri al.

    $kullanici_id = $_REQUEST['id'];
    $akod = $_REQUEST['akod'];

    $sql = mysql_query("update kullanicilar SET aktiflik='1' where id='$kullanici_id' AND akod='$akod'");

    $sql2 = mysql_query("select * from kullanicilar where id='$kullanici_id' AND akod='$akod' AND aktiflik='1'");

    $kontrol = mysql_num_rows($sql2);

    if($kontrol == 0)
    {
    echo 'Hesabınız etkinleştirilemedi';
    }
    elseif($kontrol > 0)
    {
    echo 'Tebrikler üye olmayı başardınız.';

    include("index.php");

    }
    ?>

    Üyeliği aktifleştirdikten sonra kullanıcının giriş yapabilmesi için gereken formu yapalım.Yani anasayfayı yapalım.
    index.php

    <?php
    @session_start();

    // Giriş yapılmamışsa
    if(!isset($_SESSION['kullanici']))
    {
    ?>
    <html>
    <head>
    <title>Giriş</title>
    <style type="text/css">
    table {
    font-family: Arial;
    font-size: 9pt;
    }
    </style>
    </head>
    <body>

    <form action="giriskontrol.php" method="post">
    <table border="0">
    <tr>
    <td>Kullanıcı:</td>
    <td><input type="text" name="kullanici"></td>
    </tr>

    <tr>
    <td>Şifre:</td>
    <td><input type="password" name="sifre"></td>
    </tr>

    <tr>
    <td></td>
    <td><input type="submit"></td>
    </tr>

    <tr>
    <td><a href="yeni_sifre.html">Şifremi Unuttum</a></td>
    <tr>
    <td><a href="kayit.html">Üye ol</a></td>
    </tr>

    </table>
    </form>
    </center>
    </body>
    </html>
    <?php
    }
    // Giriş yapılmışsa
    else
    {
    echo "Hoşgeldiniz, " . $_SESSION['kullanici']."<br><br>";
    echo "Kullanıcı seviyeniz, " . $_SESSION['kullanici_seviye']."<br><b>Şu bölümleri görebilirsiniz.</b><br>";
    // Kullanıcı seviyesi 0 ise
    if($_SESSION['kullanici_seviye'] == 0)
    {
    echo 'HTML,ASP,PHP';
    }
    // Kullanıcı seviyesi 3 ise
    if($_SESSION['kullanici_seviye'] == 3)
    {
    echo 'Asp.net,C#, Java';
    }
    echo '<br><br>Çıkış yapmak için <a href="cikis.php">tıklayın</a>';
    }
    ?>



    Kullanıcı adı ve parolasını kontrol edicek olan giriskontrol.php sayfası aynı zamanda kullanıcıya sessionları atayan sayfadır.

    giriskontrol.php
    <?php
    @session_start();

    include("fonksiyonlar.php");

    db_baglanti();

    // Formdan verileri alıyoruz.
    $kullanici = addslashes($_POST['kullanici']);
    $sifre = addslashes($_POST['sifre']);

    // Form kontrolleri

    if((!$kullanici) || (!$sifre))
    {
    echo '<font color="red">Lütfen tüm alanları doldurun.</font>';
    include("index.php");
    }
    else
    {
    //Parolayı sha1 olarak alıyoruz.
    $sifre2 = sha1($sifre);

    // Şimdi kullanıcı adı,şifre, aktif mi? kontrolü

    $sql = mysql_query("select * from kullanicilar where kullanici='$kullanici' and sifre='$sifre2' and aktiflik=' 1' ");
    $sql2 = mysql_num_rows($sql);

    if ($sql2 > 0)
    {
    while($yaz = mysql_fetch_array($sql))
    {

    $_SESSION['kullanici'] = $kullanici;
    // Veritabanından kullanıcı seviyesini alıp, sessiona kaydediyoruz.
    $_SESSION['kullanici_seviye'] = $yaz['kullanici_seviye'];

    header("Location: index.php");
    }
    }
    else
    {
    echo '<font color="red">Kullanıcı adı veya parola yanlış.Yada hesabınızı aktifleştirmediniz !</font>';
    }
    }
    ?>

    Kullanıcıların yeni bir şifre istemeleri için gereken formu yapalım.

    yeni_sifre.html
    <html>
    <head>
    <title>Şifremi Unuttum</title>
    </head>
    <body>
    <form action="sifre_unuttum.php" method="post">
    Email :<input type="text" name="email"><br />
    <input type="submit">
    </form>
    </body>
    </html>

    yeni_sifre.html sayfasını karşılayacak olan sifre_unuttum.php sayfasını yapalım.

    sifre_unuttum.php

    <?php
    include("fonksiyonlar.php");

    db_baglanti();

    $email = $_POST['email'];
    if(!$email)
    {
    echo "Lütfen kayıt olurken girdiğiniz mail adresini giriniz.";
    include ("yeni_sifre.html");
    exit();
    }
    // Email adresini kontrol et.
    $email_kontrol = mysql_query("select * from kullanicilar where email='$email'");
    $email_kontrol2 = mysql_num_rows($email_kontrol);
    if($email_kontrol2 == 0)
    {
    echo '<font color="red">Girdiğiniz email adresi kayıtlı değil.</font>';
    unset($email);
    include ("yeni_sifre.html");
    exit();
    }

    // Rastgele sayı üret
    $rastgele_sayi = rastgelesayi();
    // Rastgele üretilen sayıyı sha1 yap.
    $yeni_sifre = sha1($rastgele_sayi);

    // Sha1 olan şifreyi dbye kaydet, normal şifreyi maille kullanıcıya gönder.
    $sql = mysql_query("update kullanicilar set sifre='$yeni_sifre' where email='$email'");
    $konu = "Şifre hatırlatma";
    $mesaj = " Merhaba, bizden yeni şifre istemişsiniz.Buyrun

    Yeni şifreniz: $rastgele_sayi



#12.07.2008 19:00 0 0 0