آموزش ساخت فرم ثبت نام و ورود با استفاده از php pdo و mysql و الگوریتم رمزنگاری SHA-256
پیش نیاز های این آموزش:
- PHP
- MySQL
- Bootstrap (اختیاری)
اگر شما در برنامه نویسی PHP یه مبتدی هستید نگران نباشید قطعا این آموزش برای شما هم مفید خواهد بود فقط کافی است مراحل رو با دقت دنبال کنید.
قصد ما از این آموزش ساخت سیستم ثبت نام و ورود به سیستم با استفاده PHP و PDO هست، تا در آخر این آموزش شما بتوانید از PDO استفاده کنید و به راحتی در سیستم طراحی شده ثبت نام کنید و وارد بشید.
الکوریتم SHA-256 یک تابع رمزنگاری یک طرفه است که کسی نمی تواند آنرا رمزگشایی کند.
مرحله 1: ساخت پایگاه داده و جدول مورد نیاز:
CREATE TABLE `table_users` ( `user_id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` varchar(50) NOT NULL, `email` varchar(100) NOT NULL, `username` varchar(100) NOT NULL, `password` varchar(250) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
مرحله 2: کد نویسی فایل اتصال به پایگاه داده:
فایل جدیدی با نام database.php بسازید و کد های زیر را در آن وارد کنید:
<?php define('HOST', 'localhost'); // نام هاست define('USER', 'root'); // نام کاربری پایگاه داده define('PASSWORD', ''); // رمز عبور پایگاه داده define('DATABASE', 'pdo_login'); // نام پایگاه داده function DB() { try { $db = new PDO('mysql:host='.HOST.';dbname='.DATABASE.'', USER, PASSWORD); return $db; } catch (PDOException $e) { return "Error!: " . $e->getMessage(); die(); } } ?>
مرحله 3: طراحی فرم ورود و ثبت نام :
من هر دو فرم را در فایل index.php اضافه کردم، ولی شما می توانید به راحتی فایل های جداگانه ای برای هر دو صفحه ایجاد کنید.
همچنین، برای طراحی از فریم ورک bootstrap استفاده کردم:
فرم ثبت نام:
<div class="row"> <div class="col-md-5 well"> <h4>ثبت نام</h4> <?php if (isset($register_error_message)) { echo '<div class="alert alert-danger"><strong>Error: </strong> ' . $register_error_message . '</div>'; } ?> <form action="index.php" method="post"> <div class="form-group"> <label for="">نام</label> <input type="text" name="name" class="form-control"/> </div> <div class="form-group"> <label for="">ایمیل</label> <input type="email" name="email" class="form-control"/> </div> <div class="form-group"> <label for="">نام کاربری</label> <input type="text" name="username" class="form-control"/> </div> <div class="form-group"> <label for="">رمز عبور</label> <input type="password" name="password" class="form-control"/> </div> <div class="form-group"> <input type="submit" name="btnRegister" class="btn btn-primary" value="ثبت نام"/> </div> </form> </div> </div>
فرم ورود:
<div class="row"> <div class="col-md-5 well"> <h4>ورود</h4> <?php if (isset($login_error_message)) { echo '<div class="alert alert-danger"><strong>Error: </strong> ' . $login_error_message . '</div>'; } ?> <form action="index.php" method="post"> <div class="form-group"> <label for="">نام کاربری / ایمیل</label> <input type="text" name="username" class="form-control"/> </div> <div class="form-group"> <label for="">رمز عبور</label> <input type="password" name="password" class="form-control"/> </div> <div class="form-group"> <input type="submit" name="btnLogin" class="btn btn-primary" value="ورود"/> </div> </form> </div> </div>
مرحله 4: کدنویسی فایل کتابخانه library.php :
فایل کتابخانه دارای چندین توابع برای رسیدگی به درخواست از صفحه index.php است.
<?php /* * Tutorial: PHP Login Registration system * * Page: Application library * */ class USERS { /* * Register New User * * @param $name, $email, $username, $password * @return ID * */ public function Register($name, $email, $username, $password) { try { $db = DB(); $query = $db->prepare("INSERT INTO table_users(name, email, username, password) VALUES (:name,:email,:username,:password)"); $query->bindParam("name", $name, PDO::PARAM_STR); $query->bindParam("email", $email, PDO::PARAM_STR); $query->bindParam("username", $username, PDO::PARAM_STR); $enc_password = hash('sha256', $password); $query->bindParam("password", $enc_password, PDO::PARAM_STR); $query->execute(); return $db->lastInsertId(); } catch (PDOException $e) { exit($e->getMessage()); } } /* * Check Username * * @param $username * @return boolean * */ public function isUsername($username) { try { $db = DB(); $query = $db->prepare("SELECT user_id FROM table_users WHERE username=:username"); $query->bindParam("username", $username, PDO::PARAM_STR); $query->execute(); if ($query->rowCount() > 0) { return true; } else { return false; } } catch (PDOException $e) { exit($e->getMessage()); } } /* * Check Email * * @param $email * @return boolean * */ public function isEmail($email) { try { $db = DB(); $query = $db->prepare("SELECT user_id FROM table_users WHERE email=:email"); $query->bindParam("email", $email, PDO::PARAM_STR); $query->execute(); if ($query->rowCount() > 0) { return true; } else { return false; } } catch (PDOException $e) { exit($e->getMessage()); } } /* * Login * * @param $username, $password * @return $mixed * */ public function Login($username, $password) { try { $db = DB(); $query = $db->prepare("SELECT user_id FROM table_users WHERE (username=:username OR email=:username) AND password=:password"); $query->bindParam("username", $username, PDO::PARAM_STR); $enc_password = hash('sha256', $password); $query->bindParam("password", $enc_password, PDO::PARAM_STR); $query->execute(); if ($query->rowCount() > 0) { $result = $query->fetch(PDO::FETCH_OBJ); return $result->user_id; } else { return false; } } catch (PDOException $e) { exit($e->getMessage()); } } /* * get User Details * * @param $user_id * @return $mixed * */ public function UserDetails($user_id) { try { $db = DB(); $query = $db->prepare("SELECT user_id, name, username, email FROM table_users WHERE user_id=:user_id"); $query->bindParam("user_id", $user_id, PDO::PARAM_STR); $query->execute(); if ($query->rowCount() > 0) { return $query->fetch(PDO::FETCH_OBJ); } } catch (PDOException $e) { exit($e->getMessage()); } } }
جزئیات عملکردهای صفحه library:
Register() – این عملکرد برای ایجاد / اضافه کردن کاربر جدید به پایگاه داده است.
isUsername() – برای بررسی اعتبار سنجی دسترسی به نام کاربری استفاده می شود.
isEmail() – برای بررسی اعتبار در دسترس بودن آدرس ایمیل استفاده می شود.
Login() – برای ورود کاربر به سیستم با استفاده از نام کاربری / ایمیل و رمز عبور استفاده می شود.
UserDetails() – برای دریافت اطلاعات کاربر با توجه به ID مشخص شده.
کد کامل index.php :
<?php //Page index.php // Start Session session_start(); // Application library require __DIR__ . '/lib/library.php'; $app = new USERS(); // check Login request if (!empty($_POST['btnLogin'])) { $username = trim($_POST['username']); $password = trim($_POST['password']); if ($username == "") { $login_error_message = 'فیلد نام کاربری مورد نیاز است!'; } else if ($password == "") { $login_error_message = 'فیلد رمز عبور مورد نیاز است!'; } else { $user_id = $app->Login($username, $password); // check user login if($user_id > 0) { $_SESSION['user_id'] = $user_id; // Set Session header("Location: profile.php"); // Redirect user to the profile.php } else { $login_error_message = 'جزئیات ورود نا معتبر می باشد!'; } } } // check Register request if (!empty($_POST['btnRegister'])) { if ($_POST['name'] == "") { $register_error_message = 'فیلد نام مورد نیاز است!'; } else if ($_POST['email'] == "") { $register_error_message = 'فیلد ایمیل مورد نیاز است!'; } else if ($_POST['username'] == "") { $register_error_message = 'فیلد نام کاربری مورد نیاز است!'; } else if ($_POST['password'] == "") { $register_error_message = 'فیلد رمز عبور مورد نیاز است!'; } else if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { $register_error_message = 'آدرس ایمیل نامعتبر است!'; } else if ($app->isEmail($_POST['email'])) { $register_error_message = 'این ایمیل در حال حاضروجود دارد!'; } else if ($app->isUsername($_POST['username'])) { $register_error_message = 'این نام کاربری قبلا انتخاب شده است!'; } else { $user_id = $app->Register($_POST['name'], $_POST['email'], $_POST['username'], $_POST['password']); // set session and redirect user to the profile page $_SESSION['user_id'] = $user_id; header("Location: profile.php"); } } ?> <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>فرم ثبت نام / ورود</title> <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="css/bootstrap.min.css"> </head> <body> <div class="container"> <div class="row"> <div class="col-md-12"> <h2> فرم ثبت نام و ورود با استفاده از PDO </h2> </div> </div> <div class="row"> <div class="col-md-5 well"> <h4>ثبت نام</h4> <?php if (isset($register_error_message)) { echo '<div class="alert alert-danger"><strong>Error: </strong> ' . $register_error_message . '</div>'; } ?> <form action="index.php" method="post"> <div class="form-group"> <label for="">نام</label> <input type="text" name="name" class="form-control"/> </div> <div class="form-group"> <label for="">ایمیل</label> <input type="email" name="email" class="form-control"/> </div> <div class="form-group"> <label for="">نام کاربری</label> <input type="text" name="username" class="form-control"/> </div> <div class="form-group"> <label for="">رمز عبور</label> <input type="password" name="password" class="form-control"/> </div> <div class="form-group"> <input type="submit" name="btnRegister" class="btn btn-primary" value="ثبت نام"/> </div> </form> </div> <div class="col-md-2"></div> <div class="col-md-5 well"> <h4>ورود</h4> <?php if (isset($login_error_message)) { echo '<div class="alert alert-danger"><strong>Error: </strong> ' . $login_error_message . '</div>'; } ?> <form action="index.php" method="post"> <div class="form-group"> <label for="">نام کاربری / ایمیل</label> <input type="text" name="username" class="form-control"/> </div> <div class="form-group"> <label for="">رمز عبور</label> <input type="password" name="password" class="form-control"/> </div> <div class="form-group"> <input type="submit" name="btnLogin" class="btn btn-primary" value="ورود"/> </div> </form> </div> </div> </div> </body> </html>
مرحله 5: صفحه پروفایل:
من از یک صفحه با نام پروفایل برای هدایت کاربر پس از ورود به سیستم یا ثبت نام برای گفتن سلام به همراه دکمه خروج استفاده می کنم.
<?php /** * Tutorial: PHP Login Registration system * * Page : Profile */ // Start Session session_start(); // check user login if(empty($_SESSION['user_id'])) { header("Location: index.php"); } // Database connection require_once 'database.php'; $db = DB(); // Application library ( with DemoLib class ) require_once 'lib/library.php'; $app = new USERS(); $user = $app->UserDetails($_SESSION['user_id']); // get user details ?> <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>پروفایل</title> <!-- Latest compiled and minified CSS --> <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="css/bootstrap.min.css"> </head> <body> <div class="container"> <div class="well"> <h2 style="text-align: center"> پروفایل </h2> <h3>سلام <?php echo $user->name ?></h3> <p><br> به سیستم ثبت نام و ورود به سیستم با php pdo خوش آمدید. </p> <br> <a href="logout.php" class="btn btn-primary">خروج</a> </div> </div> </body> </html>
مرحله 6: صفحه خروج logout.php:
<?php /** * Tutorial: PHP Login Registration system * * Page : Logout */ // start session session_start(); // Destroy user session unset($_SESSION['user_id']); // Redirect to index.php page header("Location: index.php"); ?>
خب آموزش به پایان رسید امیدوارم مفید واقع شده باشد. در صورت بروز هرگونه مشکل در کدنویسی یا هر گونه سوال در مورد این پروژه می توانید از قسمت دیدگاه ها ما را در جریان بگذارید.
موفق باشید.
[zarinpalPaidDownloads id=”1″]
Fatal error: Uncaught Error: Call to undefined function DB() in C:\xampp\htdocs\regis\library.php:67 Stack trace: #0 C:\xampp\htdocs\regis\index.php(47): USERS->isEmail(‘mystery_918@yah…’) #1 {main} thrown in C:\xampp\htdocs\regis\library.php on line 67
سلام ببخشید وقتی اطلاعات رو وارد میکنم به جای اینکه در پایگاه داده ثبت کنه این ارورو میده
واگر امکان داره دلیل استفاده اینم بگینbindParam
در فایل کتابخانه library.php باید فایل دیتابیس را فراخوانی کنید:
require_once './database.php';
برای مقدار دهی و تعیین پارامتر از روش bindParam یا bindValue استفاده می کنن و تنها فرقی که با هم دارن این هست که در bindParam مقدار یک متغییر می تونه بعد از اجرا چک بشه
مثال:
$query = $db->prepare("SELECT * FROM table_users WHERE user_id=:user_id AND email=:email");
$query->bindParam(':user_id', $id);
$query->bindParam(':email', $email);
$user_id= 5;
$email= 'myemail@gmail.com';
$query->execute();