php MySql إنشاء فضاء للأعضاء

إنشاء الملف الشخصي للعضو

آخر تحيين: 13-12-2015

المدونة : استعمال الجلسة لحماية الصفحات


الملف الشخصي هو الفضاء الخاص بالعضو ، حيث يمكن له رؤية معلوماته الشخصية و إجراء تعديلات عليها مثل تعديل الصورة الشخصية تغيير كلمة المرور و البريد الإلكتروني ، استقبال و إرسال الرسائل ...إلخ .
سندرس مثالين هامين و هما :

  • إضافة الصورة الشخصية و إمكانية تعديلها .
  • تغيير كلمة المرور .

اخترت المثالين من باب الإستئناس لتوظيف معلوماتكم الخاصة برفع الملفات من جهة . و من جهة أخرى إجلاء بعض الغموض عن استعمال bcrypt لتشفير كلمة المرور ، خاصة للذين استعملوا في مواقعهم تشفيرا آخر مثل md5 أو sha1 ... إلخ . و يودون الإستفادة من التشفير الحالي دون أن يخسروا بيانات الأعضاء القدامى .
سنحتاج في هذا الدرس للصفحات التالية :

  • members/profile.php : صفحة الإستقبال للعضو .
  • members/avatar.php : صفحة رفع الصورة الشخصية .
  • members/delete-avatar.php : صفحة حذف الصورة الشخصية .
  • members/change-password.php : صفحة تغيير كلمة المرور .
  • includes/functions.php : صفحة تضم بعض الدوال التي سنقوم بإنشائها

الصفحات الأربعة الأولى سنضعها داخل ملف "members" و الأخيرة في ملف "includes" ، لن أجبركم على هذا التنظيم ، يمكنكم وضع الصفحات حيث يحلو لكم ، في هذه الحالة لا تنسوا تغيير الروابط التي سنراها حسب توظيبكم .
سأفترض أيضا أنه لديكم مسبقا صفحات التسجيل و الدخول و الخروج في نفس االملف "members" .

جدول blog_avatars

1 _ قبل البدء في برمجة الصفحات ، أدعوكم لإنشاء جدول جديد في قاعدة البيانات حيث سنُخزّن بعض بيانات الصورة الشخصية :

CREATE TABLE IF NOT EXISTS `blog_avatars` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `avatar_name` varchar(255) DEFAULT NULL,
  `avatar_alt` varchar(70) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;
avatar_name : لتخزين إسم الصورة و امتدادها ، مثلا (d3bf7e5f0709a8e232.png).
avatar_alt : لتخزين قيمة الصفة "alt" للصورة ، مراعاة لمعايير "w3c" التي تفرض إضافة هذه الصفة لجميع وسوم الصور . حيث سنتمكن من عرض الصورة كالتالي :
<img src="../uploads/avatars/'.$member['avatar_name'].'" alt"'.$member['avatar_alt'].'">.
يمكنكم وضع أي شيء تريدون في الصفة alt ، في مثالنا سنخزن في هذا الحقل إسم العضو .

2 _ بعد إنشاء الجدول ، أدعوكم أيضا لتغيير جدول "blog_users" و ذلك بإضافة حقل له من نوع INT ، سنسمي هذا الحقل "avatar_id" على سبيل المثال . سيضم لاحقا معرف الصورة الشخصية ، حتى نتمكن من الربط بين الجدولين .


3 _ النقطة الآخيرة تخص ملف تخزين الصور على موقعكم : أنشؤوا ملفا آخر على موقعكم ، سنسميه "uploads" و داخله سننشيء :

  • ملف "avatars" حيث سنخزن الصور الشخصية للأعضاء .
  • .htaccess : مستند لحماية ملف الصور . داخله سنضيف الشيفر التالية ، كنا تحدثنا عليها سابقا في درس رفع الملفات :
    <IfModule mod_php5.c>
        php_flag engine off
    </IfModule>
    
    <IfModule mod_rewrite.c>
    deny from all
    <Files ~ "^\w+\.(gif|jpe?g|png)$">
    order deny,allow
    allow from all
    </Files>
    </IfModule>

    الشيفرة الأولى لمنع تنفيذ سكريبتات php داخل الملف و الثانية لإتاحة رفع ملفات الصور فقط .
إذا كانت لديكم إستضافة خاصة (غير مشتركة) أنشؤوا ملف رفع الصور خارج نطاق "www".

كل شيء جاهز الآن ننتقل لبرمجة صفحاتنا .

عرض الصورة الشخصية

كيف سنقوم بعرض الصورة الشخصية للعضو على جميع الصفحات ؟
الجواب الأول الذي سيتبادر إلى ذهن البعض هو إنشاء استعلام في صفحة "header.php" .
لن نلجأ لهذا الحل هنا ، من باب التمرن على الجلسات ، سنعتمد على الجلسة لتخزين الصورة الشخصية . و من يقول الجلسة يعرف أن أغلب بيانات الجلسة المتعلقة بالعضو يتم تعيينها أثناء ربط اتصاله بنجاح على الموقع . تتذكرون طبعا كيف استطعنا سابقا عرض إسم العضو على جميع الصفحات . سنفعل نفس الشيء ، حيث سنضيف بيانات للجلسة تحمل إسم الصورة الشخصية للعضو عندما يربط اتصاله بنجاح .
سنقوم إذاً ببعض التعديلات في صفحة الدخول "login.php" :

login.php

  • التعديل الأول يخص الإستعلام ، إذ سنقوم بربط جدول "blog_avatars" بجدول "blog_users" ، سيصبح استعلامنا كالتالي :
    SELECT u.user_id, u.user_name, u.user_password, a.avatar_name
    FROM blog_users u
    LEFT JOIN blog_avatars a ON u.avatar_id = a.id
    WHERE u.user_name = :nom
  • التعديل الثاني : سنضيف بيانات الصورة الشخصية للجلسة :
    //...
    if(empty($error)) 
    {
       /*
         ...
       */
       $_SESSION['id'] = $member['user_id'];
       $_SESSION['user'] = $member['user_name'];
       // إضافة بيانات الصورة الشخصية للجلسة
       if($member['avatar_name'])
       {
           $_SESSION['avatar'] = $member['avatar_name'];
       }
    //...
    }

لم يبقى لنا سوى تحيين صفحة "header.php" لإضافة بيانات الصورة الشخصية و من ثم عرضها .

header.php

<?php 
session_start();
$session_id = isset($_SESSION['id']) ? (int) $_SESSION['id'] : 0;
$session_user = isset($_SESSION['user']) ? htmlspecialchars($_SESSION['user']) : '';
$session_avatar = isset($_SESSION['avatar']) ? htmlspecialchars($_SESSION['avatar']) : '';
$message = isset($_SESSION['message']) ? htmlspecialchars($_SESSION['message']) : '';
?>
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
    <meta charset="UTF-8">
    <link href="/css/blog.css" type="text/css" rel="stylesheet">
</head>

<body>
<header id="header">
    <nav>
<?php 
if($session_id != 0)
{
    echo '
    <a href="/members/profile.php" class="box">الملف الشخصي</a>
    <a href="/members/logout.php" class="box">الخروج</a>';
    if($session_avatar != '')
    {
        echo '<img src="../uploads/avatars/'.$session_avatar.'" alt="'.$session_user.'" height="50px" class="avatar"> ';
    }
	echo '<span class="member orange">'.$session_user.'</span>';
}
else
{
	echo '
    <a href="/members/login.php" class="box">الدخول</a>
    <a href="/members/registration.php" class="box">التسجيل</a>';
}
?>
    </nav>
    <h1>PHP <span>PDO</span><span>مدوّنتي</span></h1>
</header>
<section id="navigation">
    <div class="dropdown"><a href="#" onclick="show();">أنقر هنا لعرض و إخفاء الروابط</a></div>
    <nav id="drop">
        <a href="/">الإستقبال</a>
        <a href="">رابط 1</a>
        <a href="">رابط 2</a>
        <a href="">رابط 3</a>
        <form>
            <input type="text">
            <input type="submit" value="بحث">
        </form>
    </nav>
</section>

<section id="main">
<?php
// ... عرض رسالة أثناء قيام العضو بعملية ما : كإضافة موضوع أو تغيير بياناته الشخصية
if($message != '') echo '<div class="flush center">'.$message.'</div>';
// تدمير جلسة الإشعار مباشرة بعد عرضه
$_SESSION['message'] = '';

لقد أضفت أيضا رابطا لملف "profile.php" الذي سنقوم بإنشائه حالاً .

profile.php

سننشيء صفحة بسيطة ، تضم رابطين : رابط لرفع الصورة الشخصية أو حذفها و رابطا لتغيير كلمة المرور .
بالنسبة لرابط الصورة الشخصية سنعتمد على الجلسة بحيث إذا كان العضو يتوفر على صورة شخصية سنعرض له رابطا لإمكانية حذفها . أما إذا لم يكن يتوفر على الصورة سنقترح له الرابط لرفعها .
ستكون صفحة "profile.php" كالتالي :

<?php
require '../includes/header.php';
require '../includes/db-connection.php';

if($session_id == 0) { header('location:login.php'); exit;}

echo '
<div class="ariane">
   <a href="../index.php">الإستقبال</a>
   <a href="profile.php">الملف الشخصي</a>
</div>

<h2>الملف الشخصي</h2>
<hr>
<div class="center"><a href="/add-blog.php" class="button gray">إضافة موضوع</a>
<a href="change-password.php" class="button gray">تغيير كلمة المرور</a>
';

if($session_avatar != '')
{
    echo '
    <a href="delete-avatar.php" class="button gray">حذف الصورة الشخصية</a>
    <hr>
    <p><br><img src="../uploads/avatars/'.$session_avatar.'" alt=""></p><br></div>';
}
else
{
   echo '<a href="avatar.php" class="button">رفع الصورة الشخصية</a><hr></div>';
}

require '../includes/footer.php';

قمت أيضا بنقل رابط "إضافة موضوع" من صفحة "header.php" لهذه الصفحة .

رفع الصورة الشخصية

صفحة "avatar.php" ستضم استمارة لرفع الصورة و كذلك معالجتها . النقط المنطقية و الهامة التي يجب الإهتمام بها هي :

  • التأكد من أن العضو متصل و إلا نقوم بتحويله لصفحة الدخول
  • التأكد من أن العضو لا يتوفر على صورة شخصية و إلا نقوم بتحويله لصفحة حذف الصورة الحالية حتى يتمكن من رفع صورة أخرى
  • التأكد من صحة الصورة الشخصية حتى نتجنب ثغرات رفع الملفات
  • عرض الأخطاء الناجمة في حالة وجودها و توقيف تنفيذ السكريبت .
  • إذا كان كل شيء على مايرام : نقوم برفع الصورة لملف "uploads/avatars/"
    ثم نخزّن بيانات الصورة في قاعدة البيانات .
    ثم لا ننسى إضافة بيانات الصورة الشخصية لجلسة العضو .

ستكون لدينا صفحة "avatar.php" على هذا الشكل .

<?php
require '../includes/header.php';
require '../includes/db-connection.php';
require '../includes/functions.php'; // إقحام صفحة دوال رفع الصور
// التأكد من أن العضو متصل
if($session_id == 0) { header('location:login.php'); exit;}
// التأكد من أن العضو لا يتوفر على صورة شخصية
if($session_avatar != '') { header('location:delete-avatar.php'); exit;}

if(isset($_POST['upload']) && !empty($_FILES['avatar']['size']))
{
     $error = '';
     // معالجة بينات الصورة لتجنب الثغرات
	 
    if ($error == '') 
    { 
	// "avatars" رفع الصورة إلى ملف 
        // blog_avatars تخزين بينات الصورة في جدول 
        //avatar_id لإضافة معرف  blog_users تحيين جدول 

        // إضافة بيانات الصورة الشخصية للجلسة
        $_SESSION['avatar'] = $filename;
	// التحويل التلقائي
        header('location:profile.php');
    } else {
        // عرض الأخطاء
    }

}
?>
<h3>رفع الصورة الشخصية</h3>
<form action="" method="post" enctype="multipart/form-data">
  <input type="file" name="avatar">
  <p><input type="submit" name="upload" value="إرسال"></p>
</form>

لمعالجة الأخطاء و رفع الصور . سنشيء دوالاّ تقوم بذلك . بما أنكم ستحتاجون سكريبت رفع الصور في مواطن أخرى غير الصورة الشخصية ، مثلا في المواضيع أو المنتديات ... إلخ . حتى لا تديروا العجلة في كل مرة و تجدوا أنفسكم مجبرين لإعادة كتابة نفس السكريبت لرفع الصور في كل صفحة . سيكون من الأجدى إنشاء صفحة "functions.php" مثلا و نقوم بإقحامها كلما دعت الضرورة .
سننشيء هذه الصفحة و نضعها داخل ملف "includes"

functions.php

هذه الصفحة ستضم دالتين :

  • دالة لمعالجة الأخطاء لحماية ثغرات رفع الملفات .
  • و دالة تقوم برفع الصور و تخزينها في الملف المعني .
<?php 
/**
  * هذه الدالة تقوم برفع الصورة و تخزينها في الملف المعني
  * تأخذ قيمتين و هما : إسم حقل الملف في الإستمارة و ملف مكان تخزين الصورة
**/
function move_img($img, $upload_dir)
{
    $temp = explode(".", $_FILES[$img]["name"]);
    $file_extension = end($temp);
    $name = sha1(uniqid(rand(), true));
    $filename = $name.'.'.$file_extension;
    $destination = $upload_dir . $filename;
		
    move_uploaded_file($_FILES[$img]["tmp_name"], $destination);
    return $filename;
}

/**
  * دالة تقوم بمعالجة الأخطاء
  * تأخذ قيمتين و هما : إسم حقل الملف في الإستمارة و الأخطاء الناجمة
**/
function checkUploads($name, $error)
{

    $max_size = 204800; // 200ko
    $min_size = 10; // octets
    $max_width = 600; //أقصى عرض
    $max_height = 600; //أقصى طول
    $min_width = 50; //أدنى عرض
    $min_height = 50; //أدنى طول
	
    $allowed_extensions = array("gif", "jpg","jpeg", "png");
    $temp = explode(".", $_FILES[$name]["name"]);
    $file_extension = end($temp);

    if (!in_array($file_extension, $allowed_extensions)) 
    {
        $error .= 'صيغة الملف غير مسموح بها <br>';
    }

    if(!preg_match('#^[a-zA-Z0-9_-]{1,200}\.(jpe?g|gif|png)$#', $_FILES[$name]['name'])) 
    {
        $error .= 'إسم الملف غير صحيح <br>';
    }

    if($_FILES[$name]["size"] > $max_size OR $_FILES[$name]["size"] < $min_size)
    {
        $error .= 'حجم الملف غير المسموح به
		  ، لا يجب أن يقل عن '.$min_size.'octets و ألا يتجاوز '.$max_size.'octets <br>';
    }

    $image_sizes = getimagesize($_FILES[$name]['tmp_name']);
    if ($image_sizes[0] < $min_width OR $image_sizes[1] < $min_height)
    {
        $error .= 'لا يجب أن تقل أبعاد الصّورة عن " : 
                  '.$min_width.'*'.$min_height.'"<br>
                    أبعاد الصورة الحالية هي : 
                  '.$image_sizes[0].'*'.$image_sizes[1].'<br>';
    }

    if ($image_sizes[0] > $max_width OR $image_sizes[1] > $max_height)
    {
        $error .= 'لا يجب أن تتجاوز أبعاد الصّورة " : 
                  '.$max_width.'*'.$max_height.'"<br>
                    أبعاد الصورة الحالية هي :
                  '.$image_sizes[0].'*'.$image_sizes[1].'<br>';
    }
	
    return $error;
}

لاستعمال الدالتين ، نُقحم أولا صفحة "functions.php" . ثم نوظفهما في صفحتنا كالتالي :

//...
$error = '';
//دالة معالجة الأخطاء
$error = checkUploads('avatar', $error);

if ($error == '') 
{ 
    $upload_dir = '../uploads/avatars/';
    // دالة رفع الصورة
    $filename =  move_img('avatar', $upload_dir);
    // ...
}
else 
{
    // عرض الأخطاء
    echo '<h3> تم رفض رفع الملف للأسباب التالية : </h3>';
    if($error != '') echo '<p>'.$error.'</p>';
}

avatar.php

صفحة تحميل الصور كاملة :

<?php
require '../includes/header.php';
require '../includes/db-connection.php';
require '../includes/functions.php'; // إقحام صفحة الدوال

if($session_id == 0) { header('location:login.php'); exit;}
if($session_avatar != '') { header('location:delete-avatar.php'); exit;}

if(isset($_POST['upload']) && !empty($_FILES['avatar']['size']))
{
    $error = '';
    // دالة معالجة الأخطاء
    $error = checkUploads('avatar', $error);
	 
    if ($error == '') 
    {
        // تعيين مكان تخزين الصورة
        $upload_dir = '../uploads/avatars/';
        // دالة رفع الصورة
        $filename =  move_img('avatar', $upload_dir);
        // تخزين بيانات الصورة في القاعدة
        $stmt = $db->prepare('INSERT INTO blog_avatars (avatar_name, avatar_alt) 
	                     VALUES (:nom, :alt)
                      ');
        $stmt->bindValue(':nom',$filename,PDO::PARAM_STR);
        $stmt->bindValue(':alt',$session_user,PDO::PARAM_STR);
        $stmt->execute();
	
        $avatar_id = $db->lastInsertId();
        $stmt->CloseCursor();

        // تحيين جدول الأعضاء لإضافة مُعرّف الصورة للعضو
        $stmt = $db->prepare('UPDATE blog_users SET avatar_id = :av 
	                     WHERE user_id = :uid
                      ');
        $stmt->bindValue(':av',$avatar_id,PDO::PARAM_INT);
        $stmt->bindValue(':uid',$session_id,PDO::PARAM_INT);
        $stmt->execute();
        $stmt->CloseCursor();

        // إضافة الصورة الشخصية لبيانات الجلسة
        $_SESSION['avatar'] = $filename;	
        header('location:profile.php'); exit;
    }
    else
    {
        // عرض الأخطاء
        echo '<h3> تم رفض رفع الملف للأسباب التالية : </h3>';
        if($error != '') echo '<p>'.$error.'</p>';
    }

}
?>
<h3>رفع الصورة الشخصية</h3>
<form action="" method="post" enctype="multipart/form-data">
  <input type="file" name="avatar">
  <p><input type="submit" name="upload" value="إرسال"></p>
</form>
<?php 
require '../includes/footer.php';

delete-avatar.php

لحذف الصورة الشخصية ، سنحتاج للعمليات التالية في هذه الصفحة :

  • التأكد من أن العضو متصل و إلا نقوم بتحويله لصفحة الدخول
  • التأكد من أن العضو يتوفر على صورة شخصية .
  • حذف الصورة الشخصية للعضو من جدول "blog_avatars"
  • حذف الصورة من ملف "avatars" . سنتعمل لذلك دالة unlink()
  • حذف بيانات الصورة من الجلسة
  • حذف معرف الصورة الشخصية للعضو من جدول "blog_users"

سنحصل على السكريبت التالي :

<?php
require '../includes/header.php';
require '../includes/db-connection.php';

if($session_id == 0) { header('location:login.php'); exit;}
if($session_avatar == '') { header('location:avatar.php'); exit;}

if(isset($_POST['delete']))
{
    // حذف الصورة الشخصية للعضو
    $query = $db->prepare('DELETE FROM blog_avatars WHERE avatar_name = :av');
    $query->bindValue(':av', $session_avatar, PDO::PARAM_STR);
    $query->execute();
    $query->CloseCursor(); 

    // حذف الصورة من الملف
    unlink ('../uploads/avatars/'.$session_avatar);
    // حذف بيانات الصورة من الجلسة
    $_SESSION['avatar'] = '';
    $query->closeCursor();

    // حذف معرف الصورة الشخصية للعضو
    $query = $db->prepare('UPDATE blog_users
             SET avatar_id = 0
             WHERE user_id= :id 	   
		     ');
    $query->bindValue(':id', $session_id, PDO::PARAM_INT);	
    $query->execute(); 	   
    $query->closeCursor();

    $_SESSION['message'] = 'تم حذف صورتك الشخصية بنجاح ، يمكنك تحميل صورة جديدة';
    header('location:avatar.php'); exit;
}
echo '
<h3 class="errors">هل أنت متأكد من حذف الصورة الشخصية ؟</h3>
<form action="" method="post" class="inlineBlock">
  <input type="hidden" name="delete">
  <input type="submit" class="button blue" value="نعم">
</form>
<a href="profile.php" class="inlineBlock button">لا</a> ';

require '../includes/footer.php';

يمكنكم الآن رفع الصورة الشخصية و حذفها .




تغيير كلمة المرور : change-password.php

لتغيير كلمة المرور ، تبقى العملية جد سهلة . أعطيكم أولا شيفرة صفحة "change-password.php"

<?php 
require '../includes/header.php';
require '../includes/db-connection.php';

if($session_id == 0) { header('location:login.php'); exit;}

if(isset($_POST['submit']))
{
    $error = array();
    if(empty($_POST['pass_first']) || empty($_POST['pass_new']) || empty($_POST['confirm_new']))
    {
        $error[] = 'يجب ملأ جميع الحقول';
    }

    if($_POST['pass_new'] !== $_POST['confirm_new'])
    {
        $error[] = 'كلمة المرور الجديدة و تأكيد كلمة المرور مختلفتين';
    }

    $first_password = $_POST['pass_first'];
    $new_password = $_POST['pass_new'];

    $response = $db->prepare('SELECT user_id, user_name, user_password 
                FROM blog_users
                WHERE user_id = :id
                ');
    $response->bindValue(':id', $session_id, PDO::PARAM_INT);
    $response->execute();
    $member = $response->fetch();
    $response->CloseCursor();

    if ($member)
    {
        $db_password = $member['user_password'];
        if(!password_verify($first_password, $db_password))
        {
            $error[] = 'كلمة المرور الحالية غير صحيحة';
        }

        if (empty($error)) 
        {
	    	//المستعملة في التسجيل و الدخول cost إستعمل نفس قيمة المعيار 
            $options = array("cost" => 12);
            $hash_new_pass = password_hash($new_password, PASSWORD_DEFAULT, $options);

            $stmt= $db->prepare('UPDATE blog_users SET user_password = :pas WHERE user_id = :uid');
            $stmt->bindValue(':pas', $hash_new_pass, PDO::PARAM_STR);
            $stmt->bindValue(':uid', $session_id, PDO::PARAM_INT);
            $stmt->execute();
            $stmt->CloseCursor();

            // تخزين رسالة في الجلسة لإشعار العضو بنجاح العملية
            $_SESSION['message'] = 'تم تغيير كلمة مرورك بنجاح . ';
            header('location:profile.php'); exit;
        }
    }
}
// قائمة الإبحار
echo '
<div class="ariane">
   <a href="../index.php">الإستقبال</a>
   <a href="profile.php">الملف الشخصي</a>
   <a href="change-password.php">تغيير كلمة المرور</a>
</div>
<h3>تغيير كلمة المرور</h3> ';

// عرض الأخطاء في حالة وجودها
if(isset($_POST['submit']) && !empty($error))
{
    echo '
    <div class="errors"><ol>';
    foreach ($error as $key => $values) 
    {
        echo '<li>' . $values . '</li>';
    }
    echo '
    </ol></div>';
}

// الإستمارة
echo '
<form action="" method="post" id="form" class="box">
   <label for="first">كلمة المرور الحالية</label><input type="password" name="pass_first" id="first"><br>
   <label for="new">كلمة المرور الجديدة</label><input type="password" name="pass_new" id="new"><br>
   <label for="confirm">تأكيد كلمة المرور</label><input type="password" name="confirm_new" id="confirm"><br>
   <p><input type="submit" name="submit" value="إرسال" class="button gray"></p>
</form>';

require '../includes/footer.php';

كما ذكرنا فالعملية جد سهلة . إلا أنني أود أن أثير انتباه من قاموا باستضافة موقعهم و كانوا استعملوا تشفيرا آخر غير bcrypt مثل sha1 ,sha256 أو md5 ...إلخ. و أرادوا الإستفادة من التشفيرالجديد . كنت قد أشرت لهذا الموضوع في درس تشفير كلمة المرور و كنت قد ذكرت أن الحل الأمثل للإستفادة من التشفير دون أن يفقد الأعضاء القدامى بياناتهم هو اقتراح رابط لهم لتغيير كلمة المرور .
لتفعيل ذلك ، أدعوكم لتغيير الشيفرة التالية في صفحة "change-password" :

if(!password_verify($first_password, $db_password))
{
    $error[] = 'كلمة المرور الحالية غير صحيحة';
}

و استبدالها بهذه الشيفرة :

// sha1 يجب استعمال نفس التشفير القديم ، أعطيتكم هنا مثال 
$old_password_hash = sha1($first_password);

if ($old_password_hash !== $db_password)
{
    if(!password_verify($first_password, $db_password))
    {
        $error[] = 'كلمة المرور الحالية غير صحيحة';
    }
}

هذا كل ما في الأمر ، بهذه الطريقة يمكن سواء للأعضاء القدامى أو الجدد تغيير كلمات مرورهم بدون مشكلة . بالنسبة للأعضاء القدامى ، بمجرد تغيير كلمات مرورهم سيحصلون على التشفير الجديد .


هنا ينتهي هذا الدرس ، رأينا أمثلة لإنشاء الملف الشخصي للعضو . للتمرين أدعوكم لإضافة ميزات أخرى منها :

  • تغيير البريد الإلكتروني .
  • تغيير تاريخ الميلاد .
  • تغيير البلد .
  • إنشاء نظام لتبادل الرسائل بين الأعضاء ...إلخ