ایجاد پروفایل کاربری در PHP - بروزرسانی اطلاعات در پایگاه داده

php-update-profile

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

تکمیل پروفایل کاربری با PHP

هدف این قسمت

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

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

به طور کلی، منظور من این است که هدف در اینجا نوشتن یک دستور update، از سری دستورات sql می باشد. دقت نمایید که ما برای بروزرسانی از id کاربر در جدول داده ایی customers بهره می گیریم. اما چگونه این id را به دست آوریم و چگونه مسیر کدهای خودمان را در جهت بروزرسانی تغییر دهیم.

حالا شاید بپرسید مسیر مورد نظر ما چیست. مسیر مورد نظر ما استفاده از همین $id = $row_custom['customer_id']; است که در فایل edit_account.php  آن را قرار داده ایم. دقت نمایید که ما می توانیم با استفاده از متغییر $id ، کاربر مورد نظر خودمان را در جدول داده ایی customers پیدا کنیم و در ادامه عملیات خودمان را (که در این اینجا هما update کردن است) روی رکوردی که برای کاربر می باشد، اعمال نماییم.

دستور update یک دستور اساسی در SQL

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

به طور خاص برای ویرایش رکوردهای یک جدول داده ایی از دستور update استفاده می شود ، شکل کلی استفاده از این دستور به صورت زیر است:

UPDATE  <Table Name>  SET   <Column> = <Value>   WHERE   <Condition>

در دستور بالا Table Name نام جدول داده ایی، Column نام ستون (فیلد) یا ستونهایی که قصد ویرایش آنها را داریم و Condition شرط ویرایش اطلاعات است.

فایل server.php

یادتان هست که ما فایل server.php را به فایل های موجود در فولدر customer اضافه کردیم، حالا وقت آن رسیده که به سراغ این فایل برویم. هدف اصلی این فایل پردازش اطلاعات ورودی از کاربر و بروز رسانی رکوردهای جدول داده ایی customers می باشد.

فایل edit_account.php را باز و کد زیر را در آن پیدا کنید.

<?php
	
	include('server.php'); 
	
?>

ما در اینجا فایل server.php را include کرده ایم.

حالا در ادامه فایل server.php را با استفاده از Notepad++ باز کنید و تمام کدهای آن را پاک و کدهای زیر را به جای کدهای قبلی قرار دهید.

<?php
	// update USER
	if(isset($_POST['update'])) {
		// receive all input values from the form
		// form validation: ensure that the form is correctly filled ...
		// by adding (array_push()) corresponding error unto $errors array
		
		// receive name value from the form
		$c_name = mysqli_real_escape_string($con , $_POST['c_name']);
		if (empty($c_name)) { array_push($errors, "نام خود را وارد نکردید!"); }		
		
 		// receive lastname value from the form
		$c_lastname = mysqli_real_escape_string($con ,$_POST['c_lastname']);
		if (empty($c_lastname)) { array_push($errors, "نام خانوادگی خود را وارد نکردید!"); }
		
		// receive gender value from the form
		$c_gender = $_POST['c_gender'];
				
		// receive image value from the form and validation image value
		if (empty($_FILES["c_image"]["name"])) 
		{ 
			$new_address_image = $image; 
			}else{
			$Allowextension = array("jpeg" , "jpg" , "png");
			$FileExtension=explode(".",$_FILES["c_image"]["name"]);
			$extension=end($FileExtension);
			if(in_array($extension,$Allowextension )&&($_FILES["c_image"]["size"]<=20971520))
			{
				if($_FILES["c_image"]["error"]==0)
				{
					$c_image = $_FILES['c_image']['name'];
					$c_image_tmp = $_FILES['c_image']['tmp_name'];
					$new_address_image="customer/customer_images/".$c_image;
					move_uploaded_file($c_image_tmp,"customer_images/".$c_image);
					}else{
					array_push($errors, "فایل به درستی آپلود نشد!!!");	
				}
				}else{
				array_push($errors, "تصویر مناسب را انتخاب کنید! پسوند مجاز برای تصویر شامل jpeg و jpg و png می باشد و حجم آن نباید بیشتر از 2 مگابایت باشد!!!");
			}
		}
				
		// receive state value from the form
		$c_province = $_POST['state'];
				
		// receive city value from the form
		$c_city = $_POST['city'];
				
		// receive address value from the form
		$c_address = mysqli_real_escape_string($con ,$_POST['c_address']);
		if (empty($c_address)) { array_push($errors, "آدرس خود را وارد نکردید!"); }
		
		// receive phone value from the form and validation phone value
		$c_phone_validate=mysqli_real_escape_string($con ,$_POST['c_phone']);
		if (empty($c_phone_validate)) 
		{
			array_push($errors, "تلفن خود را وارد نکردید!"); 
			}else{
			if(preg_match("/^[0]{1}[9]{1}\d{9}$/", $c_phone_validate))
			{
				// phone is valid
				$c_phone=$c_phone_validate;
				}else{
				array_push($errors, "تلفنی که وارد کردید صحیح نمی باشد!!!");
			} 
		}
				
		// Finally, update user account if there are no errors in the form
		if (count($errors) == 0) {
			$upload_c = "UPDATE `customers` SET `customer_name`=N'$c_name',`customer_lastname`=N'$c_lastname',`customer_gender`=N'$c_gender',`customer_image`='$new_address_image',`customer_province`=N'$c_province',`customer_city`=N'$c_city',`customer_address`=N'$c_address' WHERE `customer_id`=$id ";
			$run_uplod = mysqli_query($con,"SET NAMES SET utf8");
			$run_uplod = mysqli_query($con,"SET CHARACTER SET utf8");
			$run_uplod = mysqli_query($con,$upload_c);
			
			if($run_uplod)
			{
				echo "<script>alert('$c_name عزیز ، اطلاعات شما به درستی به روز رسانی شد !')</script>";
				echo "<script>window.open('my_account.php?edit_account','_self')</script>";
			}
			}else{
			include('includes/errors.php');
		}		
	}
?>

توضیح خط به خط کدهای فایل server.php

در ادامه خط به خط کدهای این فایل را توضیح می دهم.

در ابتدای فایل، ما با کد زیر روبرو می شویم.

if(isset($_POST['update'])) {

این یک دستور شرطی است به این معنی که اگر کاربر دکمه بروزرسانی را فشار داد (یا به صورت عامیانه بگویم: آیا کاربر بر روی دکمه بروزرسانی فشار داده است یا نه؟)

منظور از دکمه به روزرسانی

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

در ادامه کدهای زیر را خواهیم دید (این کدها در بلوک شرط قرار دارند).

		// receive name value from the form
		$c_name = mysqli_real_escape_string($con , $_POST['c_name']);
		if (empty($c_name)) { array_push($errors, "نام خود را وارد نکردید!"); }		
		
 		// receive lastname value from the form
		$c_lastname = mysqli_real_escape_string($con ,$_POST['c_lastname']);
		if (empty($c_lastname)) { array_push($errors, "نام خانوادگی خود را وارد نکردید!"); }
		
		// receive gender value from the form
		$c_gender = $_POST['c_gender'];
				
		// receive image value from the form and validation image value
		if (empty($_FILES["c_image"]["name"])) 
		{ 
			$new_address_image = $image; 
			}else{
			$Allowextension = array("jpeg" , "jpg" , "png");
			$FileExtension=explode(".",$_FILES["c_image"]["name"]);
			$extension=end($FileExtension);
			if(in_array($extension,$Allowextension )&&($_FILES["c_image"]["size"]<=20971520))
			{
				if($_FILES["c_image"]["error"]==0)
				{
					$c_image = $_FILES['c_image']['name'];
					$c_image_tmp = $_FILES['c_image']['tmp_name'];
					$new_address_image="customer/customer_images/".$c_image;
					move_uploaded_file($c_image_tmp,"customer_images/".$c_image);
					}else{
					array_push($errors, "فایل به درستی آپلود نشد!!!");	
				}
				}else{
				array_push($errors, "تصویر مناسب را انتخاب کنید! پسوند مجاز برای تصویر شامل jpeg و jpg و png می باشد و حجم آن نباید بیشتر از 2 مگابایت باشد!!!");
			}
		}
				
		// receive state value from the form
		$c_province = $_POST['state'];
				
		// receive city value from the form
		$c_city = $_POST['city'];
				
		// receive address value from the form
		$c_address = mysqli_real_escape_string($con ,$_POST['c_address']);
		if (empty($c_address)) { array_push($errors, "آدرس خود را وارد نکردید!"); }
		
		// receive phone value from the form and validation phone value
		$c_phone_validate=mysqli_real_escape_string($con ,$_POST['c_phone']);
		if (empty($c_phone_validate)) 
		{
			array_push($errors, "تلفن خود را وارد نکردید!"); 
			}else{
			if(preg_match("/^[0]{1}[9]{1}\d{9}$/", $c_phone_validate))
			{
				// phone is valid
				$c_phone=$c_phone_validate;
				}else{
				array_push($errors, "تلفنی که وارد کردید صحیح نمی باشد!!!");
			} 
		}

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

سوالاتی که ممکن است شما بپرسید؟

اما شاید یک سری سوال برای شما پیش آمده باشد مثلا اینکه:

  • چرا در کد پایین از تابع empty()  (تابعی که خالی بودن مقادیر ورودی ها را بررسی می کند)،  استفاده نکرده ایم.
		// receive gender value from the form
		$c_gender = $_POST['c_gender'];

و

		// receive state value from the form
		$c_province = $_POST['state'];
				
		// receive city value from the form
		$c_city = $_POST['city'];

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

فیلدهایی که کاربر باید در پروفایل PHP انتخاب کند

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

تغییر رمز عبور

حالا که به بعضی از سوالات پیش آمده، پاسخ دادم؛ می رویم سراغ ادامه توضیح کد. در ادامه کدهای فایل server.php به کدهای زیر می رسیم.

		// Finally, update user account if there are no errors in the form
		if (count($errors) == 0) {
			$upload_c = "UPDATE `customers` SET `customer_name`=N'$c_name',`customer_lastname`=N'$c_lastname',`customer_gender`=N'$c_gender',`customer_image`='$new_address_image',`customer_province`=N'$c_province',`customer_city`=N'$c_city',`customer_address`=N'$c_address' WHERE `customer_id`=$id ";
			$run_uplod = mysqli_query($con,"SET NAMES SET utf8");
			$run_uplod = mysqli_query($con,"SET CHARACTER SET utf8");
			$run_uplod = mysqli_query($con,$upload_c);
			
			if($run_uplod)
			{
				echo "<script>alert('$c_name عزیز ، اطلاعات شما به درستی به روز رسانی شد !')</script>";
				echo "<script>window.open('my_account.php?edit_account','_self')</script>";
			}
			}else{
			include('includes/errors.php');
		}

دقت کنید که در این کدها، عملیات اصلی را انجام می دهیم. دستور شرطی if (count($errors) == 0) بسیار مهم است چرا که اگر هر گونه اشکالی در ورودی ها وجود داشت (به عنوان مثال کاربر قصد هک کردن سایت و یا خراب کاری داشته باشد) با این دستور از این کار جلو گیری می کنیم. اگر شرط برقرار شد، یک دستور SQL مبتنی بر update رکورد مورد نظر اجرا می شود و پیام موفقیت آمیز بودن این عملیات به اطلاع کاربر رسانده می شود اما اگر شرط برقرار نشود با استفاده از پیامی، خطاها را به کاربر گوشزد می کنیم.

فایل errors.php

اما یک کار اساسی هم باقی مانده است و آن تغییر کدهای فایل errors.php می باشد. برای انجام این تغییر لازم است که ابتدا به آدرس C:\wamp\www\ecommerce\customer\includes مراجه نمایید و فایل errors.php را با استفاده از Notepad++ باز کنید و تمامی کدهای موجود در آن را پاک کرده و کدهای زیر را جایگزین کدهای قبلی نمایید.

<?php  if (count($errors) > 0) 
	$message_error="";
	{ 
		
		foreach ($errors as $error) { 
		$message_error .=$error."*";	
		} 
		 $error=str_ireplace('*',' \n',$message_error);
		echo "<script>alert(' $error ')</script>";
		echo "<script>window.open('my_account.php?edit_account','_self')</script>";
	} 
?>

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

حالا همه چیز برای تست عملی کدهای نوشته شده فراهم است. برای این منظور باز هم بر روی دکمه "ویرایش اطلاعات" از گزینه های سمت راست سایدبار ، کلیک کنید. به تصویر زیر نگاه کنید.

تست عملی کدهای نوشته شده، کلیک بر روی ویرایش اطلاعات

با کلیک کردن بر روی گزینه ی "ویرایش اطلاعات " تصویر زیر پیش روی شما قرار می گیرد.

تست عملی کدهای نوشته شده، صفحه ویرایش اطلاعات

حالا باید یک سری از اطلاعات را تغییر دهیم. به عنوان مثال من در تصویر زیر شماره تلفن، نام شهر و نام استان و آدرس را تغییر داده ام و سپس بر روی کلید به روز رسانی فشار بدهد.

تست عملی کدهای نوشته شده، تغییر دادن اطلاعات ورودی

حالا باید با تصویر زیر روبرو شوید. در اینجا پیام «موفقیت آمیز بودن عملیات بروزرسانی» به کاربر نمایش داده می شود.

تست عملی کدهای نوشته شده، پیام موفقیت آمیز بودن به روزرسانی

بعد از دیدن پیام اگر بر روی ok کلیک کنید، شما به تصویر زیر هدایت می شوید. در تصویر زیر مشاهده می نمایید که اطلاعات به صورت کامل بروز رسانی شده اند.

تست عملی کدهای نوشته شده، فیلدها به روز شده اند.

اما حالا یک عملیات خرابکارانه نیز انجام می دهم. در تصویر زیر من فیلدهای آدرس و تلفن را خالی می گذارم و بر روی دکمه بروزرسانی کلیک می کنم.

تست عملی کدهای نوشته شده است، ایجاد یک خطا در ورودی ها

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

تست عملی کدهای نوشته شده است، ایجاد یک پیام خطا

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

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

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

<?php
	// update USER
	if(isset($_POST['update'])) {
		// receive all input values from the form
		// form validation: ensure that the form is correctly filled ...
		// by adding (array_push()) corresponding error unto $errors array
		
		// receive name value from the form
		$c_name = mysqli_real_escape_string($con , $_POST['c_name']);
		if (empty($c_name)) { array_push($errors, "نام خود را وارد نکردید!"); }		
		
 		// receive lastname value from the form
		$c_lastname = mysqli_real_escape_string($con ,$_POST['c_lastname']);
		if (empty($c_lastname)) { array_push($errors, "نام خانوادگی خود را وارد نکردید!"); }
		
		// receive gender value from the form
		$c_gender = $_POST['c_gender'];
				
		// receive image value from the form and validation image value
		if (empty($_FILES["c_image"]["name"])) 
		{ 
			$new_address_image = $image; 
			}else{
			$Allowextension = array("jpeg" , "jpg" , "png");
			$FileExtension=explode(".",$_FILES["c_image"]["name"]);
			$extension=end($FileExtension);
			if(in_array($extension,$Allowextension )&&($_FILES["c_image"]["size"]<=20971520))
			{
				if($_FILES["c_image"]["error"]==0)
				{
					$c_image = $_FILES['c_image']['name'];
					$c_image_tmp = $_FILES['c_image']['tmp_name'];
					$new_address_image="customer/customer_images/".$c_image;
					move_uploaded_file($c_image_tmp,"customer_images/".$c_image);
					}else{
					array_push($errors, "فایل به درستی آپلود نشد!!!");	
				}
				}else{
				array_push($errors, "تصویر مناسب را انتخاب کنید! پسوند مجاز برای تصویر شامل jpeg و jpg و png می باشد و حجم آن نباید بیشتر از 2 مگابایت باشد!!!");
			}
		}
				
		// receive state value from the form
		$c_province = $_POST['state'];
				
		// receive city value from the form
		$c_city = $_POST['city'];
				
		// receive address value from the form
		$c_address = mysqli_real_escape_string($con ,$_POST['c_address']);
		if (empty($c_address)) { array_push($errors, "آدرس خود را وارد نکردید!"); }
		
		// receive phone value from the form and validation phone value
		$c_phone_validate=mysqli_real_escape_string($con ,$_POST['c_phone']);
		if (empty($c_phone_validate)) 
		{
			array_push($errors, "تلفن خود را وارد نکردید!"); 
			}else{
			if(preg_match("/^[0]{1}[9]{1}\d{9}$/", $c_phone_validate))
			{
				// phone is valid
				$c_phone=$c_phone_validate;
				}else{
				array_push($errors, "تلفنی که وارد کردید صحیح نمی باشد!!!");
			} 
		}
				
		// Finally, update user account if there are no errors in the form
		if (count($errors) == 0) {
			$upload_c = "UPDATE `customers` SET `customer_name`=N'$c_name',`customer_lastname`=N'$c_lastname',`customer_gender`=N'$c_gender',`customer_image`='$new_address_image',`customer_province`=N'$c_province',`customer_city`=N'$c_city',`customer_address`=N'$c_address' WHERE `customer_id`=$id ";
			$run_uplod = mysqli_query($con,"SET NAMES SET utf8");
			$run_uplod = mysqli_query($con,"SET CHARACTER SET utf8");
			$run_uplod = mysqli_query($con,$upload_c);
			
			if($run_uplod)
			{
				echo "<script>alert('$c_name عزیز ، اطلاعات شما به درستی به روز رسانی شد !')</script>";
				echo "<script>window.open('my_account.php?edit_account','_self')</script>";
			}
			}else{
			include('includes/errors.php');
		}		
	}
?>

فایل نهایی errors.php که در آدرس C:\wamp\www\ecommerce\customer\includes قرار دارد.

<?php  if (count($errors) > 0) 
	$message_error="";
	{ 
		
		foreach ($errors as $error) { 
		$message_error .=$error."*";	
		} 
		 $error=str_ireplace('*',' \n',$message_error);
		echo "<script>alert(' $error ')</script>";
		echo "<script>window.open('my_account.php?edit_account','_self')</script>";
	} 
?>

 

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

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

سجاد
03 اسفند 1398
سلام. ممنون برای مطالب خوبتون. در قسمت بروزرسانی ،شماره موبایل بروز نمی شود.

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

جهانگیر پچکم
09 اسفند 1398
سلام به سجاد عزیز دقت کنید ما در دستور شرطی زیر // receive phone value from the form and validation phone value $c_phone_validate=mysqli_real_escape_string($con ,$_POST['c_phone']); if (empty($c_phone_validate)) { array_push($errors, "تلفن خود را وارد نکردید!"); }else{ if(preg_match("/^[0]{1}[9]{1}\d{9}$/", $c_phone_validate)) { // phone is valid c_phone$=$c_phone_validate; }else{ array_push($errors, "تلفنی که وارد کردید صحیح نمی باشد!!!"); } } شماره تلفنی را که تغییر کرده می گیریم و در متغییر c_phone$ قرار می دیم، بعد این متغییر رو با استفاده از دستور sql زیر $upload_c = "UPDATE `customers` SET `customer_name`=N'$c_name',`customer_lastname`=N'$c_lastname',`customer_gender`=N'$c_gender',`customer_image`='$new_address_image',`customer_province`=N'$c_province',`customer_city`=N'$c_city',`customer_address`=N'$c_address' WHERE `customer_id`=$id "; به پایگاه داده منتقل می کنیم شما باید یکبار دیگه و با دقت این دو خط رو بررسی کنید. با تشکر، جهانگیر پچکم

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

دوست
20 مرداد 1398
سلام فیلد استان و شهر مقدار صفر قبول میکنه!

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

جهانگیر پچکم
24 مرداد 1398
سلام به شما دوست عزیز خب شما با یک شرط ساده می تونید اونو برطرف کنید

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