ایجاد سیستم فراموشی رمز عبور با PHP

30 آبان 1397
php-forget-password

با سلام دوباره خدمت شما عزیزان، در این قسمت به سراغ لینک "فراموش کردن رمز عبور" خواهیم رفت. دقت کنید همانطور که مطمئنم خیلی از شما می دانید، گاهی پیش می آید که کاربر (مشتری) رمز عبور خودش را فراموش کرده باشد. در این حالت سایت ما باید یک واکنش مناسب را اتخاذ کند. برای اینکه ما بتوانیم رمز عبور را در اختیار کاربر قرار دهیم، نیازمند اطلاعات موثقی از کاربر هستیم. هنگامی که این اطلاعات توسط کاربر به وب سایت داده شد؛ اکنون وب سایت با توجه به این اطلاعات در پایگاه داده به جستجو می پردازد تا کاربر را تایید هویت کند (یعنی اینکه آیا کاربر عضوی از سایت ما بوده است یا خیر؟) و اگر کاربر عضو سایت باشد عملیات خاصی را در پیش می گیرد که من شما را دعوت می کنم ادامه این آموزش را در ادامه دنبال کنید.

ایجاد سیستم فراموشی رمز عبور با PHP

برای انجام اینکار، ابتدا توجه شما را به تصویر زیر جلب می کنم. وقتی شما wamp را روشن کنید و از طریق مرورگر خودتان به آدرس http://localhost/ecommerce/checkout.php بروید با تصویر زیر روبرو می شوید:

وقتی کاربر پسورد خود را فراموش می کند.

حالا به آدرس C:\wamp\www\ecommerce بروید و فایل customer_login.php را باز کنید. کد زیر را در این فایل پیدا کنید.

<a class="forget_button" href="checkout.php?forgot_pass">پسورد خود را فراموش کرده اید؟</a>

این کد در واقع همان لینک دکمه مانند است، که در تصویر بالا مشاهده می کنید. اگر به آدرس href دقت کرده باشید (checkout.php?forgot_pass ) با فشار دادن بر روی این لینک دکمه مانند، یک پارامتر forgot_pass فعال می شود و ما باید با استفاده از متغییر سراسری $_GET، سایت خودمان را در جهت درست هدایت کنیم. (یعنی با استفاده از $_GET['forgot_pass'] سایت را در مسیر واکنش مناسب قرار دهیم).

انجام تغییرات در فایل checkout.php

خب حالا باز هم به آدرس C:\wamp\www\ecommerce می رویم ولی این بار فایل checkout.php را باز می کنیم و کدهای زیر را در آن پیدا می کنیم.

		<?php
			
			if(isset($_SESSION['customer_email']))
			{
				include("payment.php");
				
				}else{
				
				include("customer_login.php");
				
			}
			
		?>

این کدها را پاک کنید و به جای آنها کدهای زیر را قرار دهید.

		<?php
			
			if(isset($_GET['forgot_pass']))
			{
				include("Forgot_Password.php");
				}else{
				
				if(isset($_SESSION['customer_email']))
				{
					include("payment.php");
					
					}else{
					
					include("customer_login.php");
					
				}				
				
			}
		?>

همانطور که مشاهده می کنید ما از متغییر $_GET['forgot_pass'] در دستور شرطی if(isset($_GET['forgot_pass'])) استفاده کرده ایم. مفهوم کلی کدهای بالا این است که اگر کاربر بروی لینک دکمه مانند "پسورد خود را فراموش کرده اید؟" فشار داده باشد، باید به فایل Forgot_Password.php هدایت شود در غیر اینصورت با توجه به دستور شرطی  if(isset($_SESSION['customer_email'])) به یکی از صفحات payment.php و یا customer_login.php هدایت می شود، که من در جلسات قبل به طور مفصل آنها را توضیح داده ام.

ایجاد فایل فراموشی رمز عبور به نام Forget_Password

حالا وقت آن رسیده است که فایل Forgot_Password.php را بسازیم. به همین خاطر باز به آدرس C:\wamp\www\ecommerce می رویم و این فایل را همانگونه که در تصویر زیر مشاهده می کنید می سازیم.

ایجاد فایل فراموشی رمز عبور Forgot_Password

بعد از اینکه این فایل را باز کردیم، کدهای زیر را به آن اضافه می کنیم.

<?php include('includes/db.php'); ?>

<h2>&nbsp&nbsp&nbspبازیابی رمز عبور &nbsp&nbsp&nbsp   </h2>
<form method="post" action="#">
    
	<p>
		<label style="font-size:14px;">ایمیل خود را وارد کنید :  </label>
		<input type="text" name="email" size="50"/>
	</p>
	
	<p>
		<input type="submit" name="submit" value="بازیابی"/>
	</p>
</form>

<?php
	if (isset($_POST['email']) && ($_POST['email']!="")) {
		# code...
		$email=trim($_POST['email']); // get email address from user form
		$code=md5(uniqid(true)); // random alphernumeric character store in $code variable
		
		if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
			
			$checkmail = mysqli_query($con,"SET NAMES utf8");
			$checkmail = mysqli_query($con,"SET CHARACTER SET utf8");
			$checkmail=mysqli_query($con,"SELECT customer_email FROM customers WHERE customer_email='$email' ");
			$count=mysqli_num_rows($checkmail); // check if user is on our data base
			
			if ($count==1) { // if email is stored in our database update lost password field with random code for reset
				# code...s
				$inserted=mysqli_query($con,"UPDATE customers SET lost='$code' WHERE customer_email='$email' ");
				// update our table users with unique random code
				/* Send a link to reset password */
				$to = $email;
				$subject = " لینک بازیابی رمز عبور ";
				$header = "By jahangir pachkam";
				$body = "با سلام به شما ، در این ایمیل لینک بازیابی رمز عبور برای شما ارسال شده است.
				کافی است برای تغییر رمز عبور خودتان بر روی لینک زیر فشار داده و مراحل را به صورت کامل انجام دهید با تشکر از شما. 
				آدرسی اینترنتی که برنامه ngrok به ما می دهد/ecommerce/updatepassword.php?email=$email&code=$code";
				
				$sent=mail($to,$subject,$body,$header);
				
				# code...
				if ($inserted) { /* update is successfull */
					# code...
					echo "<script>alert('ایمیل خود را چک کنید . ما برای شما لینکی برای تغییر پسورد ارسال کرده ایم!')</script>";
					
				}
			}
			else
			{
				echo "<script>alert('متاسفم، با ایمیل $email هیچ اکانتی ثبت نشده است، شما می توانید در صفحه بعدی ثبت نام کنید!!!')</script>";
				echo "<script>window.open('checkout.php','_self')</script>";
			}
			
			} else {
			echo "<script>alert(' $email یک آدرس ایمیل معتبر نمی باشد!!! لطفا یک آدرس ایمیل معتبر وارد کنید!!!')</script>";
		}
	}
?>

مفهوم کلی کدهای نوشته شده این است که: همانطور که مشاهده می نمایید، ابتدا باید به پایگاه داده متصل شویم. بعد فرم را با استفاده از HTML ایجاد می کنیم. در ادامه به پردازش ورودی که توسط کاربر به ما داده شده است، خواهیم پرداخت. اگر ایمیل درج شده و سپس بر روی دکمه "بازیابی" فشار داده شده بود، ابتدا کدهای زیر به اجرا در می آیند:

		$email=trim($_POST['email']); // get email address from user form
		$code=md5(uniqid(true)); // random alphernumeric character store in $code variable

اجازه بدهید توابعی که در این دو خط وجود دارد را با هم بیینیم: در تابع trim($_POST['email']) می آییم و فضاهای خالی را از سمت چپ و راست ایمیل وارد شده حدف می کنیم.

سپس با استفاده از md5(uniqid(true)) یک رشته 32 رقمی یکتا می سازیم (البته به صورت تصادفی) و از آن در مراحل بعدی استفاده می کنیم. دقت نمایید، ما این رشته 32 بیتی را در فیلدی تحت عنوان lost قرار خواهیم داد، تا با استفاده از آن کاربر را شناسایی کنیم. فیلد lost در ادامه توضیح داده خواهد شد.

ایجاد فیلد lost در جدول داده ایی customers

دقت نمایید که باید در پایگاه داده خودمان نیز تغییراتی اعمال کنیم. به همین خاطر wamp را روشن کنید و به PhpMyAdmin بروید و از پایگاه داده ecommerce به جدول داده ایی customers می رویم به تصاویر زیر دقت نمایید.

اضافه کردن فیلد lost به جدول داده ایی customers تصویر شماره 1

حالا با توجه به قسمت هایی که من در تصویر زیر پایین آن خط قرمز کشیده ام (شما هم همین مقادیر را در پایگاه داده خود تنظیم نمایید) بر روی دکمه go بزنید.

اضافه کردن فیلد lost به جدول داده ایی customers تصویر شماره 2

حالا با تصویر زیر روبرو خواهید شد.

اضافه کردن فیلد lost به جدول داده ایی customers تصویر شماره 3جاهای خالی (ویژگی های فیلد) را با توجه به مقادیر زیر تنظیم نمایید؛ و بر روی دکمه save بزنید

اضافه کردن فیلد lost به جدول داده ایی customers تصویر شماره 4

حالا باید صفحه زیر برای شما نمایان شود و فیلد lost به فیلد های قبلی اضافه شده باشد.

اضافه کردن فیلد lost به جدول داده ایی customers تصویر شماره 5

دقت نمایید که ایمیل وارد شده از سوی کاربر باید در پایگاه داده ما (در واقع در جدول داده ایی customers) وجود داشته باشد، اگر این ایمیل وجود داشت آنگاه به ایمیل کاربر یک لینک جدید برای تغییر رمز عبور قبلی اش ارسال می شود. سپس با نمایش پیام های راهنمایی که در کدها مشاهده می فرمایید، کاربر را هدایت خواهیم کرد.

من در مورد نحوی ارسال ایمیل به کاربر توضیح خاصی نمی دهم چرا که در قسمت " ارسال ایمیل از طریق لوکال هاست (Localhost) در PHP " به طور کامل آن را توضیح داده ام. اگر سوالی برای شما در مورد کدها پیش آمد در قسمت نظردهی عنوان نمایید تا به آن رسیدگی کنم.

اگر در کدهای بالا و مخصوصا لینک فرستاده شده از طرف سایت به ایمیل کاربر (منظور من متغییر $body می باشد)، دقت کنید.

	$body = "با سلام به شما ، در این ایمیل لینک بازیابی رمز عبور برای شما ارسال شده است.
 کافی است برای تغییر رمز عبور خودتان بر روی لینک زیر فشار داده و مراحل را به صورت کامل انجام دهید
 با تشکر از شما.
 آدرسی اینترنتی که برنامه ngrok به ما می دهد/ecommerce/updatepassword.php?email=$email&code=$code";

فایلی با عنوان updatepassword.php دیده می شود که وقتی کاربر بر روی لینک موجود در ایمیل خود فشار می دهد، به این فایل هدایت می شود و اقدامات بعدی باید در این فایل انجام گیرد. بنابراین باید آن را با همدیگر بسازیم.

ایجاد فایل بروزرسانی رمز عبور

خب بار دیگر به آدرس C:\wamp\www\ecommerce می رویم و در آنجا فایل updatepassword.php را به صورت زیر ایجاد می نماییم.

ایجاد فایل updatepassword

بعد از ایجاد این فایل بهتر است آن را باز کنید و کدهای زیر را در آن قرار دهید.

<?php include('includes/db.php'); ?>

<!-- start of Header -->
<?php	include('includes/Header.php');	?>
<!-- end of Header -->

<!-- start of content -->   
<div id="templatemo_content">
	
	<!-- start of left ocntent -->
	<div id="templatemo_content_left">
		<h1>به سایت جهانگیر پچکم دات کام خوش آمدید </h1>
		<p>امروزه با افزایش روز افزون تولیدکنندگان مطرح داخلی و خارجی  انواع لوازم، قدرت انتخاب مشتری به شدت بالا رفته است. اما با توجه به اینکه هیچ فروشگاهی به طور فیزیکی، گنجایش تمامی این محصولات را نداشته و نیز هیچ فروشنده‌ای اطلاعات کاملی از تمامی محصولات موجود در فروشگاه خود ندارد و حتی در صورت داشتن تمامی اطلاعات، توضیح تک تک آنها، نیازمند صرف انرژی و زمان بسیار زیادی خواهد بود، جهانگیر پچکم دات کام بر آن شد تا یک مرجع جامع و کامل تخصصی ارزیابی، مشاوره و فروش محصولات  تولید داخل و خارج کشور را بصورت یک فروشگاه اینترنتی در اختیار عموم مردم ایران قرار دهد.</p>
		<div class="cleaner_with_height">&nbsp;</div>
		<?php
			if (isset($_GET['email']) && ($_GET['code']!="")) {
				# code...
				$code=$_GET['code'];
				$email=$_GET['email'];
				
				$checkmail = mysqli_query($con,"SET NAMES utf8");
				$checkmail = mysqli_query($con,"SET CHARACTER SET utf8");
				$checkmail=mysqli_query($con,"SELECT customer_email FROM customers WHERE customer_email='$email' AND lost='$code' AND lost!='' ");
				$count=mysqli_num_rows($checkmail);
				if ($count) {
					
					if (isset($_POST['password'])){
						
						// receive password value from the form and validation password value
						$c_password_validate=mysqli_real_escape_string($con ,$_POST['password']);
						if (empty($c_password_validate)) 
						{
							echo "<script>alert('پسورد خود را وارد نکرده اید!')</script>";
							}else{
							if(preg_match("/^(?=.*[A-z])(?=.*[0-9])(?=.*[$@])\S{6,12}$/", $c_password_validate))
							{
								// password is valid
								$password = $c_password_validate;
								$repassword=$_POST['repassword'];
								if ($password===$repassword) {
									# code...
									$inserted=mysqli_query($con,"UPDATE customers SET lost='', customer_pass='$password' WHERE customer_email='$email' ");
									// insert into our table users with new password
									if ($inserted) {
										# code...
										echo "<script>alert('پسورد شما با موفقیت تغییر کرد! اکنون با این پسورد جدید وارد سایت شوید!!!')</script>";
										echo "<script>window.open('checkout.php','_self')</script>";
									}
									
								}
								else
								{
									echo "<script>alert('چرا پسوردهای شما با هم منطبق نیستند؟ لطفا هر دو پسورد را به یک شکل وارد نمایید.')</script>";
								}
								}else{
								echo "<script>alert('پسوردی که وارد کرده اید، طبق الگو نیست. دوباره پسورد را وارد نمایید!!!')</script>";
							} 
						}					
						
						
						
					}
					# code...
					echo '
					<h2>&nbsp&nbsp&nbsp پسورد جدید خودتان را ایجاد نمایید.</h2>
					
					<div class="tooltip" style="font-family:b nazanin;font-size:18px;color:yellow;">قبل از انتخاب پسورد حتما این قوانین را مطالعه بفرمایید.
					<span class="tooltiptext">•	پسورد شما باید حداقل 6 کاراکتر و حداکثر 12 کاراکتر باشد.<br><br>
					•	در پسورد خود حتما باید از ارقام 0تا 9 استفاده کنید.<br><br>
					•	در پسورد خود از حروف بزرگ  یا کوچک انگلیسی استفاده کنید.<br><br>
					•	در پسورد خود حتما باید از علامت @ یا $ استفاده نمایید.<br><br>
					
					</span>
					</div>
					<br/>
					<br/>
					<form method="post" action="">
					<p><label style="font-size:14px;">پسورد جدید را وارد کنید : </label><input type="text" name="password" size="50"/></p>
					<p><label style="font-size:14px;">از دوباره پسورد جدید را وارد کنید : </label><input type="text" name="repassword" size="50"/></p>
					<p><input type="submit" name="create" value="عوضش کن!"/></p>
					</form>
					';
					
					}else{
					echo "<script>alert('خطایی رخ داده است!!!')</script>";
				}
				
				
			}
			
		?>
		<div class="cleaner_with_height">&nbsp;</div>
	</div>
    <!-- end of left content  -->
	
	<!-- start of right content -->
<?php	include('includes/Right_Sidebar.php');	?>
<!-- end of right content -->
<div class="cleaner">&nbsp;</div>
</div>
<!-- end of content -->

<!-- start of footer -->
<?php include('includes/Footer.php');	?>
<!-- end of footer -->

در کدهای بالا، ابتدا به پایگاه داده سایت متصل می شویم و در ادامه Header.php را include می کنیم تا حالت کلی و Header سایت به وجود آید. سپس به پردازش اطلاعات بدست آمده می پردازیم. (منظور من دستور شرطی if (isset($_GET['email']) && ($_GET['code']!=""))  است) در اینجا شرطی که گذاشته ام می گوید که اگر در لینک آمده (فرض کنید که کاربر بر روی لینک تغییر پسورد در ایمیل خودش فشار داده باشد) پارامتر email وجود داشت و پارامتر code نیز حتما مقدار داشت آنگاه دستورالعمل های زیر آن را به اجرا دربیاور.

خب دستور العمل هایی که به اجرا در می آیند به این شرح است که ابتدا با استفاده از متغییر سراسری $_GET مقدار دو پارامتر code و email را از لینک بیرون می کشیم. در ادامه در پایگاه داده و جدول داده ایی customers به دنبال email می گردیم و تعداد آن را در متغییر $count قرار می دهیم . حالا دستور شرطی if ($count) مطرح می گردد. این دستور یعنی اینکه آیا همچنین کاربری با این ایمیل در پایگاه داده وجود دارد یه نه؟ اگر جواب خیر باشد پیام "خطایی رخ داده است!!!" به کاربر نمایش داده می شود، در غیر اینصورت چک می کنیم آیا متغییر$_POST['password'] وجود دارد یا خیر (دستور شرطی if (isset($_POST['password']))) اگر وجود نداشت باید فرم زیر برای کاربر به نمایش در بیاید .

فرم تغییر پسورد

اگر متغییر $_POST['password']  وجود داشت (دقت کنید زمانی این متغییر به وجود می آیید که کاربر رمز ها را وارد کرده باشد و بر روی دکمه "عوضش کن!" فشار داده باشد)، سوال بعدی پرسیده می شود؛ آیا تگ ورودی پسورد خالی است؟ (معادل کد if (empty($c_password_validate)))

خب اگر جواب، بله باشد پیام "پسورد خود را وارد نکرده اید!" را نشان می دهد در غیر اینصورت، سوال مطرح می شود که آیا پسورد با الگوی مورد نظر سایت مطابقت دارد یا خیر (معادل این دستور شرطی if(preg_match("/^(?=.*[A-z])(?=.*[0-9])(?=.*[$@])\S{6,12}$/", $c_password_validate))

اگر جواب خیر بود، پیام "پسوردی که وارد کرده اید، طبق الگو نیست. دوباره پسورد را وارد نمایید!!!" به کاربر نمایش داده می شود در غیر اینصورت سوال می کند که آیا مقدار ورودی پسورد با مقدار ورودی تایید پسورد یکی هست یا خیر (معادل کد if ($password===$repassword)

اگر جواب خیر باشد پیام "چرا پسوردهای شما با هم منطبق نیستند؟ لطفا هر دو پسورد را به یک شکل وارد نمایید." نمایش داده می شود در غیر این صورت پسورد مورد نظر بروزرسانی می گردد و کاربر برای لوگین کردن به صفحه checkout.php هدایت می شود.

تفاوت عملگر های مقایسه ایی == و ===

یک نکته جهت یاد آوری عرض می کنم که عملگر های مقایسه ایی == و === تفاوت اندکی با هم دارند که این تفاوت در جدول زیر نشان داده شده است.

عملگر مثال توضیح
== var1=var2==var3 var1 در صورتی true است که مقدار var2 با مقدار var3 برابر باشد در غیر اینصورت false است
=== var1=var2===var3 var1 در صورتی true است که مقدار var2 با مقدار var3 هم از لحاظ مقدار و هم از لحاظ نوع یکی باشد در غیر اینصورت false است.

آزمایش عملی کدهای نوشته شده

خب حالا وقت آن رسیده که در عمل چه روی داده است.

ابتدا wamp را روشن کنید. به تصویر زیر نگاه کنید که در آن آیکن wamp سبز رنگ شده است (در قسمت پایین سمت چپ دسکتاپ).

wamp را روشن نمایید.

حالا به سراغ برنامه ngrok می رویم و آن را اجرا می کنیم. به تصویر زیر دقت کنید.

وقتی که برنامه باز شد، در خط فرمان برنامه ngrok باید دستور ngrok http80 را بنویسیم و دکمه اینتر کیبرد را بزنیم. با اینکار آدرس اینترنتی localhost ساخته می شود.

حالا همانطور که مشاهده می کنید آدرس اینترنتی localhost ما ایجاد شده است (من با کادر قرمز رنگ آن را به شما نشان داده ام).

در این مرحله شما باید فایل Forgot_Password.php را باز کنید و همانطور که در تصویر زیر مشخص است، آدرس اینترنتی برنامه ngrok را در متغییر $body قرار دهید.

حالا در مرورگر خودتان به آدرس شبیه به آدرس زیر بروید. البته دقت کنید که آدرس اینترنتی locahost خودتان را وارد نمایید.

باید به تصویر زیر هدایت بشوید.

حالا اگر در تصویر بالا بر روی دکمه سبز رنگ "پسورد خود را فراموش کرده اید؟" فشار دهید به تصویر زیر هدایت می شوید. من در تصویر زیر همانگونه که مشاهده می نمایید، یک آدرس ایمیل را که قبلا با آن در سایت ثبت نام کرده ام را وارد می کنم (دقت کنید این ایمیل در جدول داده customers وجود دارد و تایید شده هم هست ولی مثلا من رمز خودم را فراموش کرده ام) و سپس بر روی دکمه "بازیابی" فشار می دهم.

حالا یک پیام به صورت زیر برای من نمایان می شود.

پیام ارسال ایمیل برای ما نمایان می شود

به پایگاه داده ecommerce و جدول دادهایی customers می رویم. همانگونه که مشاهده می نمایید یک رشته 32 رقمی در فیلد lost اضافه شده است. همین رشته را باید در لینکی که سایت به ایمیل کاربر می فرستد نیز قابل مشاهده باشد.

به پایگاه داده می رویم و مقدار lost را با هم مشاهده می کنیم.

هماگونه که مشاهده می نمایید همین رشته در ایمیل هم وجود دارد به تصویر زیر نگاه کنید.

وقتی بر روی لینکی که در ایمیل ظاهر شده است فشار بدهبد، به صفحه ایی شبیه به صفحه زیر هدایت خواهید شد که در آن رمز عبور جدید را باید دو مرتبه به سیستم بدهید.

در تصویر زیر من یک رمز جدید برای خودم وارد کرده ام (دقت نمایید که هر دو رمز باید یکسان باشند.) . بعد از انتخاب رمز بر روی دکمه "عوضش کن!" فشار بدهید.

حالا پیامی که در تصویر زیر مشاهده می کنید برای شما نمایش داده می شود.

پیام بالا به ما می گویید که رمز عبور تغییرکرده است اما ما باید پایگاه داده را چک کنیم و به سراغ جدول داده ایی cusomers برویم. تصویر زیر نشان می دهد که تغییر رمز در جدول داده ایی customers هم رخ داده است؛ و فیلد customer_pass تغییر کرده است (رمز جدید در آن قرار گرفته است) از سوی دیگر، رشته 32 بیتی از فیلد lost  حذف شده است.

خب دوستان عزیزم، من در پایان فایلهایی که در این مرحله دستکاری شده را به صورت  فایل های نهایی برای شما قرار داده ام، سعی کنید که کدهای قبلی را پاک کنید و کدهای زیر را به جای آنها قرار دهید. یادتان نروید که آدرس اینترنتی localhost خودتان را که از برنامه ngrok گرفته اید در فایل Forgot_Password.php و در متغییر $body قرار بدهید. اگر اینکار را انجام ندهید، کدها کار نخواهند کرد.

فایلهای نهایی

فایل نهایی checkout.php در زیر برای شما آورده شده است.

<!-- start of Header -->
<?php	include('includes/Header.php');	?>
<!-- end of Header -->

<!-- start of content -->   
<div id="templatemo_content">
	
	<!-- start of left ocntent -->
	<div id="templatemo_content_left">
		<h1>به سایت جهانگیر پچکم دات کام خوش آمدید </h1>
		<p>امروزه با افزایش روز افزون تولیدکنندگان مطرح داخلی و خارجی  انواع لوازم، قدرت انتخاب مشتری به شدت بالا رفته است. اما با توجه به اینکه هیچ فروشگاهی به طور فیزیکی، گنجایش تمامی این محصولات را نداشته و نیز هیچ فروشنده‌ای اطلاعات کاملی از تمامی محصولات موجود در فروشگاه خود ندارد و حتی در صورت داشتن تمامی اطلاعات، توضیح تک تک آنها، نیازمند صرف انرژی و زمان بسیار زیادی خواهد بود، جهانگیر پچکم دات کام بر آن شد تا یک مرجع جامع و کامل تخصصی ارزیابی، مشاوره و فروش محصولات  تولید داخل و خارج کشور را بصورت یک فروشگاه اینترنتی در اختیار عموم مردم ایران قرار دهد.</p>
		<div class="cleaner_with_height">&nbsp;</div>
		
		<?php
			
			if(isset($_GET['forgot_pass']))
			{
				include("Forgot_Password.php");
				}else{
				
				if(isset($_SESSION['customer_email']))
				{
					include("payment.php");
					
					}else{
					
					include("customer_login.php");
					
				}				
				
			}
		?>
		
		<div class="cleaner_with_height">&nbsp;</div>
	</div>
    <!-- end of left content  -->
	
	<!-- start of right content -->
	<?php	include('includes/Right_Sidebar.php');	?>
	<!-- end of right content -->
	<div class="cleaner">&nbsp;</div>
</div>
<!-- end of content -->

<!-- start of footer -->
<?php include('includes/Footer.php');	?>
<!-- end of footer -->

فایل نهایی Forgot_Password.php در زیر برای شما آورده شده است. یادتان نرود که آدرس اینترنتی localhost را در متغییر $body قرار دهید.

<?php include('includes/db.php'); ?>

<h2>&nbsp&nbsp&nbspبازیابی رمز عبور </h2>
<form method="post" action="#">
    
	<p>
		<label style="font-size:14px;">ایمیل خود را وارد کنید :  </label>
		<input type="text" name="email" size="50"/>
	</p>
	
	<p>
		<input type="submit" name="submit" value="بازیابی"/>
	</p>
</form>

<?php
	if (isset($_POST['email']) && ($_POST['email']!="")) {
		# code...
		$email=trim($_POST['email']); // get email address from user form
		$code=md5(uniqid(true)); // random alphernumeric character store in $code variable
		
		if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
			
			$checkmail = mysqli_query($con,"SET NAMES utf8");
			$checkmail = mysqli_query($con,"SET CHARACTER SET utf8");
			$checkmail=mysqli_query($con,"SELECT customer_email FROM customers WHERE customer_email='$email' ");
			$count=mysqli_num_rows($checkmail); // check if user is on our data base
			
			if ($count==1) { // if email is stored in our database update lost password field with random code for reset
				# code...s
				$inserted=mysqli_query($con,"UPDATE customers SET lost='$code' WHERE customer_email='$email' ");
				// update our table users with unique random code
				/* Send a link to reset password */
				$to = $email;
				$subject = " لینک بازیابی رمز عبور ";
				$header = "By jahangir pachkam";
				$body = "با سلام به شما ، در این ایمیل لینک بازیابی رمز عبور برای شما ارسال شده است.
				کافی است برای تغییر رمز عبور خودتان بر روی لینک زیر فشار داده و مراحل را به صورت کامل انجام دهید با تشکر از شما. 
				http://آدرس اینترنتی local که از برنامه ngrok گرفته شده است./ecommerce/updatepassword.php?email=$email&code=$code";
				
				$sent=mail($to,$subject,$body,$header);
				
				# code...
				if ($inserted) { /* update is successfull */
					# code...
					echo "<script>alert('ایمیل خود را چک کنید . ما برای شما لینکی برای تغییر پسورد ارسال کرده ایم!')</script>";
					
				}
			}
			else
			{
				echo "<script>alert('متاسفم، با ایمیل $email هیچ اکانتی ثبت نشده است، شما می توانید در صفحه بعدی ثبت نام کنید!!!')</script>";
				echo "<script>window.open('checkout.php','_self')</script>";
			}
			
			} else {
			echo "<script>alert(' $email یک آدرس ایمیل معتبر نمی باشد!!! لطفا یک آدرس ایمیل معتبر وارد کنید!!!')</script>";
		}
	}
?>

فایل نهایی updatepassword.php در زیر برای شما آورده شده است.

<?php include('includes/db.php'); ?>

<!-- start of Header -->
<?php	include('includes/Header.php');	?>
<!-- end of Header -->

<!-- start of content -->   
<div id="templatemo_content">
	
	<!-- start of left ocntent -->
	<div id="templatemo_content_left">
		<h1>به سایت جهانگیر پچکم دات کام خوش آمدید </h1>
		<p>امروزه با افزایش روز افزون تولیدکنندگان مطرح داخلی و خارجی  انواع لوازم، قدرت انتخاب مشتری به شدت بالا رفته است. اما با توجه به اینکه هیچ فروشگاهی به طور فیزیکی، گنجایش تمامی این محصولات را نداشته و نیز هیچ فروشنده‌ای اطلاعات کاملی از تمامی محصولات موجود در فروشگاه خود ندارد و حتی در صورت داشتن تمامی اطلاعات، توضیح تک تک آنها، نیازمند صرف انرژی و زمان بسیار زیادی خواهد بود، جهانگیر پچکم دات کام بر آن شد تا یک مرجع جامع و کامل تخصصی ارزیابی، مشاوره و فروش محصولات  تولید داخل و خارج کشور را بصورت یک فروشگاه اینترنتی در اختیار عموم مردم ایران قرار دهد.</p>
		<div class="cleaner_with_height">&nbsp;</div>
		<?php
			if (isset($_GET['email']) && ($_GET['code']!="")) {
				# code...
				$code=$_GET['code'];
				$email=$_GET['email'];
				
				$checkmail = mysqli_query($con,"SET NAMES utf8");
				$checkmail = mysqli_query($con,"SET CHARACTER SET utf8");
				$checkmail=mysqli_query($con,"SELECT customer_email FROM customers WHERE customer_email='$email' AND lost='$code' AND lost!='' ");
				$count=mysqli_num_rows($checkmail);
				if ($count) {
					
					if (isset($_POST['password'])){
						
						// receive password value from the form and validation password value
						$c_password_validate=mysqli_real_escape_string($con ,$_POST['password']);
						if (empty($c_password_validate)) 
						{
							echo "<script>alert('پسورد خود را وارد نکرده اید!')</script>";
							}else{
							if(preg_match("/^(?=.*[A-z])(?=.*[0-9])(?=.*[$@])\S{6,12}$/", $c_password_validate))
							{
								// password is valid
								$password = $c_password_validate;
								$repassword=$_POST['repassword'];
								if ($password===$repassword) {
									# code...
									$inserted=mysqli_query($con,"UPDATE customers SET lost='', customer_pass='$password' WHERE customer_email='$email' ");
									// insert into our table users with new password
									if ($inserted) {
										# code...
										echo "<script>alert('پسورد شما با موفقیت تغییر کرد! اکنون با این پسورد جدید وارد سایت شوید!!!')</script>";
										echo "<script>window.open('checkout.php','_self')</script>";
									}
									
								}
								else
								{
									echo "<script>alert('چرا پسوردهای شما با هم منطبق نیستند؟ لطفا هر دو پسورد را به یک شکل وارد نمایید.')</script>";
								}
								}else{
								echo "<script>alert('پسوردی که وارد کرده اید، طبق الگو نیست. دوباره پسورد را وارد نمایید!!!')</script>";
							} 
						}					
						
						
						
					}
					# code...
					echo '
					<h2>&nbsp&nbsp&nbsp پسورد جدید خودتان را ایجاد نمایید.</h2>
					
					<div class="tooltip" style="font-family:b nazanin;font-size:18px;color:yellow;">قبل از انتخاب پسورد حتما این قوانین را مطالعه بفرمایید.
					<span class="tooltiptext">•	پسورد شما باید حداقل 6 کاراکتر و حداکثر 12 کاراکتر باشد.<br><br>
					•	در پسورد خود حتما باید از ارقام 0تا 9 استفاده کنید.<br><br>
					•	در پسورد خود از حروف بزرگ  یا کوچک انگلیسی استفاده کنید.<br><br>
					•	در پسورد خود حتما باید از علامت @ یا $ استفاده نمایید.<br><br>
					
					</span>
					</div>
					<br/>
					<br/>
					<form method="post" action="">
					<p><label style="font-size:14px;">پسورد جدید را وارد کنید : </label><input type="text" name="password" size="50"/></p>
					<p><label style="font-size:14px;">از دوباره پسورد جدید را وارد کنید : </label><input type="text" name="repassword" size="50"/></p>
					<p><input type="submit" name="create" value="عوضش کن!"/></p>
					</form>
					';
					
					}else{
					echo "<script>alert('خطایی رخ داده است!!!')</script>";
				}
				
				
			}
			
		?>
		<div class="cleaner_with_height">&nbsp;</div>
	</div>
    <!-- end of left content  -->
	
	<!-- start of right content -->
<?php	include('includes/Right_Sidebar.php');	?>
<!-- end of right content -->
<div class="cleaner">&nbsp;</div>
</div>
<!-- end of content -->

<!-- start of footer -->
<?php include('includes/Footer.php');	?>
<!-- end of footer -->

خب دوستان گلم، به پایان این قسمت از آموزش ساخت فروشگاه اینترنتی با php رسیدیم. دقت کنید که کدنویسی را فراموش نکنید، مطمئن باشید که تنها راه برای پیشرفت شما در php کد نویسی هست. الان تقریبا خیلی از فروشگاه رو به اتمام رسوندیم و از اینجا به بعد احتمالا سرعت آموزش هم بالا تر میره (چون شما تا الان خیلی چیزها رو آموزش دیده اید و خیلی چیزها رو متوجه می شوید) . در قسمت آینده نام و نام خانوادگی مشتری که login می کند، در سبد خریدش آورده شود و ضمنا انشاالله فایل my_account.php را با هم خواهیم ساخت. تا قسمت آینده شما عزیزان را به خداوند بزرگ می سپارم. انشاالله موفق باشید. لایک هم فراموش نشه. ممنونم.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری فروشگاه اینترنتی با PHP توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما (2 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

جمیله رستمی
11 اسفند 1398
سلام روزتون بخیر خسته نباشید من این قسمتی که مربوط به لاگین شدن و لاگ اوت شدن و فراموشی بود رو انجام دادم ولی در آخر هم تونستم رمز جدید رو تعیین کنم ولی برای امتحان مجددا ،محتواهای جدول customers رو پاک کردم تا از اول باز انجام بدم ولی متاسفانه الان هیچ خطایی هم نمیده ولی isset(register) کار نمیکنه و هیچ ایرادی توی دستورات نمیده فقط بارگذاری نمیشه ولی جدول cart که میتونم محصول حذف و اضافه کنم کار میکنه.استاد الان باید چیکار کنم؟ همین مورد رو مشابه اش رو براتون جیمیل کردم که مقدار total به داخل جدول ریخته نمیشه. ممنون از توجه تون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

حسینی
07 تیر 1398
چرا شما برای ری دایرکت از include استفاده کرده اید؟ مگر نباید از header یا اسکریپت open.wnidow استفاده کرد؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

جهانگیر پچکم
30 تیر 1398
سلام به شما دوست عزیزم من برای ریدایرکت کردن از include استفاده نکردم. شما اگر کدها رو با دقت مطالعه کنید متوجه می شید که کد خط زیر window.open('checkout.php','_self')"; دیده می شه و این نشون می ده که برای ریدایرکت کردن از اسکریپت wnidow.open استفاده شده است. انشاالله موفق باشید.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.