در این قسمت به ساخت سبد خرید در PHP می پردازیم. برای این کار ابتدا باید به سراغ دکمه "هم اکنون می خرید" برویم. برای درک بهتر به تصویر زیر نگاه کنید. در تصویر با استفاده از فلش قرمز رنگ "هم اکنون می خرید" برجسته تر شده است.
دقت کنید کار ما در این قسمت آموزشی این است که وقتی کاربر (مشتری) بر روی دکمه "هم اکنون می خرید" فشار داد، محصول مورد نظرش به سبد خریدش اضافه شود و یک پیام موفقیت این عملیات نیز به کاربر نمایش داده شود. پس باید مراحل زیر را باید به ترتیب انجام دهید.
قبل از همه چیز ما باید ابتدا یک جدول داده ای تحت عنوان cart ایجاد کنیم که وقتی کاربر (مشتری) بر روی دکمه "هم اکنون می خرید" فشار داد، هم مشخصات خود کاربر و هم مشخصات محصول مورد نظرش، در این جدول به عنوان یک رکورد ذخیره شود.
پس ما 3 ستون اساسی باید برای جدول cart ایجاد کنیم که در ادامه آورده ام.
p_id | ip_add | qty |
شماره id محصول است و از نوع int به اندازه 10 | آدرس ip کاربر است که با varchar به اندازه 255 می باشد | تعداد خرید از محصول از نوع int و به اندازه 10 می باشد. |
در مورد فیلد qty در جلسه آموزشی بعدی به طور کامل توضیح می دهم.
دقت کنید که تنها راهی که می توان کاربر را شناخت از طریق ip است که با آن وارد سایت ما می شود. برای اینکه محصول را نیز بتوانیم شناسایی کنیم باید از id محصول کمک بگیریم. در مورد به دست آوردن id محصول، در قسمت های قبل به طور کامل توضیح داده ام. اما در مورد نحوی به دست آوردن ip کاربر، در ادامه این قست آموزشی به شما به طور کامل آموزش می دهم.
خب برویم سراغ ایجاد جدول cart. برای انجام اینکار ابتدا باید یک جدول جدید به نام cart را به پایگاه داده ecommerce اضافه نماییم.
برای اینکار بعد از اینکه wamp را روشن کردید به آدرس http://localhost/phpmyadmin بروید و پایگاه داده ی eccomerce را باز کنید و در قسمت سمت راست در ناحیه Create table درون کادر Name کلمه cart را بنویسید و در قسمت Number of columns عدد 3 که نشان دهنده ی تعداد فیلد های شماست را وارد کنید. سپس بر روی دکمه Go فشار دهید.
بعد از فشار دادن دکمه Go به صفحه ای شبیه به تصویر زیر هدایت می شوید. به مقادیری که من در هر کدام از کادرها داده ام، دقت کنید. شما هم به همین شکل مقدار دهی را انجام دهید و دقت کنید که p_id را به عنوان کلید اصلی (PRIMARY) در نظر بگیرید.
بعد از تنظیم کردن مقادیر بر روی دکمه save فشار دهید.
کار ساخت جدول داده ایی cart به پایان رسید. اکنون باید به سراغ کد نویسی های مورد نیاز برویم.
بعد از ایجاد جدول بالا باید به سراغ فایل functions.php برویم و آن را با استفاده از Notepad++ باز کنیم. به انتهای فایل functions.php بروید و قبل از ?> توابع مورد نیاز خودمان را اضافه می کنیم.
ابتدا تابعی که بتواند ip کاربر را بگیرید و دوم تابعی که وقتی کاربر مشخص بر روی دکمه "هم اکنون می خرید" فشار داد ، مشخصات ip کاربر و id محصول را در جدول داده ای cart قرار دهد.
علاوه بر این باید یک کپی از محصولات انتخابی کاربر روی کوکی ذخیره کنیم که درباره کوکی در فصل های آینده صحبت می کنیم.
برای به دست آوردن ip کاربران از تابع زیر استفاده کردم. فایل functions.php را باز کنید و کدهای زیر را در آن قرار دهید.
//getting IP User function getIp() { //whether ip is from remote address $ip=$_SERVER['REMOTE_ADDR']; //whether ip is from share internet if(!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip=$_SERVER['HTTP_CLIENT_IP']; } //whether ip is from proxy elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; } return $ip; }
همانطور که در جلسات قبلی خدمت شما عرض کردم $_SERVER یک آرایه فوق سراسری در php می باشد که مقادیر خاصی را می پذیرد. برای شما نمونه هایی از مقادیری که این آرایه می پذیرد را از سایت w3schools در جدول زیر آورده ام:
نام فایل (filename) در حال اجرا را (نسبت به ریشه سایت ) بر می گرداند. | $_SERVER['PHP_SELF'] |
برای شما ip سرور (ip هاست شما) را باز می گرداند. | $_SERVER['SERVER_ADDR'] |
ip کاربران را باز میگرداند. | $_SERVER['REMOTE_ADDR'] |
با استفاده از این مقدار می توانید بفهمید که کاربری که وارد سایت شما شده است از چه سایتی آمده است. | $_SERVER['HTTP_REFERER'] |
مسیر مطلق فایل در حال اجرا را بر می گرداند | $_SERVER['SCRIPT_FILENAME'] |
ip کاربرانی را باز می گرداند که از پراکسی سرور ها استفاده کرده اند. | $_SERVER['HTTP_X_FORWARDED_FOR'] |
ip کاربری را باز می گرداند زمانی که از یک اینترنت اشتراکی استفاده می کند. | $_SERVER['HTTP_X_FORWARDED_FOR'] |
با استفاده از جدول بالا به راحتی تابع getIp() را درک خواهید کرد. بعد از نوشتن تابع getIp() می توانیم در هر کجا که دوست دارید این تابع را echo کنید تا ip کاربر سایت را مشاهده نمایید. مثلا من در هدر سایت اینکار را کردم.
البته بعد از آزمایشی که انجام دادید echo آن را پاک کنید.
بعد از تابع getIp() ، نوبت به نوشتن تابع Cart() می رسد. کار این تابع این است که id محصول و ip کاربری (منظورم مشتری سایت است) که آن را خریداری کرده را در جدول داده ای cart قرار می دهد. در واقع این تابع یک سبد خرید در PHP برای کاربران ایجاد می کند.
اگر کاربر برای اولین بار است که محصول را برای خرید انتخاب می کند، یک رکورد به جدول cart اضافه کند، در غیر اینصورت اگر برای بار دوم (یا بار چندم) است که دکمه “هم اکنون بخرید” یک محصول را زده باشد ، نباید رکورد جدیدی اضافه شود . این کار از تکرار رکورد در جدول cart جلوگیری می کند.
//creating the shopping cart //import attribute product and IP address user with press buy button in cart table function cart() { global $con; if(isset($_GET['add_cart'])) { $pro_id=$_GET['add_cart']; //creating or using cookie if(isset($_COOKIE["ipUserEcommerce"])) { $ip = $_COOKIE["ipUserEcommerce"]; }else{ $ip=getIp(); setcookie('ipUserEcommerce',$ip,time()+1206900); } $check_pro="select * from cart where p_id='$pro_id' AND ip_add='$ip' "; $run_check=@mysqli_query($con,$check_pro); if(@mysqli_num_rows($run_check)>0) { echo ""; } else { $insert_pro="insert into cart (p_id,ip_add,qty)values('$pro_id','$ip',1)"; $run_insert_pro=@mysqli_query($con,$insert_pro); } } }
اگر شما قسمت های گذشته آموزش ساخت فروشگاه اینترنتی با php را مطالعه کرده باشید به راحتی کد های بالا را متوجه می شوید. اما بخشی از این کدها مربوط به ذخیره سازی محصولات در کوکی مرورگر کاربر است که در زیر آورده ایم. این قطعه کد باعث می شود که با استفاده از cookie ها بتوانیم اطلاعاتی را در مرورگر مشتری ذخیره کنیم تا اگر زمانی ip مشتری به هر دلیلی دچار تغییر شد، اطلاعات (محصولاتی که مشتری در سبد خرید خودش قرار می دهد) از بین نرود.
دقت کنید که این اطلاعات تا زمان دو هفته ( در واقع دوهفته به ثانیه، عدد 1209600 می شود ) در cookie های مرورگر مشتری ذخیره می گردد.
//creating or using cookie if(isset($_COOKIE["ipUserEcommerce"])) { $ip = $_COOKIE["ipUserEcommerce"]; }else{ $ip=getIp(); setcookie('ipUserEcommerce',$ip,time()+1206900); }
برای درک این قسمت باید قسمت "معرفی آرایه های فوق سراسری Session و Cookie در PHP " را مطالعه نمایید.
البته برای اینکه تابع cart() بتواند به درستی کار کند باید در فایل functions.php به دنبال کد زیر باشید. ما در تابع getPro() خط زیر را داریم.
<div class='buynow'><a href='#'>هم اکنون می خرید</a></div>
و آن را به صورت زیر تغییر دهید.
<div class='buynow'><a href='index.php?add_cart=$pro_id'>هم اکنون می خرید</a></div>
و در تابع getCatPro() خط زیر را داریم
<div class='buynow'><a href='#'>هم اکنون می خرید</a></div>
و آن را به صورت زیر تغییر می دهیم.
<div class='buynow'><a href='details.php?add_cart=$pro_id'>هم اکنون می خرید</a></div>
و در تابع getBrandPro() هم باید خط زیر را پیدا کنید
<div class='buynow'><a href='#'>هم اکنون می خرید</a></div>
سپس آن را با کد زیر جایگزین کنید.
<div class='buynow'><a href='details.php?add_cart=$pro_id'>هم اکنون می خرید</a></div>
خب کار ما با فایل functions.php به پایان رسید. حالا باید فایل details.php را باز و خط زیر را در آن پیدا کنیم.
<div class='buynow'><a href='#'>هم اکنون می خرید</a></div>
و آن را پاک کنید و خط زیر را به جای آن قرار دهید.
<div class='buynow'><a href='index.php?add_cart=$pro_id'>هم اکنون می خرید</a></div>
در نهایت فایل functions.php باید کد های زیر را داشته باشد.
<?php $con=mysqli_connect("localhost","root","","ecommerce"); if(mysqli_connect_errno()) { echo "ارتباط با پایگاه داده برقرار نیست . شماره خطا :".mysqli_connect_errno(); } //getting categories function getCat() { global $con; $get_cat="select * from categories"; //for persion languge $run_cat=@mysqli_query($con,"SET NAMES utf8"); $run_cat=@mysqli_query($con,"SET CHARACTER SET utf8"); $run_cat=@mysqli_query($con,$get_cat); while($row_cat=@mysqli_fetch_array($run_cat)) { $cat_id=$row_cat['cat_id']; $cat_title=$row_cat['cat_title']; echo "<li><a href='index.php?cat_id=$cat_id'>$cat_title</a></li>"; } } //getting brands function getBrand() { global $con; $get_brand="select * from brands"; $run_brand =@mysqli_query($con,"SET NAMES utf8"); $run_brand =@mysqli_query($con,"SET CHARACTER SET utf8"); $run_brand=@mysqli_query($con,$get_brand); while($row_brand=@mysqli_fetch_array($run_brand)) { $brand_id=$row_brand['brand_id']; $brand_title=$row_brand['brand_title']; echo "<li><a href='index.php?brand_id=$brand_id'>$brand_title</a></li>"; } } //display products function getPro() { global $con; //display products when not set cat_id and brand_id if((!isset($_GET['cat_id']))&&(!isset($_GET['brand_id']))){ $get_pro="select * from products order by RAND() LIMIT 0,6"; $run_pro=@mysqli_query($con,"SET NAMES utf8"); $run_pro=@mysqli_query($con,"SET CHARACTER SET utf8"); $run_pro=mysqli_query($con,$get_pro); echo"<h2>جدیدترین محصولات</h2>"; while($row_pro=mysqli_fetch_array($run_pro)) { $pro_id=$row_pro['product_id']; $pro_cat=$row_pro['product_cat']; $pro_brand=$row_pro['product_brand']; $pro_title=$row_pro['product_title']; $pro_price=$row_pro['product_price']; $pro_desc=$row_pro['product_desc']; $pro_image=$row_pro['product_image']; echo" <div class='product_box'> <h3>$pro_title</h3> <img width='200' height='150' src='Admin_area/$pro_image' alt='image' /> <div class='price'>قیمت:<span>$pro_price تومان</span></div> <div class='buynow'><a href='index.php?add_cart=$pro_id'>هم اکنون می خرید</a></div> <a href='details.php?product_id=$pro_id'>جزئیات</a> </div>"; } } } //display products when set cat_id function getCatPro() { global $con; if(isset($_GET['cat_id'])){ $pro_cat_id=$_GET['cat_id']; //query getting products of cat $get_pro="select * from products where product_cat='$pro_cat_id' "; //query getting name of category $get_cat_name="select cat_title from categories where cat_id='$pro_cat_id' "; $run_pro=@mysqli_query($con,"SET NAMES utf8"); $run_pro=@mysqli_query($con,"SET CHARACTER SET utf8"); $run_pro=mysqli_query($con,$get_pro); $run_cat_name=mysqli_query($con,$get_cat_name); //display name of category while($row_cat_name=mysqli_fetch_array($run_cat_name)) { $pro_cat_name=$row_cat_name['cat_title']; echo"<h2>$pro_cat_name</h2>"; } //display message when empty of category $cunt_pro_cat=mysqli_num_rows($run_pro); if($cunt_pro_cat==0) { echo"<br/><br/><b><h3>متاسفانه محصول خاصی در این دسته وجود ندارد</h3></b>"; } //display products of category while($row_pro=mysqli_fetch_array($run_pro)) { $pro_id=$row_pro['product_id']; $pro_cat=$row_pro['product_cat']; $pro_brand=$row_pro['product_brand']; $pro_title=$row_pro['product_title']; $pro_price=$row_pro['product_price']; $pro_desc=$row_pro['product_desc']; $pro_image=$row_pro['product_image']; echo" <div class='product_box'> <h3>$pro_title</h3> <img width='200' height='150' src='Admin_area/$pro_image' alt='image' /> <div class='price'>قیمت:<span>$pro_price تومان</span></div> <div class='buynow'><a href='index.php?add_cart=$pro_id'>هم اکنون می خرید</a></div> <a href='details.php?product_id=$pro_id'>جزئیات</a> </div>"; } } } //display products when set brand_id function getBrandPro() { global $con; if(isset($_GET['brand_id'])){ $pro_brand_id=$_GET['brand_id']; //query getting products of brand $get_pro="select * from products where product_brand='$pro_brand_id' "; //query getting name of brand $get_brand_name="select brand_title from brands where brand_id='$pro_brand_id' "; $run_pro=@mysqli_query($con,"SET NAMES utf8"); $run_pro=@mysqli_query($con,"SET CHARACTER SET utf8"); $run_pro=mysqli_query($con,$get_pro); $run_brand_name=mysqli_query($con,$get_brand_name); //display name of brand while($row_brand_name=mysqli_fetch_array($run_brand_name)) { $pro_brand_name=$row_brand_name['brand_title']; echo"<h2>$pro_brand_name</h2>"; } //display message when empty of brand $cunt_pro_brand=mysqli_num_rows($run_pro); if($cunt_pro_brand==0) { echo"<br/><br/><b><h3>متاسفانه محصول خاصی در این برند وجود ندارد .</h3></b>"; } //display products of brand while($row_pro=mysqli_fetch_array($run_pro)) { $pro_id=$row_pro['product_id']; $pro_cat=$row_pro['product_cat']; $pro_brand=$row_pro['product_brand']; $pro_title=$row_pro['product_title']; $pro_price=$row_pro['product_price']; $pro_desc=$row_pro['product_desc']; $pro_image=$row_pro['product_image']; echo" <div class='product_box'> <h3>$pro_title</h3> <img width='200' height='150' src='Admin_area/$pro_image' alt='image' /> <div class='price'>قیمت:<span>$pro_price تومان</span></div> <div class='buynow'><a href='index.php?add_cart=$pro_id'>هم اکنون می خرید</a></div> <a href='details.php?product_id=$pro_id'>جزئیات</a> </div>"; } } } //getting IP User function getIp() { //whether ip is from remote address $ip=$_SERVER['REMOTE_ADDR']; //whether ip is from share internet if(!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip=$_SERVER['HTTP_CLIENT_IP']; } //whether ip is from proxy elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; } return $ip; } //creating the shopping cart //import attribute product and IP address user with press buy button in cart table function cart() { global $con; if(isset($_GET['add_cart'])) { $pro_id=$_GET['add_cart']; //creating or using cookie if(isset($_COOKIE["ipUserEcommerce"])) { $ip = $_COOKIE["ipUserEcommerce"]; }else{ $ip=getIp(); setcookie('ipUserEcommerce',$ip,time()+1206900); } $check_pro="select * from cart where p_id='$pro_id' AND ip_add='$ip' "; $run_check=@mysqli_query($con,$check_pro); if(@mysqli_num_rows($run_check)>0) { echo ""; } else { $insert_pro="insert into cart (p_id,ip_add,qty)values('$pro_id','$ip',1)"; $run_insert_pro=@mysqli_query($con,$insert_pro); } } } ?>
خب تا اینجا عالی پیش رفتیم، آخرین کاری که باید انجام دهید این است که فایل header.php را باز کرده و خط زیر را در آن پیدا کنید.
<div id="templatemo_shopping_cart"> Shopping Cart <span>(<a href="#">3 items</a>)</span> </div>
آن را پاک کنید و خط زیر را به جای آن قرار دهید.
<div id="templatemo_shopping_cart"> <?php if(isset($_GET['add_cart'])){ cart(); echo " محصول مورد نظر شما به سبد خرید اضافه شد."; } ?> </div>
این خط باعث می شود وقتی کاربر محصولی را خرید در بالای سایت برایش پیام مناسب به نمایش در بیاید. به تصویر زیر نگاه کنید.
خب به انتهای این قسمت از آموزش ساخت سبد خرید در PHP رسیدیم. انشاالله که با کد زنی و تحقیق بیشتر ، عمق اطلاعات خودتان را بالاتر ببرید. اگر در هر کجا برای شما مشکلی پیش آمد و یا سوالی داشتید در قسمت نظر دهی عنوان کنید تا جواب مناسب را به شما بدهم. در قسمت آینده به سراغ کادر سبد خرید خواهیم رفت. قسمت بعدی را از دست ندهید. موفق باشید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.