ایجاد پنل مدیریت سایت با PHP - ویرایش جدول سفارشات

php-edit-cart

در قسمت قبل، تقریبا نیمه ای از کارهای لازم برای فعال کردن گزینه ی "مشاهده تمامی سفارش ها " را با هم دیگر انجام دادیم، در این قسمت قرار است، قدری پا را فراتر بگذاریم و مباحثی مطرح کنیم که گزینه ی "مشاهده تمامی سفارش ها"  تکمیل تر گردد.

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

در ادامه جدول داده ایی cart قبلی را حذف کردیم و جدول cart جدیدی، متناسب با نیازهای جدید، ایجاد کردیم. در ضمن یک جدول جدید به نام pay_cart نیز به جدول های موجود در پایگاه داده اضافه شد.

در همان قسمت قبل، قرار شد برای شما توضیح دهم که، چرا این دو جدول را ایجاد کردم؟ و چگونه بین این دو جدول و گزینه ی "مشاهده ی تمامی سفارشها"، ارتباط برقرار می شود؟

اگر به فیلدهای جدول cart و pay_cart دقت کرده باشید، من در جدول داده ی pay_cart، تمامی فیلد های جدول داده ایی cart را قرار دادم. به تصویر زیر نگاه کنید.

مقایسه ی بین دو جدول cart و pay_cart

چرا جدول pay_cart را ایجاد کردیم؟

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

این کار 2 مزیت دارد، یکی اینکه مشتریانی که پول محصولات خودشان را داده اند، از سایر مشتریان تفکیک می شوند، ثانیا، اگر همین مشتری، قصد داشته باشد، مجددا محصولاتی را خریداری کند، بین خریدهایش (یا فاکتور های خریدش) می توان تمایز قائل شد (دقت کنید که من در جدول داده ایی pay_cart  از فیلد order_id برای تمایز بین خریدها، استفاده کرده ام و خواهم گفت که چگونه قرار است آن را مقدار دهی کنیم).

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

بررسی رابطه میان جدول داده ایی cart و pay_cart

حالا که به طور کامل، لزوم ایجاد این دو جدول را متوجه شدید، یک سوال مطرح می شود و آن اینکه:

در کدام فایل باید عملیات کپی برداری و حذف را انجام دهیم؟

 جواب بسیار ساده است، زمانی که بانک به ما ok داد و گفت فلان مشتری پول را پرداخت کرده، زمانی است که ما باید، این انتقال اطلاعات از جدول داده ی cart به جدول داده ایی pay_cart را انجام دهیم. حالا به نظر شما کدام فایل بهترین مکان برای ایجاد تغییرات جدید است؟

آفرین، درست حدس زدید، فایل  verify.php بهترین گزینه است. حالا به آدرس C:\wamp\www\ecommerce مراجعه کنید و فایل  verify.php را با استفاده از Notepad++ باز کنید و کدهای زیر را در آن پیدا کنید.

				echo "<p style='background:green; padding: 27px;	font-size: 20px; border-radius: 15px;border: 5px dashed white;'>از خرید شما متشکریم کد RefID برای پیگیری های بعدی شما :".$result->RefID."می باشد.</p>";
				$RefID=$result->RefID;
				mysqli_query($con,"UPDATE `order` SET `order_is_verified`='true', `refid`=$RefID WHERE `order_id`=$order_id ");

آنها را حذف کنید و کدهای زیر را به جای آنها قرار دهید.

echo "<p style='background:green; padding: 27px;	font-size: 20px; border-radius: 15px;border: 5px dashed white;'>از خرید شما متشکریم کد RefID برای پیگیری های بعدی شما :".$result->RefID."می باشد.</p>";
$RefID=$result->RefID;
mysqli_query($con,"UPDATE `order` SET `order_is_verified`='true', `refid`=$RefID WHERE `order_id`=$order_id ");


//creating or using cookie for ip customer
if(isset($_COOKIE["ipUserEcommerce"]))
{
$ip	= $_COOKIE["ipUserEcommerce"];
}else{
$ip=getIp();
setcookie('ipUserEcommerce',$ip,time()+1206900);
}			

//Copy the data from the cart data table to the pay _cart data table
mysqli_query($con,"INSERT INTO pay_cart (p_id, ip_add, qty)
SELECT p_id, ip_add, qty FROM cart
WHERE ip_add='$ip'");

//Insert the value in the order_id
$run_time=mysqli_query($con,"select * from `pay_cart` where ip_add='$ip' order by id_cart desc limit 1");
while ($run_time = @mysqli_fetch_array($run_time))
{
$time=$run_time["order_time"];
}
//Updating the order_id filde in the pay_cart table, of course, based on the payout time of the sales order
mysqli_query($con,"UPDATE `pay_cart` SET `order_id`=$order_id WHERE `order_time`='$time'");					

//destroying the session 
unset($_SESSION["order_total_price"]);
unset($_SESSION["order_id"]);

//destroying sessions that hold the qty.
$str_ip= str_replace(".", "", "$ip");
$query_delete_session="SELECT * FROM `pay_cart` WHERE `order_id`=$order_id";
$run_delete_session=mysqli_query($con,$query_delete_session);
while ($row = mysqli_fetch_array($run_delete_session))
{
$product_id=$row["p_id"];
unset($_SESSION["$str_ip"]["$product_id"]);
}


//Delete customer data from the cart data table
mysqli_query($con,"DELETE FROM cart WHERE ip_add='$ip'");

توضیح کدهای اضافه شده به verify.php

در کدهای بالا دقیقا مشاهده می نمایید که، وقتی مشتری پول را پرداخت کرد، ابتدا ip مشتری را به دست می آوریم، و بعد از آن با استفاده از همین ip مشتری، می توانیم اطلاعات را از جدول داده ایی cart به جدول داده ایی pay_cart کپی کنیم؛ من این کار را توسط دستور SQL زیر انجام داده ام.

INSERT INTO pay_cart (p_id, ip_add, qty)
				SELECT p_id, ip_add, qty FROM cart
				WHERE ip_add='$ip'

دستور بالا یک دستور معروف در SQL می باشد، که نام آن، دستور INSERT INTO SELECT است. و تنها نکته ایی است که، تا به حال آن را خدمت شما عرض نکردم، بنابراین در ادامه به طور کامل آن را معرفی می کنم.

دستور INSERT INTO SELECT

طبق تعریف سایت w3schools، دستور INSERT INTO SELECT، داده ها را از یک جدول کپی کرده و آن را در جدول دیگری قرار می دهد. البته  نکته ی مهمی را باید مد نظر قرار داد، این است که دستور INSERT INTO SELECT زمانی کار خواهد کرد که نوع داده ی در جدول مبدا و مقصد یکی باشد.

نحوه نوشتن دستور INSERT INTO SELECT

وقتی می خواهیم تمام ستون ها را از یک جدول به جدول دیگر کپی کنیم:

INSERT INTO table2
SELECT * FROM table1
WHERE condition;

وقتی قرار است تنها چند ستون را از یک جدول به جدول دیگری کپی کنیم:

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition;

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

وقتی که اطلاعات سبد خرید مشتری ای که پول محصولاتش را پرداخت کرده است را، از جدول داده ایی cart به جدول داده ایی pay_cart کپی کردیم؛ در فیلد order_time (که یکی از فیلد های جدول داده ایی pay_cart است) زمان ایجاد این رکورد، به صورت خودکار، ثبت می شود.

بنابراین ما این زمان را نمی دانیم و باید زمان ایجاد هر فاکتور فروش را به دست آوریم (این موضوع فوق العاده مهم است)، پس با استفاده از ip مشتری، رکوردهای جدید اضافه شده اش، را مرتب می کنیم؛ تا بتوانیم  این زمان را به دست آوریم. به دستور SQL زیر دقت کنید.

select * from `pay_cart` where ip_add='$ip' order by id_cart desc limit 1

در ادامه ما زمان ایجاد آخرین رکورد (دقت کنید مجموع چند رکورد متعلق به یک IP در واقع یک سبد خرید است که از جدول داده ایی cart به جدول داده ایی pay_cart آمده است ولی هنوز این رکورد ها شماره فاکتور ندارند.) متعلق به یک ip را به دست می آوریم و با استفاده از همین زمان، شماره ی فاکتور (order_id) آخرین خرید مشتری را، با استفاده از کدهای زیر به جدول تزریق می کنیم.

mysqli_query($con,"UPDATE `pay_cart` SET `order_id`=$order_id WHERE `order_time`='$time'");

قرار دادن id فاکتور فروش (یا همان order_id) در جدول pay_cart، البته بر اساس زمان پرداخت فاکتور فروش با استفاده از دستور SQL زیر اتفاق می افتد.

UPDATE `pay_cart` SET `order_id`=$order_id WHERE `order_time`='$time'

و در ادامه، متغییر های SESSION که اطلاعات مشتری را نگهداری می کردند باید همگی حذف شوند (این نکته فوق العاده مهم است، زیرا اگر این کار را انجام ندهیم، تمامی اطلاعات به هم می ریزد)، که اینکار را در کدهای زیر انجام داده ام.

unset($_SESSION["order_total_price"]);
				unset($_SESSION["order_id"]);
				$str_ip= str_replace(".", "", "$ip");
				$query_delete_session="SELECT * FROM `pay_cart` WHERE `order_id`=$order_id";
				$run_delete_session=mysqli_query($con,$query_delete_session);
				while ($row = mysqli_fetch_array($run_delete_session))
				{
					$product_id=$row["p_id"];
					unset($_SESSION["$str_ip"]["$product_id"]);
				}

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

//Delete customer data from the cart data table
				mysqli_query($con,"DELETE FROM cart WHERE ip_add='$ip'");

خب حالا کار ما با فایل  verify.php تمام شده است و تغییرات مورد نظر خودمان را در آن انجام دادیم. حال مجددا به فایل view_orders.php باز می گردیم و ببینیم که در ادامه باید چه کدهایی را بنویسیم. بنابراین به آدرس C:\wamp\www\ecommerce\admin_area برگردید و فایل view_orders.php را با استفاده از Notepad++ باز کنید.

در میان کدهای این فایل، لینک زیر را پیدا کنید.

<a style="color:#fff;" href="index.php?pay=<?php if($order_is_verified=="true"){echo"yes";}else{echo"no";}?>&order_customer=<?php echo $order_email_customer; ?>&Total_Amount=<?php echo $order_total_price ?>&id_order=<?php echo $id_order; ?>">مشاهده</a>

در این لینک، اساس کار، بر استفاده از متغییر سراسری $_GET بنا شده است. برای اینکه راحت تر متوجه لینک بالا شوید و توجه شما را به ویژگی href این لینک، در تصویر زیر ، جلب می کنم.

توضیح لینک مورد نظر

تصویر بالا به طور کامل مطالبی که باید خدمت شما عرض می کردم را پوشش داده است، تنها یک موضوع می ماند و آن این است که این لینک "مشاهده" که آن را در تصویر بالا، ملاحظه می کنید، جهت اجرای برنامه را به سمت فایل index.php تغییر می دهد. بنابراین به فایل index.php می رویم و این فایل را برای پذیرش این لینک آماده می کنیم.

به آدرس C:\wamp\www\ecommerce\admin_area بروید و فایل index.php را با استفاده از Notepad++ باز کرده و کدهای زیر را در آن پیدا کنید.

			if(isset($_GET['view_orders']))
			{
				include('view_orders.php');
			}

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

			if(isset($_GET['view_orders']))
			{
				include('view_orders.php');
			}
			
			if(isset($_GET['order_customer']))
			{
				include('order_customer.php');
			}	

در کدهای بالا به وضوح گفته ایم که اگر در آدرس سایت پارامتر order_customer وجود داشت، جهت اجرای برنامه  به سمت فایل  order_customer.php تغییر می کند.

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

ایجاد فایل order_customer

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

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

فایل verify.php که در آدرس C:\wamp\www\ecommerce قرار دارد.

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

<!-- start of content -->   
<div id="templatemo_content">
	
	<?php
		
		// We connect to the database	
		include("includes/db.php");
		
		$order_id=	$_GET['order_id_for_verify'];
		if ($_GET['Status'] == 'OK') {
			$MerchantID = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX';
			$Amount = $_GET['Amount']; //Amount will be based on Toman
			$Authority = $_GET['Authority'];
			
			$client = new SoapClient('https://sandbox.zarinpal.com/pg/services/WebGate/wsdl', ['encoding' => 'UTF-8']);
			
			$result = $client->PaymentVerification(
			[
			'MerchantID' => $MerchantID,
			'Authority' => $Authority,
			'Amount' => $Amount,
			]
			);
			
			if ($result->Status == 100) {
				
				echo "<p style='background:green; padding: 27px;	font-size: 20px; border-radius: 15px;border: 5px dashed white;'>از خرید شما متشکریم کد RefID برای پیگیری های بعدی شما :".$result->RefID."می باشد.</p>";
				$RefID=$result->RefID;
				mysqli_query($con,"UPDATE `order` SET `order_is_verified`='true', `refid`=$RefID WHERE `order_id`=$order_id ");
				
				
				//creating or using cookie for ip customer
				if(isset($_COOKIE["ipUserEcommerce"]))
				{
					$ip	= $_COOKIE["ipUserEcommerce"];
					}else{
					$ip=getIp();
					setcookie('ipUserEcommerce',$ip,time()+1206900);
				}			
				
				//Copy the data from the cart data table to the pay _cart data table
				mysqli_query($con,"INSERT INTO pay_cart (p_id, ip_add, qty)
				SELECT p_id, ip_add, qty FROM cart
				WHERE ip_add='$ip'");
				
				//Insert the value in the order_id
				$run_time=mysqli_query($con,"select * from `pay_cart` where ip_add='$ip' order by id_cart desc limit 1");
				while ($run_time = @mysqli_fetch_array($run_time))
				{
					$time=$run_time["order_time"];
				}
				//Updating the order_id filde in the pay_cart table, of course, based on the payout time of the sales order
				mysqli_query($con,"UPDATE `pay_cart` SET `order_id`=$order_id WHERE `order_time`='$time'");					
				
				//destroying the session 
				unset($_SESSION["order_total_price"]);
				unset($_SESSION["order_id"]);
				
				//destroying sessions that hold the qty.
				$str_ip= str_replace(".", "", "$ip");
				$query_delete_session="SELECT * FROM `pay_cart` WHERE `order_id`=$order_id";
				$run_delete_session=mysqli_query($con,$query_delete_session);
				while ($row = mysqli_fetch_array($run_delete_session))
				{
					$product_id=$row["p_id"];
					unset($_SESSION["$str_ip"]["$product_id"]);
				}
				
				
				//Delete customer data from the cart data table
				mysqli_query($con,"DELETE FROM cart WHERE ip_add='$ip'");
				
				} else {
				
				echo "<p style='background:red; padding: 27px;	font-size: 20px; border-radius: 15px;border: 5px dashed white;'> تراکنش انجام نشد : 
				:".$result->Status."</p>";
				
			}
			} else {
			echo "<p style='background:red; padding: 27px;	font-size: 20px; border-radius: 15px;border: 5px dashed white;'> تراکنش توسط کاربر انجام نشد </p>";
		}			
	?>	
</div>
<!-- end of content -->

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

فایل view_orders.php که در آدرس C:\wamp\www\ecommerce\admin_area قرار دارد.

<table  width="700" align="center">
	<caption ><b>مشاهده همه سفارشات</b></caption >
	<tr>
		<th colspan="5">
			<b style="background-color:green;">&nbsp&nbspفاکتور های پرداخت شده سبز رنگ هستند.&nbsp&nbsp</b>
			
		<b style="background-color:red;">&nbsp&nbspفاکتور های پرداخت نشده قرمز رنگ هستند.&nbsp&nbsp</b></th>
	</tr>
	<tr>
		<td><b>ردیف</b></td >
		<td><b>ایمیل مشتری</b></td >
		<td><b>تاریخ فاکتور</b></td >
		<td><b>قیمت کل فاکتور</b></td >
		<td><b>مشاهده سفارش</b></td >
	</tr>
	<tr align="center">
		<?php
			$i=0;
			$select_order="SELECT * FROM `order` ";
			$run_order=mysqli_query($con,"SET NAMES SET utf8");
			$run_order=mysqli_query($con,"SET CHARACTER SET utf8");
			$run_order=mysqli_query($con,$select_order);
			while($row_order = mysqli_fetch_array($run_order))
			{
				$id_order=$row_order['order_id'];
				$order_total_price=$row_order['order_total_price'];
				$order_is_verified=$row_order['order_is_verified'];
				/*Since the creation of a record
				in the order data table is different from
				the time the record is created
				in the pay_cart data table,
				therefore, we should consider
				the time to create the record
				in the pay_cart data table, 
				not the time when the record was
				created in the order data table
				*/
				$time_pay_order="";
				if($order_is_verified=="true"){
					$run_time_pay_order=mysqli_query($con,"select `order_time` from `pay_cart` where `order_id`=$id_order order by `id_cart` desc limit 1 ");
					while($run_time_pay_order	=	@mysqli_fetch_array($run_time_pay_order))
						{
						 $time_pay_order=$run_time_pay_order["order_time"];
						}
					}else{
					$order_time=$row_order['order_time'];
				}
				
				$order_email_customer=$row_order['order_email_customer'];
				$i++;
				
			?>
			<td align="center" style="background:<?php if($order_is_verified=="true"){echo"green";}else{echo"red";}?>"><?php echo $i ?></td>
			<td align="center" style="background:<?php if($order_is_verified=="true"){echo"green";}else{echo"red";}?>"><?php echo $order_email_customer ?></td>
			<td align="center" style="background:<?php if($order_is_verified=="true"){echo"green";}else{echo"red";}?>"><?php if($order_is_verified=="true"){echo $time_pay_order;}else{echo $order_time;} ?></td>
			<td align="center" style="background:<?php if($order_is_verified=="true"){echo"green";}else{echo"red";}?>"><p><?php echo $order_total_price ?></p></td>
			<td align="center" style="background:<?php if($order_is_verified=="true"){echo"green";}else{echo"red";}?>">
			<a style="color:#fff;" href="index.php?pay=<?php if($order_is_verified=="true"){echo"yes";}else{echo"no";}?>&order_customer=<?php echo $order_email_customer; ?>&Total_Amount=<?php echo $order_total_price ?>&id_order=<?php echo $id_order; ?>">مشاهده</a>	
			</td>
			</tr>
			<?php } ?>		
			</table>

فایل index.php  که در آدرس C:\wamp\www\ecommerce\admin_area قرار دارد.

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

<div id="templatemo_content">
	
	
	<!-- start of ocntent left -->
	<div id="templatemo_content_left">
		
		<?php 
			
			if(isset($_GET['insert_pro']))
			{
				include('insert_product.php');
			}			
			
			if(isset($_GET['view_pro']))
			{
				include('view_product.php');
			}
			
			if(isset($_GET['edit_pro']))
			{
				include('edit_product.php');
			}			
			
			if(isset($_GET['insert_cat']))
			{
				include('insert_cat.php');
			}
			
			if(isset($_GET['view_cats']))
			{
				include('view_cats.php');
			}
			
			if(isset($_GET['edit_cat']))
			{
				include('edit_cat.php');
			}
			
			if(isset($_GET['insert_brand']))
			{
				include('insert_brand.php');
			}
			
			if(isset($_GET['view_brands']))
			{
				include('view_brands.php');
			}
			
			if(isset($_GET['edit_brand']))
			{
				include('edit_brand.php');
			}			
			
			if(isset($_GET['view_customers']))
			{
				include('view_customers.php');
			}			
			
			if(isset($_GET['view_orders']))
			{
				include('view_orders.php');
			}
			
			if(isset($_GET['order_customer']))
			{
				include('order_customer.php');
			}			
		?>
		
		<div class="cleaner_with_height">&nbsp;</div>
	</div> 
	<!-- end of ocntent left -->
	
	<!-- start of right content -->
	<?php	include('include/Right_Sidebar.php');	?>
	<!-- end of right content -->
	
	<div class="cleaner">&nbsp;</div>
</div>

<!-- start of footer -->
<?php include('include/Footer.php');	?>
<!-- end of footer -->
تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری فروشگاه اینترنتی با PHP توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (1 دیدگاه)

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

محمد
10 دی 1397
باسلام ممنون از اموزش خوبتون هیچ جا ندیده بودم اینقدر با جزءیات اموزش بدن خسته نباشید. من طبق اموزش جلو رفتم با خطلا مواجه شدم اگه امکانش هست پروژه کامل رو برام ایمیل کنید.

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