چگونه یک سیستم عضوگیری ساده توسط PHP بسازیم؟


در طی این مقاله شما استفاده آسان از موارد زیر و همچنین به کاربردن آنها در برنامه‌های دیگر را یاد خواهید گرفت:
*گرفتن اطلاعات کاربر هنگام ثبت نام و ذخیره آن در MySQL
**ساختن یک کلمه عبور به طور تصادفی و تبدیل آن به کد رمز در دیتابیس
***تائید ایمیل کاربر هنگام ثبت نام قبل از اولین ورود
****دستورات ابتدایی کار با فرم‌ها در PHP
*****به کار گیری تابع Mail در PHP و نحوه ارسال ایمیل توسط آن
لازم است یادآوری کنم که کدهای موجود در برنامه به صورت بسیار ساده نوشته شده‌اند و امکان دارد که بر حسب سیستم عامل و یا نسخه PHP که بر روی سیستم شما می‌باشد اجرا نشوند. چنانچه با این مشکل برخورد کردید، عیب را در نحوه نصب PHP و یا سیستم عامل خود جستجو کنید.
چنانچه با PHP و برنامه‌نویسی تحت وب و نیز طراحی صفحات و بانک اطلاعاتی به صورت ابتدایی آشنایی ندارید توصیه می‌کنم که این مقاله را دنبال نکنید. کلیه فایل‌های مورد نیاز در انتهای مقاله به صورت فشرده شده موجود می‌باشند. قبل از ادامه مقاله توصیه می‌کنم که حتما آن ها را دانلود کرده و در ویرایشگرهای خود باز کنید. ویرایشگر مورد استفاده من Notepad می‌باشد.
ساختن بانک اطلاعاتی (Database):
در این مرحله به ساخت یک بانک اطلاعاتی برای سیستم عضویت می‌پردازیم. ممکن است شما از phpMyAdmin و یا سایر برنامه‌های مرتبط با MySQL استفاده کنید ولی من از PHPMyAdmin به خاطر سهولت و همچنین فراگیر بودن آن در اکثر میزبانهای (Host) کاربران ایرانی، استفاده می‌کنم.
جهت این کار ابتدا یک بانک اطلاعاتی با نام دلخواه بسازید و سپس برای ایجاد جداول و مقداردهی اولیه در قسمت Query Window کد زیر را وارد کنید:

CREATE TABLE users (
userid int(25) NOT NULL auto_increment,
first_name varchar(25) NOT NULL default '',
last_name varchar(25) NOT NULL default '',
email_address varchar(25) NOT NULL default '',
username varchar(25) NOT NULL default '',
password varchar(255) NOT NULL default '',
info text NOT NULL,
user_level enum('0','1','2','3') NOT NULL default '0',
signup_date datetime NOT NULL default '0000−00−00 00:00:00',
last_login datetime NOT NULL default '0000−00−00 00:00:00',
activated enum('0','1') NOT NULL default '0',
PRIMARY KEY (userid) ) TYPE=MyISAM COMMENT='Membership Information';
sql.txt


لازم به یادآوری است که چنانچه برنامه نویس حرفه‌ای می‌باشید و یا در زمینه بانک‌های اطلاعاتی سر رشته دارید، ممکن است از شیوه آرایش جدول‌ها در این بانک اطلاعاتی خوشتان نیاید که در اینصورت میتوانید به دلخواه آن را تغییر دهید. شیوه جدول‌بندی و آرایش جدول‌ها در این مقاله به شیوه معمولی می‌باشد.
حال که بانک اطلاعاتی مورد نیاز ایجاد شد به سراغ گرفتن اطلاعات از کاربر و ذخیره آن در بانک اطلاعاتی می‌رویم.
ثبت نام کاربر:
شما می‌توانید با HTML یک فرم ساده ایجاد کنید. این کار به راحتی توسط نرم‌افزارهایی نظیر Front Page و یا DreamWeaver قابل انجام است ولی من یک کد آماده با نام login_from.htm برای شما آماده کرده‌ام که می‌توانید از آن استفاده کنید. شما می‌توانید با سلیقه خود طرح و شکل آن را عوض کنید. چنانچه خواستید شکل فرم را عوض کنید این نکته توجه داشته باشید که نام فیلدهای فرم به صورت زیر باشد: first_name ،last_name ،email_address ،username و info.
چنانچه فرم نمونه را تغییر نمی‌دهید تمام نام‌ها برای هر فیلد درست انتخاب شده‌اند و نیازی به تغییر آنها نیست. لازم به یادآوری است که خاصیت action فرم باید به مسیر درستی (در اینجا register.php) برای فرستادن اطلاعات اشاره کند.
اکنون فایل register.php را باز کنید. به ظاهر کد پیچیده‌ای است. اماعجله نکنید! در ادامه درباره ساختار کدها و طرز کار هریک از آن‌ها صحبت خواهد شد. اگر به توضیحاتی که در درون کدها نوشته شده است توجه کنید درک آن بسیار ساده و قابل فهم خواهد بود. حال به توضیح برنامه می‌پردازیم:

<?php
 include 'db.php';
?>





این خط فایل db.php که حاوی کدهای لازم برای ارتباط با بانک اطلاعاتی می‌باشد را در بدنه اصلی برنامه فراخوانی می‌کند. باز هم این نکته را یادآوری می‌کنم که چنانچه اطلاعات زیادی درباره بانک‌های اطلاعاتی و نحوه برنامه نویسی آنها ندارید، حتما آموخته‌های خود را تکمیل کنید تا فهم و درک مطلب برای شما آسانتر شود. من یک نمونه اتصال به بانک اطلاعاتی را که در db.php نوشته شده در زیر آورده‌ام. اگر جزو کاربران حرفه‌ای PHP هستید تغییرات دلخواه و یا حتی جدید را می‌توانید در db.php انجام دهید:
در مورد کد بالا به نکات زیر توجه کنید:
مقدار dbhost$ در بیشتر موارد localhost می‌باشد. اما چنانچه غیر از این بود با سرویس پشتیبان سرورتان تماس بگیرید.
dbuser$ نام کاربری بانک اطلاعاتی شما می‌باشد.
dbpassword$ کلمه عبور بانک اطلاعاتی شما می‌باشد.
db2use$ نام دیتابیس (بانک اطلاعاتی) مورد استفاده شما می‌باشد.
برای اتصال به بانک اطلاعاتی از یک mysql_pconnect استفاده کردیم که وظیفه ارتباط دائمی را تا پایان برنامه به عهده داشته دارد. این کار باعث صرفه جویی در زمان اجرای برنامه می‌شود ولی این نکته حائز اهمیت است که استفاده از یک ارتباط دائمی در بعضی موارد ممکن است به سود شما نباشد و باعث ایجاد بار اضافی بر روی سرور شما شود. سایر دستورات مربوط به بالا واضح است و احتیاج به توضیح ندارند. حال به ادامه توضیحات می پردازیم:

// Define post fields into simple variables
 $first_name = $_POST['first_name'];
 $last_name = $_POST['last_name'];
 $email_address = $_POST['email_address'];
 $username = $_POST['username'];
 $info = $_POST['info'];

// Let's strip some slashes in case the user entered any escaped characters
 $first_name = stripslashes($first_name);
 $last_name = stripslashes($last_name);
 $email_address = stripslashes($email_address);
 $username = stripslashes($username);
 $info = stripslashes($info);

همانطور که از توضیح اول کد مشخص است، اطلاعات فرستاده شده از طریق فرم در متغیرهایی ذخیره می‌شود. این عمل با استفاده از متد []POST_$ انجام می‌شود. در قسمت بعد از تابع ( )stripslashes استفاده کرده‌ایم. تابع یاد شده \ (اسلش)های موجود قبل از ' و " که PHP به طور خودکار به آنها اضافه می کند را حذف می‌کند. این عمل به خاطر این است که امکان دارد ما اطلاعاتی که توسط کاربر ثبت می شود را دوباره نمایش دهیم. وجود اسلش هنگام فراخوانی اطلاعات از بانک اطلاعاتی موجب بروز خطای دستوری می‌شود. این قسمت بیشتر در مورد اطلاعاتی است که از فیلد Infromation about you کاربرد دارد زیرا کاربر می‌تواند هر آنچه را که می‌خواهد در آن بنویسد.
برای چک کردن اینکه ایمیل درست وارد شده باشد یعنی حاوی @ و . باشد، دستورهای جاوا اسکریپتی بسیاری است که به دلیل پیچیده شدن موضوع آن را به خودتان واگذار میکنیم. حال نوبت به کنترل اطلاعاتی است که کاربر ارسال کرده است:

// Do some error checking on the form posted fields
 if((!$first_name) || (!$
last_name) || (!$email_address) || (!$username)) {
   echo 'You did not submit the following required information!
';

 if (!$first_name) {
   echo "First Name is a required field. Please enter it below.
";
 }

 if (!$last_name) {
   echo "Last Name is a required field. Please enter it below.
";
 }

 if (!$email_address) {
   echo "Email Address is a required field. Please enter it below.
";
 }

 if (!$username) {
   echo "Desired Username is a required field. Please enter it below.
";
 }

 include 'join_form.html'; // Show the form again!
 /* End the error checking and if everything is ok, we'll move on to
 creating the user account */

 exit(); // if the error checking has failed, we'll exit the script!
}

این قسمت بسیار ساده است. شرط اول کنترل میکند که همه فیلدها پر شده باشند. این کار بوسیله عملگر منطقی "یا" "||" انجام می‌شود. چنانچه یکی از فیلدها خالی باشد، پیغام‌های خطای متناظر با آن با آن فیلد بر روی صفحه نشان داده خواهد شد. چنانچه همه فیلدها پر شده باشند و فیلد خالی موجود نباشد کنترل متغیرها متوقف شده و از بلاک شرط با دستور ()exit خارج می شویم. قسمت بعد کنترل اینکه نام کاربری و ایمیل شما قبلا در بانک اطلاعاتی ذخیره نشده باشد:

 $sql_email_check = mysql_query("SELECT email_address FROM users WHERE
 email_address='$email_address'");
 $sql_username_check = mysql_query("SELECT username FROM users WHERE
 username='$username'");
 $email_check = mysql_num_rows($sql_email_check);
 $username_check = mysql_num_rows($sql_username_check);
 
 if (($email_check > 0) || ($username_check > 0)) {
  echo "Please fix the following errors:
";

   if ($email_check > 0) {
     echo "Your email address has already been used by
           another member in our database. Please submit a different
           Email address!
";

     unset($email_address);
   }
 
   if ($username_check > 0) {
     echo "The username you have selected has already been used by
           another member in our database. Please choose a different
           Username!
";

     unset($username);
   }
 
   include 'join_form.html'; // Show the form again!
 
   exit(); // exit the script so that we do not create this account!
 }

دستورات بالا برای آنهایی که در حد متوسط از بانک‌های اطلاعاتی سر رشته دارند بسیار ساده است. چنانچه نام کاربری و یا ایمیل قبلا ثبت شده باشد مقدار () mysql_num_rows برابر صفر نمی‌شود و پیغام‌های متناظر با کنترل نام کاربری و یا ایمیل برای کاربر نشان داده می‌شود و روند ثبت نام قطع شده و پیغام مورد نظر چاپ می شود و در زیر آن دوباره فرم ثبت نام نشان داده می‌شود. حتما تا به حال با این موضوع در سایت های بزرگ برخورد کرده‌اید که چنانچه هر کدام از فیلدها به نحوی اشتباه پر شده باشند و یا نام کاربری قبلا ثبت شده باشد صفحه فرم با اطلاعاتی که کاربر هنگام ورود پر کرده تکمیل شده و قسمت مشکل دار با پیغام خطا به رنگ قرمز نمایش داده می‌شود. برای ساختن چنین روندی به برنامه نویسی پیشرفته و بکارگیری اسکریپت‌های مختلفی نیاز داریم که از سطح متوسط این مقاله خارج است.

function makeRandomPassword() {
 $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;
}
 
$random_password = makeRandomPassword();
$db_password = md5($random_password);

کار این تابع ایجاد یک کلمه عبور تصادفی و تبدیل آن به فرمت md5 است. اینکه چرا کاربر اجازه ندارد که خودش کلمه عبور را انتخاب کند دلایلی دارد. یکی از آن دلایل این است که کلمه عبور ساخته شده به ایمیل کاربر فرستاده می‌شود و این به ما در راستای اینکه آیا ایمیل ثبت شده توسط کاربر ایمیل معتبری می‌باشد کمک می‌کند. به عبارتی چنانچه ایمیل فرد معتبر باشد کاربر با رفتن به ایمیل پسورد خود را دریافت می‌کند. و دلیل دیگر اینکه باایجاد یک کلمه عبور تصادفی و همچنین تبدیل آن به md5 امنیت کلمه عبور بسار بالا می‌رود و به سادگی توسط هکرها قابل شناسایی نیست.

// Enter info into the Database.
 $info2 = htmlspecialchars($info);
 $sql = mysql_query("INSERT INTO users (first_name, last_name,
 email_address, username, password, info, signup_date)
 VALUES('$first_name', '$last_name', '$email_address',
 '$username', '$db_password', '$info2', now())") or die (mysql_error());
 
 if (!$sql) {
   echo 'There has been an error creating your account. Please
   contact the  webmaster.';
 }
 else {
   $userid = mysql_insert_id();

   // Let's mail the user!
   $subject = "Your Membership at MyWebsite!";
   $message = "Dear $first_name $last_name,
   Thank you for registering at our website,
http://www.mydomain.com!
   You are two steps away from logging in and accessing our exclusive members
   area. To activate your membership, please click here:
  
http://www.mydomain.com/activate.php?id=$userid&code=$db_password
   Once you activate your memebership, you will be able to login with the
   following information:
   Username: $username
   Password: $random_password
   Thanks!
   The Webmaster
   This is an automated response, please do not reply!";

   mail($email_address, $subject, $message,
   "From: MyDomain Webmaster<
admin@mydomain.com>");
   echo 'Your membership information has been mailed to your email address!
   Please check it and follow the directions!';
 }
?>

همانطور که از توضیحات بر می‌آید، این قسمت جهت ثبت در بانک اطلاعاتی و فرستادن اطلاعات از قببیل پسورد و همچنین لینک فعال سازی به کاربر می‌باشد. اما تابع ( )htmlspecialchars چه کاری انجام می‌دهد؟ این تابع تگهای html را به کدهای مربوطه تغییر می‌دهد برای مثال:

$new = htmlspecialchars("Test", ENT_QUOTES);
echo $new;  //
Test

این کار باعث می‌شود که کاراکترهایی نظیر < > ' به همین صورت در بانک اطلاعاتی ذخیره نشوند و باعث بروز خطاهای دستوری هنگام فراخوانی آنها توسط PHP نشوند.
در قسمت بعد اطلاعاتی که پس از گذراندن از مراحل مختلف آماده ذخیره شدن در بانک اطلاعاتی هستند به وسیله دستورINSERT در بانک اطلاعاتی ثبت می‌شوند. چنانچه مشکلی در بانک اطلاعاتی وجود نداشته باشد، مرحله بعدی آن که فرستادن ایمیل به کاربر می‌باشد اجرا می‌شود. فرستادن ایمیل توسط تابع ()mail انجام می‌شود. روش‌های استفاده از تابع ()mail بسیار است که با مراجعه به help برنامه PHP می‌توانید آنها را مشاهده کنید. در این جا ساده‌ترین روش برای اینکار انتخاب شده است. کاربر در قسمت پیام ایمیل چیزی شبیه به آنچه در زیر آمده است مشاهده می‌کند:

From: MyDomain Webmaster
To:
you@email.com
Subject: Your Membership at MyWebsite!

Dear boy from sun,
Thank you for registering at our website,
http://www.mydomain.com!
You are two steps away from logging in and accessing our exclusive members area.
To activate your membership, please click here:
http://www.mydomain.com/activate.php?id=3&cod=37ec82769e837c2f853450
Once you activate your memebership, you will be able to login with the
following information:
Username: myusername
Password: msxsag4h

Thanks!
The Webmaster
This is an automated response, please do not reply!

مرحله بعد به روز رسانی پایگاه داده هنگامی که کاربر ایمیل خود را چک کرده و بر روی لینک معتبر سازی کلیک کرده است، می‌باشد. کد زیر در فایل activate.php ذخیره شده است:

 0) {
   echo "Your account has been activated! You may login below!
";
   include 'login_form.html';
 }
?>


خط اول فراخوانی فایل db.php برای برقراری ارتباط با بانک اطلاعاتی می‌باشد. پس از گرفتن اطلاعات خواسته شده از طریق لینک فعال سازی، برنامه ابتدا مقدار activate کاربر را در صورت صحت اطلاعات ارسالی برابر با 1 قرار می‌دهد و در بانک اطلاعاتی ذخیره می‌کند و چنانچه این عمل با موفقیت انجام شد دوباره کنترل میکند که آیا فعال سازی نام کاربری درست انجام گرفته است یا خیر. چنانچه این قسمت بدون خطا اجرا شود، صفحه ورود کاربر در صفحه ظاهر می‌شود.
منبع:www.parantezbaz.com