در قسمت گذشته، با هم دیگر در راستای تکمیل پروفایل کاربر قدم هایی برداشتیم و از این رهگذر به تکمیل فرایند “ویرایش اطلاعات” رسیدیم. همانطور که مشاهده نمودید، هنگامی که کاربر، بر روی گزینه “ویرایش اطلاعات” در سایدبار سمت راست ، فشار می دهد، یک فرم ورود اطلاعات برای او در سایدبار سمت چپ باز می شود. که من برای یادآوری بهتر، تصویر زیر را (این تصویر در واقع، خلاصه اقداماتی است که ما در قسمت قبل انجام دادیم.) آماده نموده ام.
هدف این قسمت
خب، حالا که مروری کلی بر آنچه در قسمت گذشته اتفاق افتاد را انجام دادیم، برویم به سراغ بحث شیرین این قسمت. در این قسمت به پردازش اطلاعات ورودی فرم می پردازیم و کدنویسی های لازم برای بروزرسانی اطلاعات کاربر را انجام خواهیم داد.
به طور کلی، منظور من این است که هدف در اینجا نوشتن یک دستور 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'];
جواب این سوال واضح است، چون در اینجا، کاربر باید مقدار را حتما انتخاب کند، زیرا هر کدام از متغییرهای بالا با استفاده از مقادیر پر می شوند. کاربر مجبور است یک مقدار انتخاب کند (اگر هم مقداری را انتخاب نکند، همان مقدار پیش فرض در نظر گرفته می شود). به تصاویر زیر نگاه کنید.
- چرا مقدار ایمیل را نمی شود تغییر داد؟ دقت نمایید که ایمیل تنها راه شناسایی کاربر است. اگر به هر دلیلی ایمیل را دستکاری کنیم، ممکن است اطلاعات مهم دیگری همچون فاکتور فروش مشتری نیز از دست بدهیم و در ادامه ارتباط بین جداول داده ایی که به واسطه ایمیل برقرار شده است، از بین برود.
- چرا مقدار پسورد را تغییر ندادیم؟ دقت کنید که در جلسات آینده همین کار را انجام خواهیم داد. توجه شما را به سایدبار سمت راست و گزینه ” تغییر رمز عبور ” جلب می کنم. من قصد دارم به صورت مجزا به تغییر رمز عبور بپردازم. پس نگران نباشید؛ حتما این امکان را نیز برای کاربر ایجاد خواهیم نمود. به تصویر زیر نگاه کنید.
حالا که به بعضی از سوالات پیش آمده، پاسخ دادم؛ می رویم سراغ ادامه توضیح کد. در ادامه کدهای فایل 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>"; } ?>