آموزش ساخت سبد خرید در PHP - قسمت دوم

31 شهریور 1397
php-shopping-cart

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

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

اما همانطور که در قسمت قبل ملاحظه نمودید ما در جدول cart سه فیلد (ستون ویژگی) داشتیم. یک ستون که ip کاربر را در آن قرار می دادیم (به این نکته بسیار دقت کنید؛ در جلسه قبل بیان کردم که ما لزوما از ip کاربر استفاده نمی کنیم، بلکه از کوکی ipUserEcommerce نیز مقدار ip را بدست می آوریم و این کار باعث می شود که تغییرات ناگهانی ip، در روند اجرای برنامه خطایی ایجاد نکند)، یک ستون محصولی که همان کاربر می خرید و ستون آخر تعداد خرید از آن محصول خاص بود. بنابراین ما تعداد زیادی رکورد داریم که ip های مختلف در آن ثبت شده است. به تصویر زیر نگاه کنید.

جدول cart جهت نمایش سبد خرید محصولات در فروشگاه اینترنتی با php

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

جداسازی بر اساس ip

تابع total_items

برای اینکار من تابع total_items را نوشتم. فایل functions.php را باز کنید و قبل از علامت ?>  تابع را قرار دهید. کدهای این تابع را در زیر مشاهده می نمایید.

//getting the total added items
	function total_items()
	
	{
		
		if(isset($_GET['add_cart']))
		{	
			global $con;
			<span style="background-color: #ff0000;" data-mce-style="background-color: #ff0000;">
			//creating or using cookie 
			if(isset($_COOKIE["ipUserEcommerce"]))
			{
				$ip	= $_COOKIE["ipUserEcommerce"];
			}else{
				$ip=getIp();
				setcookie('ipUserEcommerce',$ip,time()+1206900);
			}</span>
		
			
			$get_items = "select * from cart where ip_add='$ip'";
			
			$run_items=@mysqli_query($con,$get_items);
			
			$count_items=@mysqli_num_rows($run_items);
		
		}else
		{	
		
			global $con;
			<span style="background-color: #ff0000;" data-mce-style="background-color: #ff0000;">
			//creating or using cookie 
			if(isset($_COOKIE["ipUserEcommerce"]))
			{
				$ip	= $_COOKIE["ipUserEcommerce"];
			}else{
				$ip=getIp();
				setcookie('ipUserEcommerce',$ip,time()+1206900);
			}
</span>			
			$get_items = "select * from cart where ip_add='$ip'";
			
			$run_items =@mysqli_query($con,$get_items);
			
			$count_items =@mysqli_num_rows($run_items);
		}
		
		echo $count_items;
	
	}

در کدهای بالا دقت کنید، منطق این تابع به صورت زیر است.

اگر در url ورودی ما مقدار فوق سراسری $_GET['add_cart'] تنظیم شده باشد. (یعنی مشتری بر روی دکمه "هم اکنون می خرید" فشار داده باشد) ما باید آخرین اطلاعات جدول را با توجه به رکوردی که اضافه شده به کاربر نمایش دهیم در غیر اینصورت (یعنی کاربر دکمه "هم اکنون خرید" را فشار نداده باشد و در حال گردش در بین صفحات سایت است) مجددا باید اطلاعات را برای کاربر به درستی نمایش دهیم. این نکته بسیار مهم است. می توانید با آزمایش بروی صفحات مختلف بهتر متوجه آن شوید.

فراخوانی تابع total_items

بعد از نوشتن تابع total_items ، باید آن را در header.php فراخوانی کنیم. بنابراین به آدرس C:\wamp\www\ecommerce\includes بروید و header.php را با Notepad++ باز کردهو کد زیر را در آن پیدا کنید.

       <div id="templatemo_shopping_cart">
			 <?php  
				if(isset($_GET['add_cart'])){
					cart();
					echo "<br><b>  محصول مورد نظر شما به سبد خرید اضافه شد.  <b/><br/> ";
				}
				
				echo "<span> <b>  تعداد محصولات خریداری شده توسط شما تا اکنون  <b/></span>" ;
				total_items();
			 ?>
        </div>

برای اینکه از لحاظ ظاهری هم قالب بهتر جلوه کند فایل style.css را باز کنید و در آن #templatemo_top_panel را پیدا و ویژگی height آن را پاک کنید. کد آن بعد از تغییر به صورت زیر است:

#templatemo_top_panel {
	overflow: hidden;	
	width: 880px;
	padding: 5px 30px;
	background: #c82c74;
	border-bottom: 1px solid #870843;
}

بعد از درست کردن قسمت بالا باید همین روند را در مورد کادر سمت چپ گوشه بالا هم انجام دهیم. به این منظور ابتدا باید یک فایل جدید تحت عنوان Shopping_Cart.php در فولدر includes ایجاد نماییم. به تصویر زیر نگاه کنید.

ایجاد فایل Shopping_Cart

سپس کدهای زیر را در آن قرار می دهیم.

		<div id="sidebar"> 
			<h4>سبد خرید شما</h4>
			<span class="sabad"> سلام کاربر گرامی ، به سایت ما خوش آمدید.</span><br/>
			<span class="sabad"> اجناس خریداری شده شما:5</span><br/>
			<span class="sabad">قیمت کل اجناس خریداری شده: 480000 تومان</span><br/>
			<span><a>به صندوق خرید شما برویم!</a></span><br/>
			<span><a href="#" >تایید خرید !</a></span>
		</div>

دقت کنید که کدهای بالا تماما حالت استاتیک دارد که به مرور در قسمتهای آینده به حالت داینامیک تغییر می کنند. در حال حاضر ما فقط قصد داریم که تعداد اقلام خریداری شده ی مشتری را به حالت داینامیک درآوریم. بنابر این کدهای بالا را به شکل کدهای زیر تغییر می دهیم.

		<div id="sidebar"> 
			<h4>سبد خرید شما</h4>
			<span class="sabad"> سلام کاربر گرامی ، به سایت ما خوش آمدید.</span><br/>
			<span class="sabad">اجناس خریداری شده شما : <?php total_items(); ?> محصول </span><br/>
			<span class="sabad">قیمت کل اجناس خریداری شده: 480000 تومان</span><br/>
			<span><a>به صندوق خرید شما برویم!</a></span><br/>
			<span><a href="#" >تایید خرید !</a></span>
		</div>

خب تا الان همه چیز به صورت عالی انجام شده فقط یک کار مانده و آن این است که فایل های all_products.php ، details.php ، index.php و result.php را به وسیله Notepad++ باز و کدهای زیر را در آنها پیدا کنیم.

<!---- Start Online Shopping Cart ----> 
		<div id="sidebar"> 
			<h4>سبد خرید شما</h4>
			<span class="sabad"> سلام کاربر گرامی ، به سایت ما خوش آمدید.</span><br/>
			<span class="sabad"> اجناس خریداری شده شما:5</span><br/>
			<span class="sabad">قیمت کل اجناس خریداری شده: 480000 تومان</span><br/>
			<span><a>به صندوق خرید شما برویم!</a></span><br/>
			<span><a href="#" >تایید خرید !</a></span>
		</div>
<!---- end Online Shopping Cart ---->

این کدها را پاک کنیم و کدهای زیر را به جای آنها قرار دهیم. با اینکار فایل Shopping_Cart.php را در این فایل ها include می کنیم.

<!---- Start Online Shopping Cart ----> 
<?php	include('includes/Shopping_Cart.php');	?>
<!---- end Online Shopping Cart ---->

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

حالت کامل شده سبد خرید

خب در ادامه بحث به سراغ محاسبه قیمت کل محصولات خریداری شده در کادر سبد خرید خواهیم رفت. برای انجام این کار ما با دو جدول داده ایی cart  و products از پایگاه داده ی ecommerce کار داریم.

محاسبه قیمت کل محصولات خریداری شده در سبد خرید

اما چرا این دو جدول؟ یادتان هست که در قسمت های قبل، هنگامی که جدول cart را درست می کردیم، ویژگی p_id را به عنوان کلید اصلی انتخاب کردیم. این انتخاب بی دلیل نبود چرا که p_id همان product_id در جدول products است و با استفاده از آن می توان بین دو جدول cart و products یک رابطه برقرار کنیم و اطلاعات مورد نیازمان را بیرون بکشیم.

دقت کنید که در اینجا p_id یک کلید خارجی محسوب می شود و این کلید خارجی بین جداول داده ایی ارتباط معنا دار را ایجاد می کند. تحقیق در مورد کلید خارجی را به خودتان واگذار می کنم.

خب دوستان گلم به پایان این قسمت از آموزش ساخت فروشگاه اینترنتی با php رسیدیم. در قسمت آینده قیمت کل را با هم محاسبه خواهیم کرد و همچنین صفحه ایی تحت عنوان cart.php ایجاد می کنیم که از طریق آن می توانیم تعداد محصول خریداری شده را افزایش دهیم. تا قسمت آینده شما را به خدای بزرگ می سپارم. موفق باشید.

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

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

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

mahdi
24 بهمن 1399
سلام خسته نباشید دست مریزاد واقعاً دوست عزیز وقتی که (//getting the total added items) را در انتهای فایل functions.php وارد مکنم بعداز اجرا برنامه این خطا وجود داره: Parse error: syntax error, unexpected '<' in C:\xampp\htdocs\functions\functions.php on line 254 ممنون میشم اگه راهنمایی بفرمایید.

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

مینا
02 شهریور 1398
سلام ممنون بابت آموزش خوبتون من یه مشکلی دارم اینه که وقتی یه کاربر وارد میشه محصولیو به سبد خریدش اضافه میکنه کاربر بعدی که وارد میشه اون محصولاتی که کاربر قبلی اضافه کرده هست میخوام که وقتی کاربر جدید وارد میشه سبد خرید خالی باشه لطفا کمکم کنید

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

جهانگیر پچکم
06 شهریور 1398
سلام به شما مینا خانم ببینید ما الان داخل یک محیط لوکال هاست داریم کد می زنیم، به همین خاطر ip ها همه یکسان هست و در نتیجه با توجه به سناریویی که ما ایجاد کردیم (استفاده از ip برای تماییز بین مشتریان) ، چون ip ها یکسان هست، سبد خرید کاربر قبلی، برای کاربر جدید هم دیده میشه. اما اگر شما روی یک هاست واقعی این قالب رو ذخیره کنید، خواهید دید که برای هر مشتری یک سبد خرید جداگانه ایجاد میشه. انشاالله موفق باشد، جهانگیر پچکم

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

مینا
06 شهریور 1398
خیلیییییییی ممنونم

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

mohammad
28 خرداد 1398
سلام ، من میخوام کاربری که داخل سایت ثبت نام کرد و عکس آپلود کرده ، عکس به صورت خودکار در قسمتی که مربوط به اون کاربر هست درج بشه چگار باید انجام بدم؟

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

جهانگیر پچکم
30 خرداد 1398
سلام به آقا محمد گل من در درسهای بعدی به طور مفصل این موضوع رو توضیح داده ام انشاالله با مرور اونها به طور کامل ابهام شما برطرف میشه با تشکر جهانگیر پچکم

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

mohammad
25 خرداد 1398
سلام ، خسته نباشید و ممنون از سایت خوبتونن من میخواستم بدونم که اگر بخوام توی سایت ارتباط آنلاین ویدئویی بین دو نفر مثل skype یا imo ایجاد کنم باید چکار کنم لطفا یکم توضیح کامل بدید خیلی نیاز دارم مرسی

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

علی پناهی
31 فروردین 1398
سلام خسته نباشید استاد کدهای تابع total_items که داخل همین صفحه زحمتش رو کشیدید گذاشتید یک سری کد HTML داخلش به اشتباه درج شده و باید پاک بشه. گفتم یوقت دوستانی که کد رو از همینجا کپی میکنن و ارور میگیرن بدونن مشکل چیه: خط 9 خط 17 خط 30 خط 39

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

جهانگیر پچکم
05 اردیبهشت 1398
با سلام به شما با احترام کامل به نظری که شما دادین ولی من این کدها را پس از اجرای عملی برای شما عزیزان قرار می دم و به طور کامل می تونم این رو بگم که هیچ خطی به اشتباه نوشته نشده. با تشکر از نظری که شما دوست عزیزم دادین.

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

علی
19 اردیبهشت 1398
با سلام. بنده هم همین خطاها رو در همین خط ها دریافت می‌کنم. انگار که باید span قبلش echo استفاده بشه که درست بشه.

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

علی
19 اردیبهشت 1398
اگر اشتباه نکنم باید به این شکل در بیاد تا کار کنه function total_items() { if(isset($_GET['add_cart'])) { global $con; echo ""; //creating or using cookie if(isset($_COOKIE["ipUserEcommerce"])) { $ip = $_COOKIE["ipUserEcommerce"]; }else{ $ip=getIp(); setcookie('ipUserEcommerce',$ip,time()+1206900); } $get_items = "select * from cart where ip_add='$ip'"; $run_items=@mysqli_query($con,$get_items); $count_items=@mysqli_num_rows($run_items); }else { global $con; echo ""; //creating or using cookie if(isset($_COOKIE["ipUserEcommerce"])) { $ip = $_COOKIE["ipUserEcommerce"]; }else{ $ip=getIp(); setcookie('ipUserEcommerce',$ip,time()+1206900); } $get_items = "select * from cart where ip_add='$ip'"; $run_items =@mysqli_query($con,$get_items); $count_items =@mysqli_num_rows($run_items); } echo $count_items; }

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

مهدی زاده
22 بهمن 1397
سلام. ممنون از دانشی که در اختیار ما گذاشتین if(isset($_COOKIE["ipUserEcommerce"])) { $ip = $_COOKIE["ipUserEcommerce"]; }else{ $ip=getIp(); setcookie('ipUserEcommerce',$ip,time()+1206900); } $get_items = "select * from cart where ip_add='$ip'"; $run_items=@mysqli_query($con,$get_items); $count_items=@mysqli_num_rows($run_items); من این قسمت متوجه نشدم. ممنون میشم یه توضیح بدین.

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

جهانگیر پچکم
24 بهمن 1397
سلام به شما دوست گرامی اوا از همه به شما توصیه می کنم که فابل نهایی پروژه فروشگاه اینترنتی را از آدرس https://www.roxo.ir/home/programming/php-online-shop-script دریافت کنید و حتما "پیش نمایش" را مشاهده بفرمایید. بعد از توصیه بالا، در ادامه به توضیح کد نوشته شده می پردازم. ببینید من در این جا قصد داشتم که ip کاربر رو به دست بیارم، اما یک مشکل وجود داشت و اون اینکه ip کاربر ممکن هست با هر بار ورودش تغییر کنه. راه حل برطرف کردن این مشکل استفاده از کوکی هست. قبل از اینکه بقیه این فرآیند رو تعریف کنم بهتر شما رو بهتر با هر کدام از آیتم های بالا آشنا کنم: 1- تابع getIp() برای به دست آوردن آی پی کاربر مورد استفاده قرار می گیره 2- تابع isset بررسی می کنه آیا پارامتر ورودی آن ، به وجود آمده است یا خیر. 3- $_COOKIE[“ipUserEcommerce”] در واقع کوکی هست که برای ذخیره آی پی از آن استفاده می شود. حالا به سراغ توضیحات اضافه تر برویم. به همین خاطر من ابتدا یک شرط رو تعریف کردم و گفتم اگر کوکی با نام $_COOKIE[“ipUserEcommerce”] وجود داشت نیازی نیست که ip را با استفاده از تابع getIp() به دست بیارویم بلکه فقط کافی هست که مقدار کوکی $_COOKIE[“ipUserEcommerce”] را در متغییر $ip قرار بدیم. در غیر اینصورت یعنی اگر کوکی $_COOKIE[“ipUserEcommerce”] وجود نداشت، ابتدا با استفاده از تابع getIp() آی پی کاربر را به دست می آوریم و بعد این آی پی را در کوکی $_COOKIE[“ipUserEcommerce”] به مدت 2 هفته (1206900 ثانیه) ذخیره می کنیم. با استفاده از این ترفند مشکل ip های متغییر را حل می کنیم. دامه کد خیلی ساده تر است. در واقع در $get_items = “select * from cart where ip_add=’$ip'”; $run_items=@mysqli_query($con,$get_items); $count_items=@mysqli_num_rows($run_items) من در این کدها ابتدا با استفاده از sql از جدول داده ایی cart (در این جدول داده ایی، ما تمامی خریدها را قرار می دهیم) تمام رکوردهایی که ip_add آنها برابر با متغییر $ip هست را به دست آورده ام و در انتها هم با استفاده از mysqli_num_rows تعداد این رکورد ها را به شمارش در آورده ام و در متغییر $count_items ذخیره کرده ام.

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

Ali safdari
20 بهمن 1397
با سلام.اول از همه جا داره یه تشکر بسیار ویژه کنم از سایت بسیار خوبتون و همچنین مهندس جهانگیر بابت مطلب آموزشی بسیار خوبشون. یه سوال داشتم و اونم اینکه چطور میتونم سورس نهایی رو دریافت کنم؟؟ ممنون میشم اگه امکانش هست به ایمیل من ارسال کنید. باتشکر

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

جهانگیر پچکم
20 بهمن 1397
سلام خیلی خوشحال شدم از اینکه فرمودید که مطالب آموزشی من مفید بوده، واقعا از شما و سایر دوستان بابت حمایتهایی که انجام می دید، بسیار تشکر می کنم. شما می تونید سورس نهایی و فیلم پیش نمایش اونو از آدرس زیر بدست بیارید. https://www.roxo.ir/home/programming/php-online-shop-script انشاالله با حمایت های شما، در ادامه مطالب آموزشی بسیار بهتری رو برای شما عزیزان تهیه کنم. با آرزوی موفقیت برای شما، جهانگیر پچکم

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