|
ازبین بردن یک جلسه
اگر می خواهید بعضی داده های جلسه را حذف کنید, می توانید تابع unset( ) یا session_destroy( ) را استفاده کنید.
تابع unset( ) برای آزادسازی متغیر جلسه تعیین شده استفاده می شود:
<?php
unset($_SESSION['views']);
?>
همچنین شما می توانید کل جلسه را به طور کامل با فراخوانی تابع session_destroy( ) از بین برد:
<?php
session_destroy();
?>
نکته: تابع session_destroy( ) جلسه تان را بازنشانی (صفر کردن متغیرها) می کند و شما کل داده های جلسه تان را از دست خواهید داد.
________________________________________________________
ارسال E-mail در php
Php به شما اجازه ی ارسال e-mail را مستقیما از یک script میدهد.
تابع mail( ) در php
تابع mail( ) برای ارسال email ها از درون یک script استفاده می شود.
نحو
mail(to,subject,message,headers,parameters)
|
پارامتر
|
توضیح
|
|
to
|
اجباری.دریافت کننده(ها)ی email را مشخص می کند
|
|
subject
|
اجباری.موضوع email را مشخص می کند.نکته: این پارامتر نمی تواند شامل کاراکترهای هر خط جدید باشد
|
|
message
|
اجباری.پیغام ارسالی را تعریف می کند.هر خط باید با یک enter (/n) (LF) جدا شود
|
|
headers
|
اختیاری. header های اضافی را مشخص می کندمثل cc,from و bcc . headerهای اضلفی باید با یک CRLF(\r\n) از هم جدا شوند
|
|
parameters
|
اختیاری. یک پارامتر اضافی برای برنامه ی ارسال mail مشخص می کند
|
نکته: برای اینکه توابع mail موجود باشند,php به یک سیستم email کارا و نصب شده نیاز دارد.برنامه برای استفاده شدن بوسیله ی تنظیمات پیکربندی درphp تعریف می شود.برای اطلاعات بیشتر بخش php mail reference را بخوانید.
E-mail ساده در php
ساده ترین راه برای ارسال یک email با php فرستادن یک email متنی است.
در مثال زیر ما ابتدا متغیر ها را اعلان می کنیم ($to,$subject,$message,$from,$headers),سپس متغیرها را در تابع mail( ) برای ارسال یک email استفاده می کنیم:
<?php
$to = "
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
";
$subject = "Test mail";
$message = "Hello! This is a simple email message.";
$from = "
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
";
$headers = "From: $from";
mail($to,$subject,$message,$headers);
echo "Mail Sent.";
?>
فرم mail
با php , می توانید یک فرم بازخورد روی وب سایتتان ایجاد کنید.مثال زیریک پیغام متنی را به یک آدرس e-mail مشخص شده می فرستد:
<html>
<body>
<?php
if (isset($_REQUEST['email']))
//if "email" is filled out, send email
{
//send email
$email = $_REQUEST['email'] ;
$subject = $_REQUEST['subject'] ;
$message = $_REQUEST['message'] ;
mail( "
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
", "Subject: $subject",
$message, "From: $email" );
echo "Thank you for using our mail form";
}
else
//if "email" is not filled out, display the form
{
echo "<form method='post' action='mailform.php'>
Email: <input name='email' type='text' /><br />
Subject: <input name='subject' type='text' /><br />
Message:<br />
<textarea name='message' rows='15' cols='40'>
</textarea><br />
<input type='submit' />
</form>";
}
?>
</body>
</html>
مثال بالا چه طور کار می کند:
· اول,بررسی می کند که آیا فیلد ورودی email پر شده است یا نه
· اگر پرنشده است(مثل وقتی که صفحه تازه دیده می شود); فرم HTML را نمایش می دهد
· اگر پر شده است( بعد از اینکه فرم پر شده); emailرا از فرم ارسال می کند
· وقتی دکمه submit پس از پر شدن فرم فشرده می شود, صفحه دوباره بار می شود,ورودی email تنظیم می شود و emailفرستاده می شود
نکته: این ساده ترین راه برای ارسال email است,اما ایمن نیست.در فصل بعد این آموزش شما می توانید بیشتر درمورد آسیب پذیری در scriptهای email بخوانید و اینکه چه طور ورودی کاربر را برای ایمن تر کردن آن معتبر کند.
منبع mailدر php
برای اطلاعات بیشتر درمورد توابع mail( ) در php به بخش php mail Referenceمراجعه کنید.
________________________________________________________
E-mailها در php
یک ضعف در اسکریپت e-mail فصل قبل وجود دارد.
تزریقات E-mail در php
ابتدا, به کد php فصل قبل نگاهی بیندازید:
<html>
<body>
<?php
if (isset($_REQUEST['email']))
//if "email" is filled out, send email
{
//send email
$email = $_REQUEST['email'] ;
$subject = $_REQUEST['subject'] ;
$message = $_REQUEST['message'] ;
mail("
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
", "Subject: $subject",
$message, "From: $email" );
echo "Thank you for using our mail form";
}
else
//if "email" is not filled out, display the form
{
echo "<form method='post' action='mailform.php'>
Email: <input name='email' type='text' /><br />
Subject: <input name='subject' type='text' /><br />
Message:<br />
<textarea name='message' rows='15' cols='40'>
</textarea><br />
<input type='submit' />
</form>";
}
?>
</body>
</html>
مشکل کد بالا این است که کاربران غیرمجاز می توانند ازطریق فرم ورودی درون header نامه داده درج کنند.
چه اتفاقی خواهد افتاد اگر کاربر متن زیر را به فیلد ورودی email در فرم اضافه کند؟
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
%0ACc:
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
%0ABcc:
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
,
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
,
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
,
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
%0ABTo:
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
تابع mail( ) طبق معمول متن را بالای header نامه قرار می دهد و اکنون header فیلدهای اضافی cc:,Bcc و ،to: را دارد.وقتی که کاربر بر روی دکمه submit کلیک می کند٫email به تمام آدرس های بالا ارسال خواهد شد!
متوقف کردن تزریقات E-mail در php
بهترین راه برای متوقف کردن تزریقات email معتبر کردن ورودی است.
کد زیر مانند کد فصل قبل است٫ اما حالا ما یک معتبرساز وروردی که فیلد email را در فرم چک می کند اضافه کرده ایم:
<html>
<body>
<?php
function spamcheck($field)
{
//filter_var() sanitizes the e-mail
//address using FILTER_SANITIZE_EMAIL
$field=filter_var($field, FILTER_SANITIZE_EMAIL);
//filter_var() validates the e-mail
//address using FILTER_VALIDATE_EMAIL
if(filter_var($field, FILTER_VALIDATE_EMAIL))
{
return TRUE;
}
else
{
return FALSE;
}
}
if (isset($_REQUEST['email']))
{//if "email" is filled out, proceed
//check if the email address is invalid
$mailcheck = spamcheck($_REQUEST['email']);
if ($mailcheck==FALSE)
{
echo "Invalid input";
}
else
{//send email
$email = $_REQUEST['email'] ;
$subject = $_REQUEST['subject'] ;
$message = $_REQUEST['message'] ;
mail("
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
", "Subject: $subject",
$message, "From: $email" );
echo "Thank you for using our mail form";
}
}
else
{//if "email" is not filled out, display the form
echo "<form method='post' action='mailform.php'>
Email: <input name='email' type='text' /><br />
Subject: <input name='subject' type='text' /><br />
Message:<br />
<textarea name='message' rows='15' cols='40'>
</textarea><br />
<input type='submit' />
</form>";
}
?>
</body>
</html>
در کد بالا ما فیلترهای php را برای معتبرسازی ورودی استفاده کرده ایم:
· فیلتر FILTER_SANITIZE_EMAIL تمام کاراکترهای غیرمجاز email را از رشته حذف می کند
· فیلتر FILTER_VALIDATE_EMAIL مقدار را به عنوان یک آدرس e-mail معتبر می کند
برای اطلاعات بیشتر درمورد فیلتر ها می توانید به بخش PHP Filter مراجعه کنید.
________________________________________________________
رفع خطا (Error) در php
رفع خطای پیش فرض در php بسیار ساده است.یک پیغام خطا همراه با نام فایل ٫شماره خط و یک پیغام که توضیح دهنده ی خطا است به مرورگر فرستاده می شود.
رفع خطا (Error) در php
هنگام ایجاد scriptها و درخواست نامه ای وب ٫رفع خطاها یک بخش مهم است.اگر کد شما امکان بررسی خطا را نداشته باشد٫برنامه شما بسیار غیرحرفه ای به نظر بیاید و شما در معرض خطر امنیتی قرار گیرید.
این آموزش بعضی روش های معمول بررسی خطا در php را شامل می شود.
ما روش های متفاوت خطایابی را نشان خواهیم داد:
· دستورات ساده ی "die( )"
· خطاهای معمول و محرک های خطا
· گزارش خطا
رفع خطای اسا سی: استفاده از تابع die( )
مثال اول یک script ساده را نشان می دهد که یک فایل متنی را باز می کند:
<?php
$file=fopen("welcome.txt","r");
?>
اگر فایل موجود نباشد این پیغام خطا را دریافت می کنید:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:\webfolder\test.php on line 2
برای اینکه کاربر با پیغام خطای بالا مواجه نشود٫قبل از اینکه سعی برای دسترسی به فایل داشته باشیم موجود بودن آن را بررسی می کنیم:
<?php
if(!file_exists("welcome.txt"))
{
die("File not found");
}
else
{
$file=fopen("welcome.txt","r");
}
?>
حالا اگر فایل موجود نباشد شما این پیغام را دریافت می کنید:
File not found
کد بالا کارامدتر از کد قبلی است٫چون ازیک مکانیزم رفع خطای ساده برای متوقف کردن script بعد از خطا استفاده می کند.
اما٫ متوقف کردن script به این سادگی همیشه هم راه درست نیست.بیایید نگاهی به توابع تناوبی رفع خطا در php بیندازیم.
ایجاد یک خطا رفع کن (error handler) معمولی
ایجاد یک خطا رفع کن (error handler) معمولی بسیار ساده ست.ما یک تابع خاص ایجا می کنیم که هرگاه خطایی در php رخ داد این تابع بتواند فراخوانی شود.
این تابع باید بتواند حداقل با دو پارامتر کار کند(سطح خطا و پیغام خطا)اما تا پنج پارامتر را بپذیرد(اختیاری: فایل٫شماره خط و متن پیغام):
نحو
error_function(error_level,error_message,
error_file,error_line,error_context)
|
پارامتر
|
توضیح
|
|
error_level
|
اجباری. سطح گزارش خطا را برای خطای تعریف شده توسط کاربر مشخص می کند.باید یک شماره مقدار باشد.جدول زیر را برای انواع سطوح گزارش خطا ببینید.
|
|
error_message
|
اجباری. پیغام خطا را برای خطای تعریف شده توسط کاربر مشخص می کند.
|
|
error_file
|
اختیاری. نام فایلی را که خطا در ان رخ داده است مشخص می کند.
|
|
error_line
|
اختیاری. شماره خطی را که خطا در آن رخ داده است مشخص می کند.
|
|
error_context
|
اختیاری. یک آرایه که شامل تمام متغیرهای در حال استفده هنگام رخداد خطا با مقادیرشان است را مشخص می کند.
|
سطوح گزارش خطا
این سطوح گزارش خطا انواع متفاوت خطا هستند.خطا رفع کن تعریف شده توسط کاربر می تواند برای موارد زیر به کار رود:
|
مقدار
|
ثابت
|
توضیح
|
|
2
|
E_WARNING
|
خطاهای زمان اجرا غیر جدی. اجرای script متوقف نمی شود
|
|
8
|
E_NOTICE
|
اخطارهای زمان اجرا.script چیزی پیدا کرده که ممکن است خطا باشد٫ اما می تواند در اجرای معمولی script نیز رخ دهد
|
|
256
|
E_USER_ERROR
|
خطای جدی کاربرساز.مانند یک E-ERROR که توسط کابر با استفاده از تابع trigger_error( ) در php به وجود می آید.
|
|
512
|
E_USER_WARNING
|
هشدار غیرجدی کاربرساز.مانند یک E_WARNING است که توسط کابر با استفاده از تابع trigger_error( ) در php به وجود می آید.
|
|
1024
|
E_USER_NOTICE
|
اخطار کاربرساز. مانند یک E_NOTICE است که توسط کابر با استفاده از تابع trigger_error( ) در php به وجود می آید.
|
|
4096
|
E_RECOVERABLE_ERROR
|
خطای جدی گرفتنی. مانند یک E_ERROR است اما بوسیله ی رفع خطای تعریف شده توسط کاربر می توان ان را گرفت(set_error_handler( ) را نیز ببینید)
|
|
8191
|
E_ALL
|
همه ی خطاها و هشدارها٫به جز سطح E_STRICT (E_STRICT در php 6.0 جزئی از E_ALL خواهد شد.
|
اکنون بیایید یک تابع برای رفع خطاها ایجاد کنیم:
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Ending Script";
die();
}
کد بالا یک تابع ساده ی رفع خطا است. وقتی که شروع (trig)می شود٫سطح خطا و پیغام خطا را می گیرد.سپس سطح خطا و پیغام را نمایش داده وscript را خاتمه می دهد.
حالا که ما یک تابع رفع خطا را ایجاد کرده ایم ٫ باید تصمیم بگیریم که چه زمانی شروع شود.
تنظیم خطارفع کن
خطا رفع کن پیش فرض php در خطارفع کن(error handler) ساخته شده است. ما می خواهیم یک تابع بالای خطارفع کن پیش فرض برای استمرار script بسازیم.
امکان تغییر خطارفع کن برای استفاده ی ان برای تنها چند خطا وجود دارد٫ که در آن صورت script می تواند به روش های متفاوت با خطاهای متفاوت رفتار کند.اما در این مثال ما می خواهیم خطارفع کن معمولی خود را برای همه ی خطاها به کار ببریم:
set_error_handler("customError");
چون ما خواستیم که تابع معملی مان همه ی خطاها را رفع کند٫ set_error_handler( ) تنها نیاز به یک پارامتر داشت٫یک پارامتر دوم می توانست برای مشخص کردن یک سطح خطا اضافه شود.
مثال
خطارفع کن را با امتحان چاپ کردن متغیری که وجود ندارد آزمایش می کنیم:
<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr";
}
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>
خروجی کد بالا باید چیزی مانند این باشد:
Custom error: [8] Undefined variable: test
راه اندازی یک خطا
در script ی که کاربران میتوانند داده وارد کنند بهتر است که موقع رخداد یک ورودی غیرمجاز خطاها را راه اندازی کنیم.در php ٫ این کار با تابع ٫ این کار با تابع trigger_error( ) انجام می شود.
مثال
در ایت مثال اگر متغیر "test" بزرگتر از "1" باشد ٫یک خطا رخ می دهد:
<?php
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below");
}
?>
خروجی کد بالا باید چیزی مانند این باشد:
Notice: Value must be 1 or below
in C:\webfolder\test.php on line 6
یک خطا می تواند هر جایی در script که بخواهید راه اندازی شود و با افزودن پارامتر ثانیه(second)٫ شما می توانید مشخص کنید که چه سطح خطایی راه اندازی شود.
انواع خطاهای ممکن:
· E_USER_ERROR – خطای زمان اجرا کاربرساز جدی. خطاهایی که نمی توانند بازیابی شوند.اجرای script متوقف خواهد شد.
· E_USER_WARNING – هشدار زمان اجرا کاربرساز غیرجدی.اجرای script متوقف نخواهد شد.
· E_USER_NOTICE – اخطار زمان اجرا کاربرساز پیش فرض. script چیزی پیدا کرده که ممکن است خطا باشد٫ اما می تواند در اجرای معمولی script نیز رخ دهد.
مثال
در این مثال یک هشدارE_USER_WARNING رخ می دهد اگر متغیر"test" بزرگتر از "1" باشد.اگر یک E_USER_WARNING رخ دهد ما خطارفع کن خود را استفده کرده و script را خاتمه می دهیم:
<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Ending Script";
die();
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
خروجی کد بالا باید چیزی مانند این باشد:
Error: [512] Value must be 1 or below
Ending Script
اکنون که طریقه ی ایجاد خطاهای خودمان وچگونگی راه اندازی آن ها را یاد گرفته ایم ٫بیایید نگاهی به واقعه نگاری خطاها بیندازیم.
واقعه نگاری خطاها
به طور پیش فرض٫ php یک گزارش خطا به سیستم واقعه نگاری سرورها یا یک فایل بسته به اینکه پیکر بندی گزارش خطا چگونه درفایل .ini php تنظیم شده است ارسال می کند.با استفاده از تابع error_log( ) شما می توانید گزارش های خطا را به به یک فایل مشخص شده یا یک مقصد دور ارسال کنید.
ارسال پیغام های خطاها به خودتان از طریق email می تواند روش خوبی برای آگاه شدن از خطاهای خاص باشد.
ارسال یک پیغام خطا از طریق E-mail
در این مثال ما یک e-mail را همراه با یک پیغام خطا خواهیم فرستاد و اگر یک خطای خاص رخ دهد٫ script خاتمه خواهد یافت:
<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Webmaster has been notified";
error_log("Error: [$errno] $errstr",1,
"
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
","From:
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
خروجی کد بالا باید چیزی مانند این باشد:
Error: [512] Value must be 1 or below
Webmaster has been notified
و نامه ی دریافتی از کد بالا به این شکل است:
Error: [512] Value must be 1 or below
این نباید برای همه ی خطاها استفاده شود.خطاهای معین باید با سیستم واقعه نگاری پیش فرض php در سرور ثبت شوند.
________________________________________________________
استثناگردانی در php
استثناها برای تغییر جریان عادی یک script در صورت رخداد یک خطای خاص استفاده می شوند
استثنا چیست
همراه با php 5 یک روش جدید شیء گرا برای کار با خطاها ارائه شد.
استثناگردانی برای تغییر جریان عادی اجرای کد در صورت رخداد یک شرط (استثنایی) خطا استفاده می شود.این شرط یک استثنا نامیده می شود.
آنچه که وقتی یک استثنا راه اندازی می شود به طورمعمول اتفاق می افتد :
· حالت کد فعلی ذخیره می شود
· اجرای کد به یک تابع ازپیش تعریف شده ی گرداننده ی استثنا (مرسوم) سویچ می شود
· بسته به موقعیت٫ گرداننده ممکن است اجرا را از کد ذخیره شده ازسر بگیرد٫ اجرای script را به پایان برساند یا از یک مکان متفاوت در کد ادامه دهد
ما روش های متفاوت رفع خطا را نشان خواهیم داد:
· استفاده اساسی از استثناها
· ایجاد یک گرداننده ی استثنای مرسوم
· استثناهای چندگانه
· پرتاب دوباره ی استثنا
· تعیین یک گرداننده ی استثنای سطح بالا
نکته: استثناها فقط باید در شرط های خطا استفاده شوند و نه برای پرش به جای دیگرکد در یک نقطه ی مشخص.
استفاده اساسی استثناها
زمانی که یک استثنا راه اندازی می شود٫ کد زیر اجرا نخواهد شد و php سعی به پیدا کردن بلاک تطابقی "catch" خواهد کرد.
اگر یک استثنا بدست نیاید ٫یک fatal error همراه با پیغام "Uncaught Exception" صادر خواهد شد.
بیایید یک استثنا را بدون گرفتن آن راه اندازی کنیم:
<?php
//create function with an exception
function checkNum($number)
{
if($number>1)
{
throw new Exception("Value must be 1 or below");
}
return true;
}
//trigger exception
checkNum(2);
?>
کد بالا این خطا را خواهد گرفت:
Fatal error: Uncaught exception 'Exception'
with message 'Value must be 1 or below' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6
امتحان٫راه اندازی(پرتاب) و گرفتن (اخذ)
برای جلوگیری از ایجاد خطا توسط مثال بالا٫ باید یک کد درست برای گرداندن یک استثنا ایجاد کنیم.
کد استثنای درست باید شامل موارد زیر باشد:
1. امتحان (try) - تابعی که یک استثنا را استفاده می کند باید در بلاک "try" باشد.اگر استثنا راه اندازی نشود٫ کد به طور معمول ادامه خواهد یافت.اما اگر استثنا راه اندازی شود٫ یک استثنا "پرتابthrown" شده است
2. پرتاب(throw) - یعنی چه طور یک استثنا را راه اندازی کنید. هر "throw" باید حداقل یک "catch" داشته باشد
3. گرفتن(catch) - بلاک "catch" یک استثنا را بازیابی می کند و یک شیء شامل اطلاعات استثنا ایجاد می کند
بیایید یک استثنا را با کد معتبر راه اندازی کنیم:
<?php
//create function with an exception
function checkNum($number)
{
if($number>1)
{
throw new Exception("Value must be 1 or below");
}
return true;
}
//trigger exception in a "try" block
try
{
checkNum(2);
//If the exception is thrown, this text will not be shown
echo 'If you see this, the number is 1 or below';
}
//catch exception
catch(Exception $e)
{
echo 'Message: ' .$e->getMessage();
}
?>
کد بالا این خطا را خواهد گرفت:
Message: Value must be 1 or below
توضیح مثال:
کد بالا یک استثنا را پرتاب و سپس آن را می گیرد:
1. تابع checkNum() ایجاد می شود وبررسی می کند که آیا یک عدد بزرگتر از 1 است.اگر بزرگتر باشد یک استثنا پرتاب می شود
2. تابع checkNum() در بلاک "try" فراخوانی می شود
3. تابع درون تابع checkNum() پرتاب می شود
4. بلاک"catch" استثنا را بازیابی می کند و یک شیء ($e) شامل اطلاعات استثنا ایجاد می کند
5. پیغام خطای استثنا با فراخوانی $e->getMessage() از شیء استثنا تولید می شود
اگرچه٫ یک راه برای نزدیک شدن به قانون "هر پرتاب باید یک گرفتن داشته باشد" تعیین یک گرداننده ی استثنا سطح بالا برای رفع خطاهای ازقلم افتاده است.
ایجاد یک کلاس استثنای مرسوم
ایجاد یک کلاس استثنای مرسوم بسیار ساده است. ما به سادگی یک کلاس خاص همراه با توابعی که بتوانند هنگام رخداد یک استثنا در php فراخوانی شوند٫ ایجاد می کنیم.کلاس باید یک تعمیم از کلاس استثنا باشد.
کلاس استثنا مرسوم خصوصیاتی را از کلاس استثنا php به ارث می برد و شما می تونید توابع مرسوم را به آن بیفزایید.
بیایید یک کلاس استثنا ایجاد کنیم:
<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
";
try
{
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
//throw exception if email is not valid
throw new customException($email);
}
}
catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}
?>
کلاس جدید یک کوپی از کلاس استثنا قبل همراه با تابع errorMessage() است.چون این کلاس یک کوپی از کلاس قبل است و خصوصیات و متدهایش را از کلاس قبل به ارث می برد٫ ما می توانیم متدهای کلاس استثنا را ازقبیل getMessage(),getFile() ,getLine() را استفاده کنیم.
توضیح مثال:
کد بالا یک استثنا را پرتاب می کند و آن را همراه با یک کلاس استثنا مرسوم می گیرد:
1. کلاس customException() به عنوان تعمیمی از کلاس قبلی ایجاد می شود است.دراین صورت این کلاس همه ی متدها وخصوصیات را از کلاس قبلی به ارث می برد
2. تابع errorMessage() ایجاد می شود.این تابع درصورتی که آدرس ایمیل نامعتبر باشد یک پیغام خطا برمی گرداند
3. متغیر $email برای رشته ای که آدرس ایمیل معتبری نیست٫ تنظیم می شود
4. بلاک"try" اجرا می شود و چون که آدرس ایمیل نامعتبر است٫ یک استثنا پرتاب می شود
5. بلاک"catch" استثنا را می گیرد و یک پیغام خطا نمایش می دهد
استثناهای چندگانه
این امکان برای یک script وجد دارد که استثناهای چندگانه را برای بررسی شرط های چندگانه استفاده کند.
امکان استفاده از چندین بلاک if…else ٫ یک switch یا استثناهای چندگانه ی بازگشتی وجود دارد.این استثناها می توانند کلاس های استثنای متفاوت و پیغام خطاهای متفاوتی را برگردانند:
<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
";
try
{
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
//throw exception if email is not valid
throw new customException($email);
}
//check for "example" in mail address
if(strpos($email, "example") !== FALSE)
{
throw new Exception("$email is an example e-mail");
}
}
catch (customException $e)
{
echo $e->errorMessage();
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
توضیح مثال:
کد بالا دو شرط را بررسی می کند و در صورتی که یکی از شرط ها مطابق شرایط نباشد یک استثنا پرتاب می کند:
1. کلاس customException() به عنوان تعمیمی از کلاس قبلی است.در این صورت تمام متدها و خصوصیاتش را از کلاس قبلی به ارث می برد
2. تابع errorMessage() ایجاد می شود.این تابع در صورت نامعتبر بودن آدرس ایمیل یک پیغام خطا برمی گرداند
3. متغیر $email برای رشته ای که یک آدرس ایمیل معتبراست٫ تنظیم می شود٫اما شامل رشته ی "example" است
4. بلاک"try" اجرا می شود و استثنایی روی شرط اول پرتاب نمی شود
5. شرط دوم چون که ایمیل شامل رشته ی "example" است یک استثنا را فراخوانی می کند
6. بلاک "catch" استثنا را می گیرد و پیغام خطای مناسب را نمایش می دهد
اگر هیچ اخذ customException ی وجود نداشت٫تنها اخذ استثنا پایه در آنجا به کار خواهد رفت
پرتاب دوباره ی استثناها
گاهی اوقات ٫ وقتی که استثنا پرتاب می شود٫ شما ممکن است بخواهید به طریقی متفاوت با شیوه ی استاندارد آن را به کار گیرید.می توان یک استثنا را برای بار دوم در بلاک "catch" پرتاب کرد.
یک script باید خطاهای سیسنمی را از دید کاربر پنهان کند.خطاهای سیستمی ممکن است برای برنامه نویس مهم باشند٫ اما کاربر علاقه ای به آن ها ندارد.برای اینکه کارها را برای کاربر راحت تر کنید شما می توانید استثنا را همراه با یک پیغام کاربرپسند بازپزتاب کنید:
<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = $this->getMessage().' is not a valid E-Mail address.';
return $errorMsg;
}
}
$email = "
آدرس ایمیل جهت جلوگیری از رباتهای هرزنامه محافظت شده اند، جهت مشاهده آنها شما نیاز به فعال ساختن جاوا اسکریپت دارید
";
try
{
try
{
//check for "example" in mail address
if(strpos($email, "example") !== FALSE)
{
//throw exception if email is not valid
throw new Exception($email);
}
}
catch(Exception $e)
{
//re-throw exception
throw new customException($email);
}
}
catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}
?>
توضیح مثال:
کد بالا بدین گونه عمل می کند که اگر رشته ی "example" در آدرس ایمیل بود٫ استثنا دوباره پرتاب شود:
1. کلاسcustomException() به عنوان تعمیمی از کلاس قبل ایجاد می شود.در این صورت تمام متدها و خصوصیاتش را از کلاس قبل به ارث می برد
2. تابع errorMessage() ایجاد می شود.این تابع در صورت نامعتبر بودن آدرس ایمیل یک پیغام خطا برمی گرداند
3. متغیر $email برای رشته ای که یک آدرس ایمیل معتبراست٫ تنظیم می شود٫اما شامل رشته ی "example" است
4. بلاک"try" شامل بلاک "try" دیگری است تا استثنا بتواند دوباره پرتاب شود
5. چون ایمیل حاوی رشته ی "example" است٫ استثنا راه اندازی می شود
6. بلاک "catch" استثنا را می گیرد و "customException" را بازپرتاب می کند
7. "customException" گرفته می شود و یک پیغام خطا نمایش داده می شود
اگر استثنا در بلاک "try" فعلی خود گرفته نشود ٫شروع به جستجوی یک بلاک catch در "سطوح بالاتر" خواهد کرد.
تعیین یک استثناگردان سطح بالا
تابعset_exception_handler() یک تابع کاربرنویس را برای کار با همه ی استثناهای اخذنشده تعیین می کند.
<?php
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>
خروجی کد بالا باید چیزی مانند این باشد:
Exception: Uncaught Exception occurred
در کد بالا هیچ بلاک "catch"ی وجود نداشت. درعوض استثناگردان سطح بالا راه اندازی شد.این تابع باید برای گرفتن استثناهای اخذ نشده استفاده شود.
قوانین استثناها
· ممکن است کد در یک بلاک try احاطه شده باشد تا در گرفتن استثناهای باالقوه کمک کند
· هر بلاک try یا throw باید حداقل یک بلاک catch متناظر داشته باشد
· بلاک های catch چندگانه می توانند برای گرفتن کلاس های متفاوت استثنا استفاده شوند
· استثناها می توانند در یک بلاک catch درون یک بلاک try پرتاب (یا بازپرتاب) شوند
یک قانون ساده: باید چیزی را که پرتاب می کنید پس بگیرید.
________________________________________________________
فیلتر(صافی) در php
فیلترها برای معتبرسازی و فیلتر کردن داده هایی که از منابع ناامن مانند ورودی کاربر می آیند٫ استفاده می شود.
فیلتر چیست؟
فیلترها برای معتبرسازی و فیلتر کردن داده هایی که از منابع ناامن می آیند٫ استفاده می شود.
آزمایش٫ معتبرسازی و فیلتر کردن ورودی کاربر و داده های معمول یک بخش مهم از هر درخواست وب است.
پسوند فیلترهای php برای سریع تر و آسان ترفیلتر کردن داده ها طراحی شده است.
چرا از فیلتر استفاده می شود؟
تقریبا همه ی درخواست های وب مربوط به ورودی خارجی است.که معمولا از یک کاربر یا درخواست دیگر (مثل یک سرویس وب)می آید. بااستفاده از فیلترها شما می توانید مطمئن باشید که درخواست شما نوع ورودی درست را دریافت می کند.
شما باید همیشه داده های خارجی را فیلتر کنید!
فیلتر ورودی یکی از مهمترین مسائل امنیت درخواست است.
داده ی خارجی چیست؟
· داده ی ورودی یک فرم
· Cookieها
· داده ی سرویس های وب
· متغیرهای سرور
· نتایج تقاضای (query) پایگاه داده
توابع و فیلترها
برای فیلترکردن یک متغیر٫یکی از توابع فیلتر زیر را استفاده کنید:
· Filter_var() – یک متغیر خاص را با یک فیلتر مخصوص فیلتر می کند
· Filter_var_array() – چندین متغیر را با همان فیلتر یا فیلترهای متفاوت فیلت می کند
· Filter_input – یک متغیر ورودی را می گیرد و آن را فیلتر می کند
· Filter_input_array – چندین متغیر ورودی را می گیرد و آن ها را با همان فیلتر یا با فیلترهای متفاوت فیلتر می کند
در مثال زیر٫ما یک داده ی integer را با استفاده از تابع filter_var() معتبر می کنیم:
<?php
$int = 123;
if(!filter_var($int, FILTER_VALIDATE_INT))
{
echo("Integer is not valid");
}
else
{
echo("Integer is valid");
}
?>
کد بالا فیلتر"FILTER_VALIDATE_INT" را برای فیلتر کردن متغیر استفاده می کند.چون integer معتبر است٫ خروجی کد بالا چنین خواهد بود:"integer is valid"
اگر ما این را با متغیری که integer نیست(مثل"123abc") امتحان کنیم٫خروجی چنین خواهد بود:"integer is not valid"
برای لیست کامل توابع و فیلترها به بخش PHP filter Reference مراجعه کنید.
معتبر واصولی( مطابق اصول عمل) کردن
دو نوع فیلتر وجود دارد:
فیلترهای معتبرسازی:
· برای معتبر کردن ورودی کاربر استفاده می شوند
· قوانین قالب بندی محض (مثل معتبرسازی URL یا E-Mail)
· درصورت موفقیت نوع مورد انتظار و درصورت شکست FALSE را برمی گرداند
فیلترهای اصولی:
· برای اینکه به کاراکترهای مشخص شده ای اجازه ی بودن در رشته را دهند یا ندهند
· وجود هیچ قانونی برای قالب بندی داده ها
· همیشه رشته را برمی گرداند
انتخاب ها و پرچم ها(option ها و flag ها)
Optionها و flagها برای اضافه کردن انتخاب های اضافی فیلترکردن به فیلترهای مشخص شده استفاده می شوند.
فیلترهای متفاوت optionها و flag های متفاوتی دارند.
در مثال زیر٫ ما یک integer را با استفاده ازfilter_var() و optionهای "min_range" و "max_range" معتبر می کنیم:
<?php
$var=300;
$int_options = array(
"options"=>array
(
"min_range"=>0,
"max_range"=>256
)
);
if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
{
echo("Integer is not valid");
}
else
{
echo("Integer is valid");
}
?>
مثل کد بالا٫ optionها باید در یک آرایه ی انجمنی با نام "options" قرار داده شوند.اگر یک flag استفاده می شود نیاز نیست که در آرایه قرار گیرد.
چون integer برابر با "300" است در محدوده ی مشخص شده نیست و خروجی کد بالا چنین خواهد بود:"Integer is not valid"
برای لیست کامل توابع و فیلترها به بخش PHP filter Reference مراجعه کنید.بررسی کنید چه optionها و flagهایی برای هر فیلتر وجود دارد.
ورودی را معتبر کنید
بیایید ورودی یک فرم را معتبر کنیم.
اولین کاری که باید انجام دهیم این است که مطمئن شویم که داده ای که ما به دنبال آن هستیم وجود دارد یا نه.
سپس داده ی ورودی را با استفاده از تابع filter_input() فیلتر می کنیم.
در مثال زیر٫ متغیر ورودی "email" به صفحه php فرستاده می شود:
<?php
if(!filter_has_var(INPUT_GET, "email"))
{
echo("Input type does not exist");
}
else
{
if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))
{
echo "E-Mail is not valid";
}
else
{
echo "E-Mail is valid";
}
}
?>
توضیح مثال:
مثال بالا یک ورودی(email) دارد که با استفاده از متد "GET" به آن ارسال شده است:
1. چک می کند که آیا متغیر ورودی "email" از نوع "GET" موجود هست
2. اگر متغیر ورودی وجود داشته باشد٫ چک می کند که آیا یک آدرس ایمیل معتبر هست یا نه
ورودی را اصولی کنید
بیایید پاکسازی یک URL ارسال شده از فرم را امتحان کنیم.
ابتدا مطمئن می شویم که داده ای که ما به دنبال آن هستیم وجود دارد یا نه.
سپس داده ی ورودی را با استفاده از تابع filter_input()اصولی می کنیم.
در مثال زیر٫ متغیر ورودی "URL" به صفحه php فرستاده می شود:
<?php
if(!filter_has_var(INPUT_POST, "url"))
{
echo("Input type does not exist");
}
else
{
$url = filter_input(INPUT_POST,
"url", FILTER_SANITIZE_URL);
}
?>
توضیح مثال:
مثال بالا یک ورودی(url) دارد که با استفاده از متد "POST" به آن ارسال شده است:
1. چک می کند که آیا متغیر ورودی "url" از نوع "POST" موجود هست
2. اگر متغیر ورودی وجود داشته باشد٫ آن را اصولی(کاراکترهای نامعتبر را کنار می گذارد) و در متغیر $url ذخیره می کند
اگر متغیر ورودی یک رشته مثل این باشد "http://www.W3ååSchøøools.com/" ٫متغیر $url بعد از اصولی سازی به این شکل خواهد بود:
http://www.W3Schools.com/
ورودی های چندگانه ی فیلتر
یک فرم تقریبا همیشه از بیش از یک فیلد ورودی تشکیل شده است.برای جلوگیری ازچندین بار فراخوانی توابع filter_var یا filter_input ٫ ما می توانیم توابع filter_var_array یا filter_input_array را استفاده کنیم.
در این مثال ما تابع filter_input_array() را برای فیلترکردن سه متغیر GET استفاده می کنیم.متغیرهای GET دریافتی یک نام ٫سن و آدرس ایمیل هستند:
<?php
$filters = array
(
"name" => array
(
"filter"=>FILTER_SANITIZE_STRING
),
"age" => array
(
"filter"=>FILTER_VALIDATE_INT,
"options"=>array
(
"min_range"=>1,
"max_range"=>120
)
),
"email"=> FILTER_VALIDATE_EMAIL,
);
$result = filter_input_array(INPUT_GET, $filters);
if (!$result["age"])
{
echo("Age must be a number between 1 and 120.<br />");
}
elseif(!$result["email"])
{
echo("E-Mail is not valid.<br />");
}
else
{
echo("User input is valid");
}
?>
توضیح مثال:
مثال بالا سه ورودی (name,age,email) دارد که با استفاده از متد "GET" به آن ارسال شده است:
1. یک آرایه شامل نام متغیرهای ورودی و فیلترهای مصرفی برای متغیرهای ورودی مشخص شده تعیین می کند
2. تابع filter_input_array() را همراه با متغیرهای ورودی GET و آرایه ای که ما تعیین کرده ایم فراخوانی می کند
3. متغیرهای "email"و "age" را برای ورودی های نامعتبر در متغیر$result چک می کند.(اگر هرکدام از متغیرهای ورودی نامعتبر باشند٫ آن متغیر ورودی پس از تابع filter_input_array() برابر با FALSE قرار خواهد گرفت)
پارامتر دوم تابع filter_input_array() می تواند یک آرایه یا یک شناسه فیلتر خاص باشد.
اگر پارامتر یک شناسه فیلتر خاص باشد تمام مقادیر در آرایه ی ورودی بوسیله ی فیلتر مشخص شده فیلتر می شوند.
اگر پارامتر یک آرایه است باید قواعد زیر را دنبال کند:
· باید یک آرایه ی انجمنی شامل یک متغیر ورودی به عنوان یک کلید آرایه ای باشد(مثل متغیر ورودی "age")
· مقدار آرایه باید یک شناسه فیلتر یا یک آرایه تعیین کننده ی فیلتر٫flagها و optionها باشد
استفاده از فراخوان برگردان(callback) فیلتر
امکان فراخوانی یک تابع کاربرنویس و استفاده از آن به عنوان یک فیلتر با استفاده از فیلتر FILTER_CALLBACK وجود دارد.با این کار٫ کنترل کامل فیلتر کردن داده ها را در دست داریم.
شما می توانید تابع تعریف شده ی خودتان را ایجاد کنید یا از یک تابع PHP موجود استفاده کنید
تابعی که شما می خواهید از آن برای فیلتر کردن استفاده کنید به همان روشی تعیین می شود که یک option تعیین می شود.در یک آرایه ی انجمنی با نام "option"
در مثال زیر٫ ما یک تابع ایجاد شده توسط کاربر را برای تبدیل همه ی "_" به خط فاصله استفاده می کنیم:
<?php
function convertSpace($string)
{
return str_replace("_", " ", $string);
}
$string = "Peter_is_a_great_guy!";
echo filter_var($string, FILTER_CALLBACK,
array("options"=>"convertSpace"));
?>
نتیجه ی کد بالا چیزی شبیه به این است:
Peter is a great guy!
توضیح مثال:
مثال بالا همه ی "_" را به خط فاصله تبدیل می کند:
1. یک تابع برای جایگزین کردن خط فاصه و "_" ایجاد می کند
2. تابع filter_var() را همراه با فیلتر FILTER_CALLBACK و یک آرایه شامل تابع مان فراخوانی می کند |