در طي اين مقاله شما استفاده آسان از موارد زير و همچنين به کاربردن آنها در برنامههاي ديگر را ياد خواهيد گرفت:
*گرفتن اطلاعات کاربر هنگام ثبت نام و ذخيره آن در 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/س