بنام مالک یوم الدین

 سلام, آیا عاشق جملات فاز سنگین هستین؟ پس همراه بنده باشین تا فاز سنگین رو بهتون نشون بدمlaugh

سطح آموزش : سخته!

پیش نیاز : html / php / mysql

قراره توی این مقاله یاد بگیریم چه جوری کاربر بعد از ثبت نام از طریق فرم , ایمیل دریافت کنه که توش لینک فعالسازی باشه.

مواد لازم:

  • یک عدد فایل index.html
  • یک عدد فایل signup.php
  • یک عدد فایل signupok.php
  • یک عدد دیتابیس mysql
  • کلاس های آماده PHPMailer : دانلـــود ( برای اینکه بتونیم ایمیل بفرستیم )
  •  IDE به مقدار لازم ( این دیگه چیه؟ منظورم محیط توسعه هس . ای بابا ! نرم افزاری که توش کد میزنین!)

سناریو ( عاشق این کلمه های قلمبه سلمبه ام! درست نوشتم؟)

یه دیتابیس داریم و یه جدول داخلش که توش اطلاعات ثبت نام یوزر ها توش ذخیره میشه. خب یه صفحه داریم به نام  index.html که کاربرا میان توش یه فرم رو پر و روی دکمه Sign Up کلیک می کنن . درادامه اطلاعات به signup.php ارسال میشن و در اینجا یه کد فعال سازی میسازیم و همراه اطلاعات در دیتابیس ذخیره میشه و ایمیلی به کاربر مبنی بر فعالسازی اکانت ارسال میشه. حالا کاربر میره ایمیل رو چک میکنه و روی لینک فعال سازی کلیک میکنه و توی signupok.php کد فعالسازی چک میشه که کاربرمون وجود داره یا نه بعدش اکانتش رو فعال می کنیم.

 

ساخت دیتابیس

قبل از کد نویسی باید دیتابیس و جدول های موردنظرمون رو بسازیم. خب phpmyadmin رو توی مرورگر باز می کنیم یه دیتابیس با نام test می سازیم و داخل این دیتابیس یه جدول بنام weblog_user با فیلد های زیر میسازیم 

id INT / AUTO_INCREMENT / Primary Key
username (VARCHAR(15
email (VARCHAR(50
code (VARCHAR(10
sign_key (1)TINYINT

حالا که دیتابیس و جدول رو ساختیم میتونیم شروع کنیم.( فکر کنم بیش از اندازه خلاصه و مفید گفتم!)

 

طراحی فرم ثبت نام : index.php

درابتدا با html یک فرم طراحی می کنیم که توش 2 تا فیلد داره  : نام کاربری - ایمیل + یک دکمه ثبت نام. (انصافا کدوم سایت با 2 تا فیلد ثبت نام میکنه؟ نه انصافا!indecision) و میریزمشون توی index.html.

ها این html که وگفتی یعنی چه؟

html زبان صفحات وب هست. روی یه جایی از همین صفحه راست کلیک کنین و گزینه view page source رو بزنین, میبینید که یه سری کد عجق وجقی بهتون نمایش میده . اونایی که بین <> قرار دارن اصطلاحا تگ های html هستند. برای اطلاع بیشتر برین تو لینک

 اینم ساختار index.html :

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title>ثبت نام</title>
</head>
<body>
  <form name="signup" method="post" action="signup.php">
    <b>User Name: &nbsp;</b>
    <input type="text" name="username">
    <br>
    <b>E-Mail: &nbsp;</b>
    <input type="text" name="email">
    <br>
    <input type="submit" value="SignUp">
  </form>
</body>
</html>
نتیجه به این شکل میشه : 
 
 
خب یه توضیح کوچولو بدم تا ابهاماتتون رفع بشه : 
تگ فرممون چند خاصیت داره که باید حتما اونا مقدار دهی شده باشن : 
1- method : که شیوه ی ارسال اطلاعات فرم رو تعیین میکنه 2 تا حالت داره : post و get. حالت get اطلاعات رو از طریق url ارسال میکنه و قابل دیدن هست ولی حالت post اطلاعات رو توسط صفحه ارسال میکنه  قابل دیدن نیست و کاربرد امنیتی داره( بابا امنیت !! بابا سایبر !! بابا سکرتی!! پلیس فتا!! سنترال اینتلیجنس اژنسی!! (این آخری چی بود؟enlightened))
2- action : صفحه ی مقصد که قراره اطلاعات فرممون رو پردازش کنه .
تگ های input ای که توشون اطلاعات وارد میشن باید name شون یه اسم دلخواهی داشته باشن تا توی مقصد بشه اطلاعات اون ها رو دریافت کرد.
 
دریافت اطلاعات و ذخیره کردن در دیتابیس و ارسال ایمیل : signup.php
خب بریم سراغ فایل signup.php که توی فرم بالا بهش ارجاع دادیم :
در ابتدا کتابخونه PHPMailer رو فراخونی می کنیم:
require_once("class.phpmailer.php");
require_once("class.smtp.php");
یک متد میسازیم به نام ()generateRandomString که قراره با مقدارعددی که به عنوان ورودی بهش میدیم بهمون یه رشته تصادفی به طول اون مقدار بهمون بده :
function generateRandomString($length = 10) {
  $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  $charactersLength = strlen($characters);
  $randomString = '';
  for ($i = 0; $i < $length; $i++) {
    $randomString .= $characters[rand(0, $charactersLength - 1)];
  }
  return $randomString;
}
حالا 2 مقدار ارسالی فرم به نام های username و email رو  دریافت می کنیم و داخل متغیرها میریزیم:
$user = $_POST['username'];
$email = $_POST['email'];
درادامه 4 تا متغیر میسازیم برای دسترسی به دیتابیس و توش به ترتیب اسم سرورمون , یوزر نیم , پسورد و اسم دیتابیسمون رو میریزیم:
$servername = "localhost";
$username = "root";
$password = "";
$database = "test";
حالا یک کانکشن برای اتصال به دیتابیس MYSQL میسازیم از نوع mysqli و 4 تا متغیر بالا رو به عنوان ورودی بهش میدیم:
$connection = new mysqli($servername, $username, $password, $database);
یک کد تصادفی با استفاده از متدی که نوشتیم میسازیم و داخل متغیر code$ میریزیم:
$code = generateRandomString();
دستور SQL برای درج رکورد در دیتابیس :
$sql = "INSERT INTO weblog_user (id, username, email, code) VALUES (NULL, '$user', '$email', '$code')";
درنهایت هم اجرای دستور بالا توسط متد ()query :
$connection->query($sql);
خب یوزر ما داخل دیتابیس ذخیره شد .حالا باید بهش ایمیل بزنیم و بهش بگیم که اکانتشو فعال کنه :
درابتدا یک نمونه از روی PHPMailer میسازیم و داخل mail$ میریزیم :
$mail = new PHPMailer();
سپس چیزایی که یه ساختار ایمیل داره رو بهش میدیم مثلا : 
1- آدرس فرستنده ایمیل که در اینجا مثلا info@ucgain.blog.ir هست:
$mail->setFrom("info@ucgain.blog.ir");
2- افزودن گیرندگان ایمیل که در اینجا همون ایمیل دریافتی از فرم رو اضافه می کنیم:
$mail->AddAddress($email);
3- موضوع ایمیل رو تعیین می کنیم:
$mail->Subject = "SignUp!";
4- لینکی که می خواهیم توی ایمیل باشد رو با تگ های html میسازیم:
$link = '<a href ="http://localhost/forweblog/signupok.php?a='.$code.'">Click Here!</a>';
5- چیزی که در بالا ساختیم رو به عنوان بدنه ایمیل اضافه می کنیم :
$mail->Body = "Hello ".$user."<br>"."Activision Link :".$link;
خب حالا باید یه سری تنظیمات رو کانفیگ کنیم:
1- درابتدا چند تا چیز رو فعال می کنیم:
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->IsHTML(true);
قبل از اینکه بریم مرحله 2 باید بگم که در اینجا نیاز به یک ایمیل فعال داریم که برامون این ایمیل رو بفرسته!! 
2- خب در اینجا ما باید حالا باید اطلاعات مربوط به هاستی که ایمیل رو قراره بفرسته رو ست کنیم :
$mail->Host = "smtp.gmail.com";
3- حالا باید یوزر نیم و پسورد ایمیل فعالمون رو بهش بدیم:
$mail->Username = "mygmail@gmail.com";
$mail->Password = "Passwordmygmail";
4- پورت سرور ایمیل و نوع محافظت از ایمیل رو مشخص می کنیم :
$mail->SMTPSecure = "ssl";
$mail->Port = 465;
درنهایت ایمیل رو ارسال می کنیم و چک می زنیم ببینیم ایمیل ارسال شده یا نه( توی این مطلب چقدر ایمیل ایمیل کردم!!)
if($mail->Send()){
  echo "Check Mail!";
}else{
  echo "Sign Fail!";
}
تکمیل فرایند ثبت نام و فعال سازی اکانت : signupok.php
خب حالا باید کدنویسی signupok.php رو انجام بدیم:
در ابتدا کدی که به واسطه ی ایمیل فرستادیم رو دریافت می کنیم :
$code = $_REQUEST['a'];
با دیتابیس اتصال رو برقرار می کنیم:
$servername = "localhost";
$username = "root";
$password = "";
$database = "test";
$connection = new mysqli($servername, $username, $password, $database);
دستور SQL برای اینکه ببینه اصلا یوزری با این کد ثبت شده یا نه:
$sql = "SELECT * FROM weblog_user WHERE code = '$code'";
اجرای دستور بالا توسط query و ریختن نتیجه ی آن در یک متغیر:
$result = $connection->query($sql);
یک فرایندی که توش , ما رکورد ذخیره شدمون رو بدست میاریم :
$record = array();
while($row = $result->fetch_assoc()){
  $record = $row;
}
چک میزنیم ببینیم رکوردمون خالیه یا نه. اگه پر باشه که یه دستور SQL دیگه مینویسیم که اکانت یوزرمون رو فعال کنه و در غیر اینصورت پیغامی درخور و شایستگی یوزر نمایش بده!!
if(is_null($record)){
  echo "no sign";
}
else{
  $sql2 = "UPDATE webog_user SET sign_check = true WHERE code = '$code'";
  $connection->query($sql2);
  echo "Activision OK!";
}
تمام شد! خدا رو شکر! میدونم سخت بود ! اگه php کار نکرده باشین که سخت تر هم میشه!( حالا تو که php بلدی به کجا رسیدی ؟ بوگو دیگه ؟)
تا مطلب فاز سنگینی دیگر بدرود!wink
سورس رو یادم رفته بود براتون بذارم, اینم لینکش :دانلـــود