همان طور که می دانیم استفاده از php و mysql برای ایجاد صفحات و سایت های داینامیک به دلایل مختلف بیش از پیش رو به گسترش است، از طرفی بسیاری از افراد تمایل دارند برای سایت یا صفحه خود، فُرمی جهت ثبت نام کاربران داشته باشند، مثلا برای ارسال خبرنامه و اطلاع از به روز رسانی سایت یا فراتر از آن برای ایجاد یک محیط کاربری و ورود و خروج کاربران به پنل سایت و خیلی چیزهای دیگر؛ اما قبل از دست یافتن به این هدفها، نیاز به ایجاد یک فرم ثبت نام و عضویت کاربر است تا اطلاعات لازم جهت ورود و خروج ایمن را در پایگاه داده داشته باشیم؛ از این رو به جهت آشنایی شما، در این آموزش قصد داریم روش ساخت یک سیستم ساده و در عین حال کاربردیِ ثبت نام و عضویت را با php و mysql آموزش دهیم.
ایجاد جدول و ردیف با دستور CREATE

قبل از هر چیز باید جدولی در پایگاه داده خود با نامی دلخواه بسازیم و ردیف هایی را در آن برای نگهداری نام کاربری، کلمه عبور و سایر اطلاعات مورد نیاز ایجاد کنیم، بدین منظور از دستور CREATE TABLE در MySQL استفاده می کنیم؛ در کد زیر ما سه ردیف id، username و password در جدول فرضی register ساخته ایم.

<?php
//اطلاعات اتصال به پایگاه داده
mysql_connect("localhost", "user", "pass")
or die(mysql_error());   
//نام دیتابیس
mysql_select_db("db")
or die(mysql_error());
//ایجاد جدول و ردیف با دستور CREATE TABLE
mysql_query("CREATE TABLE register(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
username VARCHAR(255),
password VARCHAR(255)) ENGINE=MyISAM ")
or die(mysql_error());   
//پایان ارتباط با پایگاه داده  
mysql_close;  
?>

توضیح:

  • ابتدا در قسمت mysql_connect باید اطلاعات لازم جهت اتصال به پایگاه داده را تعریف کنید (نام کاربری و کلمه عبور).
  • در قسمت mysql_select_db دیتابیس مورد نظر را انتخاب کنید، این دیتابیس را باید قبلا ایجاد کرده باشید.
  • دستور CREATE TABLE سه ردیف id با خاصیت افزایش خودکار (AUTO_INCREMENT)، ردیف username و password از نوع VARCHAR می سازد و در نهایت موتور پیش فرض ردیف ها را بر روی MyISAM تنظیم می کند.
  • در نهایت هم اتصال با پایگاه داده با تابع mysql_close به پایان می رسد.
    فرم html جهت عضویت و ثبت نام کاربر

پس از ساختن جداول و ردیف ها، اکنون نوبت به ساختن فرم html برای ارتباط با کاربر است، با طراحی یک صفحه به صورت html و قرار دادن چند فیلد در آن به فرض به عنوان نام کاربری و کلمه عبور، می توانیم اطلاعات کاربر را در جدول و در ردیف های تعیین شده ذخیره کرده و در واقع قابلیت عضویت در سایت را ایجاد کنیم، به همین جهت فرم زیر را جهت نمونه ساخته ایم.

<!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=utf-8" />
<title>وبگو | صفحه ثبت نام کاربر</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    direction:rtl;
    font-size:12px;
}
</style>
</head>
<body>
<form action="register.php" method="post">
<label for="user">نام کاربری:</label>
<input name="username" id="user" type="text" maxlength="255" />
<label for="pass">کلمه عبور:</label>
<input name="password" id="pass" type="password" maxlength="255" />
<input type="submit" value="عضویت" />
</form>
</body>
</html>

توضیح:

  • این فرم html، دو فیلد جهت انتخاب نام کاربری و کلمه عبور ایجاد می کند.
  • در قسمت action آدرس فایل register.php را قرار می دهیم (اطلاعات فرم به این فایل ارسال می شوند).
  • برای ارسال اطلاعات از متُد post استفاده کرده ایم.
  • آنچه به عنوان مقدار یا value به فایل register.php ارسال می شود با قسمت مربوط به name در تگ input قابل شناسایی و دریافت است (در ادامه خواهیم دید).
  • با قرار دادن خاصیت maxlength حداکثر تعداد کاراکترهای مجاز را تعیین می کنیم.
  • قسمت مربوط به label جهت تعریف برچسب های استاندارد برای تگ های فرم، استفاده می شود.
  • سرانجام اطلاعات با یک دکمه submit به فایل register.php ارسال می شوند.
    بررسی و ذخیره اطلاعات با فایل register.php

پس از اینکه کاربر اطلاعات خود را در فیلدهای موجود در فرم بالا وارد می کند، این اطلاعات با متد post به فایل register.php ارسال می شوند و پارامترها با استفاده از post_$ در دسترس هستند، به مثال زیر توجه کنید.

<?php
//دریافت و تعریف متغیر ها
$username = $_POST['username'];
$password = $_POST['password'];
?>

توضیح:

  • با روش بالا، نام کاربری از فیلد username دریافت و در متغیر username ذخیره می شود، همچنین کلمه عبور از فیلد password دریافت و در متغیر password ذخیره می شود، با این کار اطلاعات کاربر در کد php قابل دسترس است و می توانیم پردازش های مورد نظر را روی آن اعمال کنیم.
  • دقت کنید که معمولا آنچه برای php در کار با یک فرم html اهمیت دارد، متد استفاده شده (post یا get) و نام فیلدها است (نه آی دی آنها).

بررسی معتبر بودن اطلاعات

پس از اینکه اطلاعات فیلدها را در متغیر های قابل استفاده در php دریافت کردیم، باید معتبر بودن آنها را بررسی کنیم، پس کد زیر را در ادامه اضافه می کنیم.

<?php
//دریافت و تعریف متغیر ها
$username = $_POST['username'];
$password = $_POST['password'];
//بررسی معتبر بودن اطلاعات ارسالی کاربر
//نام کاربری
if (!isset($username) || $username == ''){
    echo "فیلد نام کاربری نباید خالی باشد!";
    $check_error = 1;
}
//کلمه عبور
elseif (!isset($password) || $password == ''){
    echo "فیلد کلمه عبور نباید خالی باشد!";
    $check_error = 1;
}
//مجاز بودن انتخاب حروف انگلیسی به عنوان نام کاربری
elseif (preg_match('/^[a-zA-Z0-9 _-]+$/', $username) === 0){
    echo "نام کاربری دارای کاراکترهای غیر مجاز است!";
    $check_error = 1;
}
?>

توضیح:

  • در دستور شرطی if، تنظیم شدن و خالی نبودن نام کاربری را با isset بررسی می کنیم، اگر نام کاربری خالی باشد، یک پیام به کاربر نشان داده می شود و متغیری به نام check_error (نامی دلخواه است) را برابر 1 قرار می دهیم (تا در ادامه وضعیت آن را چک کنیم).
  • در دستور elseif اول، محاسبات بالا را بر روی کلمه عبور انجام می دهیم تا از خالی نبودن آن یا ارسال اشتباه فرم توسط کاربر اطمینان حاصل کنیم.
  • در قسمت elseif آخر نیز با تابع preg_match بررسی می کنیم تا ببینیم آیا کارکترهای وارد شده توسط کاربر بین حروف و اعداد انگلیسی جای دارند یا خیر، همچنین دو علامت - و _ هم جزء کاراکترهای مجاز است، اگر کاراکتری خارج از این شرایط ارسال شود، بررسی preg_match نادرست یا false شده (وضعیت با عدد صفر برگردانده می شود) و پیام خطا به کاربر نشان داده خواهد شد.
    بررسی اعتبار اطلاعات فرم، بسته به اینکه هدف و خواسته شما چه چیز باشد، متفاوت و سلیقه ای است، لذا مثال های عنوان شده صرفا جهت نمونه است و هیچ محدودیتی در این خصوص وجود ندارد.

حفظ امنیت اطلاعات

اگر همه چیز درست باشد و کاربر فیلدها را به طور کامل و صحیح پُر نماید، نوبت به ذخیره اطلاعات در دیتابیس است، اما قبل از اینکه به این کار بپردازیم، یک امر مهم را نباید فراموش کنیم، حفظ امنیت اطلاعات و پایگاه داده! توضیح اینکه رعایت برخی مسائل امنیتی در کار با پایگاه داده ضروری است، چرا که اگرچه بیشتر کاربران هیچ سوء نیتی ندارند، اما ممکن است هر از چندگاهی برخی پیدا شوند که به دنبال کوچکترین فرصتی برای نفوذ و آسیب زدن به سیستم شما باشند، از طرفی ذخیره اطلاعات و مخصوصا کلمه عبور کاربران، باید به صورت رمزی شده باشد تا امکان هر نوع سوء استفاده احتمالی را از بین ببرد و ضریب امنیت را افزایش دهد، بدین منظور ما از دو تابع mysql_real_escape_string و md5 در php استفاده می کنیم.

<?php
//اطلاعات اتصال به پایگاه داده
mysql_connect("localhost", "user", "pass")
or die(mysql_error());   
//نام دیتابیس
mysql_select_db("db")
or die(mysql_error());
//دریافت و تعریف متغیر ها
$username = $_POST['username'];
$password = $_POST['password'];
//بررسی معتبر بودن اطلاعات ارسالی کاربر
//نام کاربری
if (!isset($username) || $username == ''){
    echo "فیلد نام کاربری نباید خالی باشد!";
    $check_error = 1;
}
//کلمه عبور
elseif (!isset($password) || $password == ''){
    echo "فیلد کلمه عبور نباید خالی باشد!";
    $check_error = 1;
}
//مجاز بودن انتخاب حروف انگلیسی به عنوان نام کاربری
elseif (preg_match('/^[a-zA-Z0-9 _-]+$/', $username) === 0){
    echo "نام کاربری دارای کاراکترهای غیر مجاز است!";
    $check_error = 1;
}
//جلوگیری از نفوذ به دیتابیس
$username = mysql_real_escape_string($username);
$password = md5($password);
if ($check_error != 1){
//در این مرحله اطلاعات را در دیتابیس ذخیره خواهیم کرد
##########PHP MySQL INSERT INTO db##########
}
//پایان ارتباط با پایگاه داده  
mysql_close;
?>

**
توضیح:**

  • همانطور که می بینید، در اینجا اطلاعات اتصال به پایگاه داده را در ابتدا تعریف کرده ایم، این کار بدین جهت نیاز است که تابع mysql_real_escape_string نیاز به اطلاعات اتصال به پایگاه داده دارد، در غیر اینصورت با خطا مواجه خواهیم شد، از این تابع برای جلوگیری از MySQL Injection یا همان جلوگیری از نفوذ به دیتابیس استفاده می شود.
  • از تابع md5 برای رمزی کردن رشته ها استفاده می شود، اگرچه هیچ سیستمی به طور کامل ایمن نیست، ولی با استفاده از تابع md5 تا حدود زیادی امنیت کلمه های عبور کاربران حفظ می شود (توجه داشته باشید که برگرداندن پسورد های اینکُد یا رمزی شده با md5 تقریبا غیر ممکن است).
    ذخیره اطلاعات با INSERT INTO در MySQL

اکنون که همه چیز را به درستی انجام داده ایم، نوبت به گام آخر است، در این مرحله اطلاعات کاربر را در دیتابیس و جدول register در ستون های username و password ذخیره می کنیم تا بعدا از آنها استفاده کنیم، این کار را در کد زیر انجام داده ایم.

<!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=utf-8" />
<title>وبگو | بررسی و ثبت اطلاعات کاربر</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
</style>
</head>
<body>
<?php
//اطلاعات اتصال به پایگاه داده
mysql_connect("localhost", "user", "pass")
or die(mysql_error());   
//نام دیتابیس
mysql_select_db("db")
or die(mysql_error());
//دریافت و تعریف متغیر ها
$username = $_POST['username'];
$password = $_POST['password'];
//بررسی معتبر بودن اطلاعات ارسالی کاربر
//نام کاربری
if (!isset($username) || $username == ''){
    echo "فیلد نام کاربری نباید خالی باشد!";
    $check_error = 1;
}
//کلمه عبور
elseif (!isset($password) || $password == ''){
    echo "فیلد کلمه عبور نباید خالی باشد!";
    $check_error = 1;
}
//مجاز بودن انتخاب حروف انگلیسی به عنوان نام کاربری
elseif (preg_match('/^[a-zA-Z0-9 _-]+$/', $username) === 0){
    echo "نام کاربری دارای کاراکترهای غیر مجاز است!";
    $check_error = 1;
}
//جلوگیری از نفوذ به دیتابیس
$username = mysql_real_escape_string($username);
$password = md5($password);
if ($check_error != 1){
//در این مرحله اطلاعات را در دیتابیس ذخیره خواهیم کرد
mysql_query("INSERT INTO register (username,password) VALUES('$username','$password')")
or die(mysql_error());
echo "عضویت شما با موفقیت انجام شد!<br />";
}
//پایان ارتباط با پایگاه داده  
mysql_close;
?>
</body>
</html>

توضیح:

  • ساختار دستور INSERT INTO بسیار ساده است، اطلاعات را در ردیف ها ی تعین شده به شیوه آرایه، کلیدها و مقادیر ذخیره می کند، برای جدا سازی ستون ها و مقادیر آنها از علامت , استفاده کنید.
  • در کد بالا صرفا جهت مثال و آشنایی شما چند فیلد را جهت نمونه آورده ایم، شما می توانید با توجه به نیازتان قابلیت های بیشتری برای ثبت نام و عضویت کاربران ایجاد کنید و از این لحاظ محدودیتی نیست.
  • برای استفاده از اطلاعات ذخیره شده ی اعضای سایت، نیاز به تعریف و نوشتن کدهای دیگری است که در این مجال فرصت پرداختن به آنها نیست، این امر را به آموزش های بعدی موکول می کنیم.

webgoo.ir

این سایت هم خیلی عالی و قدم به قدم توضیح داده:
How to Create Registration Page in PHP/MySQL | Free source code, tutorials and articles
How to Create Login Page in PHP/MySQL | Free source code, tutorials and articles