اگر از ابتدا تا این قسمت با ما همراه بوده اید، می دانید که ما به بحث امنیت در سایت رسیدیم و تگ های ورودی را یکی پس از دیگری بررسی کردیم و امروز تمرکز خودمان را بر روی اعتبار سنجی و ایجاد محدودیت های استاندارد بر روی تگ های ورودی آدرس و تلفن همراه قرار خواهیم داد. این قسمت حاوی نکات فوق العاده مهمی است که دقت و تمرکز شما را می طلبد بنابراین با حواس جمع، ادامه مطلب را مطالعه نمایید.
برای اعتبار سنجی در مورد آدرس کار بخصوصی لازم نیست انجام دهیم. کافی است؛ به آدرس C:\wamp\www\ecommerce\includes بروید و فایل server.php را با استفاده از Notepad++ باز و کدهای زیر را در آن پیدا کنید.
// receive city value from the form $c_city = $_POST['city']; if (empty($c_city)) { array_push($errors, "شهر خود را وارد نکردید!"); }
آنها را پاک کنید و به جای آنها کدهای زیر را قرار دهید.
// receive city value from the form $c_city = $_POST['city']; if (empty($c_city)) { array_push($errors, "شهر خود را وارد نکردید!"); } // receive address value from the form $c_address = mysqli_real_escape_string($con ,$_POST['c_address']); if (empty($c_address)) { array_push($errors, "آدرس خود را وارد نکردید!"); }
حالا wamp را روشن کنید و آدرس http://localhost/ecommerce/customer_register.php را در مروگر خود باز کنید.
با توجه به تصاویر زیر به صورت عملی کدهای نوشته شده را تست می کنیم.
حالا اگر بر روی دکمه "ایجاد نام کاربری " فشار دهید، تصویر زیر را خواهید دید.
اگر در مورد آدرس و توابع استفاده شده در آن مشکل دارید می توانید به این قسمت مراجعه نمایید.
حال می خواهیم به این موضوع بپردازیم که اگر کاربر شماره تلفن را به درستی وارد نکرد چه اتفاقی می افتد؟
در این اعتبارسنجی باید برای شماره موبایل یک قالب (pattern) یا الگو به وسیله ی عبارات با قاعده (Regular expressions) بنویسیم. مثلا همه ما می دانیم که شماره موبایل با 09 شروع می شود و تعداد ارقام به کار رفته در شماره موبایل 11 رقم می باشد.
در ادامه شما را با عبارات با قاعده (Regular expressions) و همچنین تابع preg_match() آشنا می کنم و با استفاده از آنها هر نوع اعتبار سنجی را با همدیگر انجام می دهیم.
دو نکته حائز اهمیت در مورد عبارات با قاعده وجود دارد:
زمانی که با قوانین نوشتن عبارات با قاعده در PHP آشنا شوید، به مرور زمان به کاربردها و نتایج جالبی که ایجاد می کند، پی می برید. پرداختن به عبارات با قاعده (Regular expressions) در این قسمت، تنها ذره ای از مطالب این مفهوم را در اختیار شما قرار می دهد، اما برای اینکه در مسیر آموختن این مطلب قرار بگیرید ، کافی است تکرار و تمرین و به تبع آن تحقیقات بیشتری انجام دهید.
عبارات با قاعده در PHP را می توان به صورت یک سیستم برای اعمال یک طرح یا قالب (pattern)، در نظر گرفت.
ابتدا شما این طرح یا قالب را ایجاد می نمایید و سپس با استفاده از یکی از توابع پیش ساخته PHP (در اینجا با استفاده از تابع preg_match)، آنرا به یک متن متناظر (match) می کنید (دقت کنید که عبارات با قاعده در PHP بیشتر در مورد رشته ها، به کار می روند). در ادامه ابتدا شما را با دو مفهوم الفاظ و فوق کاراکترها آشنا می کنم و در ادامه عبارت منظم مورد نیاز برای تشخیص شماره تلفن را با همدیگر می سازیم.
اولین دسته از کاراکترها، برای استفاده در طرحها، الفاظ (literals) می باشند. الفاط در حقیقت کاراکترهایی هستند که به همان صورت که نوشته می شوند، تفسیر می شوند. برای مثال، "a" تنها به حرف a متناظر می شود، و یا "ab" تنها به ab و به همین ترتیب.
فوق کاراکترها، در حقیقت سمبل های ویژه ای هستند، که دارای یک مفهوم و معنای خاص می باشند.
برای مثال اولین فوق کاراکتر، نقطه(.) می باشد که با هر کاراکتری متناظر می شود. بنابراین بر خلاف "a" که تنها به حرف a متناظر می شود. "." به هر یک از حروف مانند a، b، c و غیره متناظر می شود.
یک نکته جالب و مهم در مورد فوق کاراکترها این است که برای اشاره به خود فوق کاراکتر و استفاده از نمایش حقیقی این کاراکترها، باید از یک علامت بک اسلش (\) قبل از هر یک از آنها استفاده کنید.
از جمله فوق کاراکترهای دیگر ، سه فوق کاراکتر می باشند که با حالتهای مختلفی، متناظر می شوند. برای مثال، "*a" با هر تعداد (صفر و یا بیشتر) کاراکتر a متناظر می شود (a, aa , aaa , ...) و یا "+a" با تعداد یک یا بیشتر از یک کاراکتر a متناظر می شود (a,a... ولی حداقل یک a وجود داشته باشد)؛ "?a" با حداکثر یک a متناظر می شود (a و یا بدون a) در این مثالها می توانید کاراکتر a را با هر کاراکتر دیگری جایگزین کنید.
لیست زیر تقریبا تمام کاراکترهای ویژه که در عبارات با قاعده در PHP به کار می روند را نشان می دهد.
کاراکترهای ویژه برای عبارات با قاعده | |
کاراکتر | متناظر می شود با: |
. | هر کاراکتری |
a^ | رشته ای که با a شروع می شود. |
$a | رشته ای که به a ختم می شود. |
+a | حداقل یک a |
?a | صفر و یا یک a |
n\ | خط جدید |
t\ | tab |
\ | (برای escape) |
(ab) | گروه ab |
a/b | a و یا b |
{2}a | aa |
{1,3}a | a, aa , aaa |
[a-z] | حروف کوچک |
[A-Z] | حروف بزرگ |
[0-9] | ارقام |
حالا بعد از شناختی که از عبارات با قاعده در PHP پیدا کردیم به تعریف تابع preg_match می پردازیم.
این تابع دو پارامتر ورودی دارد، پارامتر اول همان عبارت منظمی است که ما آن را به عنوان یک الگو یا طرح می سازیم و دومین پارامتر هم رشته ای است که قصد داریم ببینیم که آیا با عبارت با قاعده، متناظر (match) می شود یا نه. به طور خلاصه به کمک این تابع میتوانیم یک رشته را بر اساس الگویی که نوشتیم بررسی کنیم که رشته مورد نظر ما هست یا خیر.
نحوی استفاده از این تابع به صورت زیر است
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
همانطور که مشاهده می کنید، این تابع ۵ پارامتر می گیرد. دقت کنید که ۲ تا از پارامترها باید هنگام تعریف تابع حتما وجود داشته باشند (اجباری هستند) و ۳ تای دیگر از این پارامترها حالت اختیاری دارند.
پارامترهای ورودی | توضیح |
string $pattern | این پارامتر همان الگوی ما است که با عبارات با قاعده ساخته می شود. این پارامتر اجباری است. |
string $subject [ | این پارامتر همان عبارتی است که باید در آن به جست و جو الگو پرداخت. این پارامتر اجباری است. |
array &$matches [ | این پارامتر، جست و جوی های پیدا شده را درون خودش نگهداری می کند.این پارامتر اختیاری است. |
int $flags = 0 [ | این پارامتر اختیاری است. این پارامتر اگر مقدار دهی شود، برای هر جست و جوی یافت شده، عبارت آفست رو بر میگرداند. این پارامتر دو مقدار زیر را می تواند انتخاب کند.PREG_OFFSET_CAPTURE و PREG_UNMATCHED_AS_NULL |
int $offset = 0 | با استفاده از این پارامتر می توانید بگویید که جست و جو را از کجای رشته شروع کند (پیش فرض از اول رشته شروع می کنه). این پارامتر اختیاری است. |
دقت کنید که خروجی این تابع یا 0 می شود و یا 1 و یا FALSE.
یک نکته بسیار مهم این است که همواره از عملگر === برای تست مقدار بازگشتی این تابع استفاده کنید.
حالا که با دو مفهوم عبارات با قاعده در PHP و تابع preg_match آشنا شدیم، اجازه بدهید در یک مثال عملی نحوی به دست آوردن شماره موبایل دلخواه را با همدیگر مشاهده نماییم.
به آدرس C:\wamp\www\ecommerce\includes بروید و فایل server.php را با استفاده از Notepad++ باز کرده و کدهای زیر را در آن پیدا کنید.
// receive address value from the form $c_address = mysqli_real_escape_string($con ,$_POST['c_address']); if (empty($c_address)) { array_push($errors, "آدرس خود را وارد نکردید!"); }
آنها را پاک کنید و کدهای زیر را به جای آنها قرار دهید.
// 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, "تلفنی که وارد کردید صحیح نمی باشد!!!"); } }
همانطور که در کدهای بالا مشاهده می کنید، در قسمتی که شرط را آورده ایم (به کدهای زیر دقت کنید):
if(preg_match("/^[0]{1}[9]{1}\d{9}$/", $c_phone_validate))
از تابع preg_match استفاده شده است که دو پارامتر را به آن پاس داده ایم یکی عبارت با قاعده /^[0]{1}[9]{1}\d{9}$/
می باشد و دومین پارامتر تلفن وارد شده توسط کاربر است.
عبارت با قاعده استفاده شده به این صورت تفسیر می شود که
با توجه به توضیحات بالا تابع preg_match بررسی می کند که آیا شماره موبایل وارد شده با الگوی تعریف شده توسط ما(*********09) مطابقت دارد یا خیر؟
حالا با همدیگر به صورت عملی برنامه ای را که نوشته ایم چک می کنیم. به تصاویر زیر نگاه کنید. ابتدا هیچ شماره موبایلی وارد نمی کنیم:
در تصویر زیر مشاهده می کنید که وب سایت چه واکنشی از خودش نشان می دهد.
در حالت دوم سعی می کنیم یک شماره تلفن اشتباه را وارد کنیم.
در تصویر زیر مشاهده می کنید که نرم افزار ما به راحتی شماره موبایل اشتباه را تشخیص داده و پیام مناسب را به کاربر می دهد.
خب دوستان عزیز در پایان برای شما فایل نهایی server.php را قرار داده ام تا کل کدهای این فایل را تا این لحظه مشاهده نمایید.
<?php include('db.php'); // initializing variables $c_name = ""; $c_lastname = ""; $c_email = ""; $c_address = ""; $c_phone = ""; $c_password_1 = ""; $errors = array(); // REGISTER USER if(isset($_POST['register'])) { // 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']; if (empty($c_gender)) { array_push($errors, "جنسیت خود را انتخاب نکردید!"); } // receive image value from the form and validation image value if (empty($_FILES["c_image"]["name"])) { array_push($errors, "تصویر خود را انتخاب کنید!"); }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,$new_address_image); }else{ array_push($errors, "فایل به درستی آپلود نشد!!!"); } }else{ array_push($errors, "تصویر مناسب را انتخاب کنید! پسوند مجاز برای تصویر شامل jpeg و jpg و png می باشد و حجم آن نباید بیشتر از 2 مگابایت باشد!!!"); } } // receive email value from the form and validation email value $c_email_no_empty = mysqli_real_escape_string($con ,$_POST['c_email']); if (empty($c_email_no_empty)) { array_push($errors, "ایمیل خود را وارد کنید!"); }else{ $c_email_validate=$c_email_no_empty; if(filter_var($c_email_validate,FILTER_VALIDATE_EMAIL) == true){ $c_email=$c_email_validate; }else{ array_push($errors, "ایمیل نادرستی وارد کرده اید!!! ایمیل درستی وارد کنید."); } } // receive state value from the form $c_province = $_POST['state']; if (empty($c_province)) { array_push($errors, "استان خود را وارد نکردید!"); } // receive city value from the form $c_city = $_POST['city']; if (empty($c_city)) { array_push($errors, "شهر خود را وارد نکردید!"); } // 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 رسیدیم، انشاالله که لذت کافی رو از کدهای نوشته شده، برده باشید. در قسمت آینده به سراغ ورودی پسورد می رویم. اعتبار سنجی ورودی پسورد هم مانند ورودی شماره تلفن است اما با شرایط ویژه ی خودش (قسمت آینده عبارات با قاعده پیچیده تری را خواهم داشت). موفق باشید
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.