–
۲۹. کوکی ها
کوکی چیست؟
ساخت کوکی با PHP
setcookie(name, value, expire, path, domain, secure, httponly);
ایجاد/بازیابی یک کوکی
<!DOCTYPE html>
<?php
$cookie_name = "user";
$cookie_value = "John Doe";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day
?>
<html>
<body>
<?php
if(!isset($_COOKIE[$cookie_name])) {
echo "Cookie named '" . $cookie_name . "' is not set!";
} else {
echo "Cookie '" . $cookie_name . "' is set!<br>";
echo "Value is: " . $_COOKIE[$cookie_name];
}
?>
<p><strong>Note:</strong> You might have to reload the page to see the value of the cookie.</p>
</body>
</html>

Cookie named ‘user’ is not set!
Note: You might have to reload the page to see the value of the cookie.
توجه: تابع ()setcookie باید قبل از تگ <html> آورده شود.
تغییر مقدار کوکی
<?php
$cookie_name = "user";
$cookie_value = "Alex Porter";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/");
?>
<html>
<body>
<?php
if(!isset($_COOKIE[$cookie_name])) {
echo "Cookie named '" . $cookie_name . "' is not set!";
} else {
echo "Cookie '" . $cookie_name . "' is set!<br>";
echo "Value is: " . $_COOKIE[$cookie_name];
}
?>
</body>
</html>

Cookie named ‘user’ is not set!
توجه: باید صفحه را دوباره بارگیری کنید تا مقدار جدید کوکی را ببینید.
حذف یک کوکی
<?php
// set the expiration date to one hour ago
setcookie("user", "", time() - 3600);
?>
<html>
<body>
<?php
echo "Cookie 'user' is deleted.";
?>
</body>
</html>

Cookie ‘user’ is deleted.
بررسی کنید که آیا کوکی ها فعال هستند یا خیر
<?php
setcookie("test_cookie", "test", time() + 3600, '/');
?>
<html>
<body>
<?php
if(count($_COOKIE) > 0) {
echo "Cookies are enabled.";
} else {
echo "Cookies are disabled.";
}
?>
</body>
</html>

Cookies are enabled.
–
۳۰. Session ها
Session چیست؟
نکته: اگر به یک حافظه دائمی نیاز دارید، ممکن است بخواهید داده ها را در یک پایگاه داده ذخیره کنید.
شروع یک Session
<?php
// Start the session
session_start();
?>
<!DOCTYPE html>
<html>
<body>
<?php
// Set session variables
$_SESSION["favcolor"] = "green";
$_SESSION["favanimal"] = "cat";
echo "Session variables are set.";
?>
</body>
</html>

Session variables are set.
توجه: تابع ()session_start باید اولین چیز در سند شما باشد. قبل از هر تگ HTML
مقادیر متغیر Session را دریافت کنید
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>
<?php
// Echo session variables that were set on previous page
echo "Favorite color is " . $_SESSION["favcolor"] . ".<br>";
echo "Favorite animal is " . $_SESSION["favanimal"] . ".";
?>
</body>
</html>

Favorite color is green.
Favorite animal is cat.
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>
<?php
print_r($_SESSION);
?>
</body>
</html>

Array ( [favcolor] => green [favanimal] => cat )
چگونه کار می کند؟ از کجا میداند من هستم؟
اکثر session ها یک user-key در رایانه کاربر تنظیم می کنند که چیزی شبیه به این است: 765487cf34ert8dede5a562e4f3a7e12. سپس، هنگامی که یک session در صفحه دیگری باز می شود، کامپیوتر را برای یافتن user-key اسکن می کند. اگر مطابقت وجود داشته باشد، به آن session دسترسی پیدا می کند، اگر نه، session جدیدی را شروع می کند.
تغییر یک متغیر session
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>
<?php
// to change a session variable, just overwrite it
$_SESSION["favcolor"] = "yellow";
print_r($_SESSION);
?>
</body>
</html>

Array ( [favcolor] => yellow [favanimal] => cat )
از بین بردن یک session
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>
<?php
// remove all session variables
session_unset();
// destroy the session
session_destroy();
echo "All session variables are now removed, and the session is destroyed."
?>
</body>
</html>

All session variables are now removed, and the session is destroyed.
–
۳۱. فیلترها
<table>
<tr>
<td>Filter Name</td>
<td>Filter ID</td>
</tr>
<?php
foreach (filter_list() as $id =>$filter) {
echo '<tr><td>' . $filter . '</td><td>' . filter_id($filter) . '</td></tr>';
}
?>
</table>

Filter Name | Filter ID |
int | 257 |
boolean | 258 |
float | 259 |
validate_regexp | 272 |
validate_domain | 277 |
validate_url | 273 |
validate_email | 274 |
validate_ip | 275 |
validate_mac | 276 |
string | 513 |
stripped | 513 |
encoded | 514 |
special_chars | 515 |
full_special_chars | 522 |
unsafe_raw | 516 |
517 | |
url | 518 |
number_int | 519 |
number_float | 520 |
add_slashes | 523 |
callback | 1024 |
چرا از فیلترها استفاده کنیم؟
-
ورودی کاربر از یک فرم
- کوکی ها
-
داده های وب سرویس
- متغیرهای سرور
-
نتایج پرس و جو پایگاه داده
همیشه باید داده های خارجی را تأیید کنید!
داده های ارسالی نامعتبر می تواند منجر به مشکلات امنیتی و خرابی صفحه وب شما شود!
با استفاده از فیلترهای PHP می توانید مطمئن شوید که برنامه شما ورودی صحیح را دریافت می کند!
تابع ()filter_var
-
متغیری که می خواهید بررسی کنید
-
نوع چک مورد استفاده
پاکسازی یک رشته متنی
<?php
$str = "<h1>Hello World!</h1>";
$newstr = filter_var($str, FILTER_SANITIZE_STRING);
echo $newstr;
?>

Hello World!
اعتبار سنجی یک عدد صحیح
<?php
$int = 100;
if (!filter_var($int, FILTER_VALIDATE_INT) === false) {
echo("Integer is valid");
} else {
echo("Integer is not valid");
}
?>

Integer is valid
نکته: ()filter_var و مشکل با 0
<?php
$int = 0;
if (filter_var($int, FILTER_VALIDATE_INT) === 0 || !filter_var($int, FILTER_VALIDATE_INT) === false) {
echo("Integer is valid");
} else {
echo("Integer is not valid");
}
?>

Integer is valid
اعتبارسنجی یک آدرس IP
<?php
$ip = "127.0.0.1";
if (!filter_var($ip, FILTER_VALIDATE_IP) === false) {
echo("$ip is a valid IP address");
} else {
echo("$ip is not a valid IP address");
}
?>

127.0.0.1 is a valid IP address
پاکسازی و اعتبارسنجی یک آدرس ایمیل
<?php
$email = "john.doe@example.com";
// Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
// Validate e-mail
if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
echo("$email is a valid email address");
} else {
echo("$email is not a valid email address");
}
?>

john.doe@example.com is a valid email address
پاکسازی و اعتبارسنجی یک URL
<?php
$url = "https://www.raiatec.com";
// Remove all illegal characters from a url
$url = filter_var($url, FILTER_SANITIZE_URL);
// Validate url
if (!filter_var($url, FILTER_VALIDATE_URL) === false) {
echo("$url is a valid URL");
} else {
echo("$url is not a valid URL");
}
?>

https://www.raiatec.com is a valid URL
–
۳۲. فیلترهای پیشرفته PHP
اعتبار سنجی یک عدد صحیح در محدوده
<?php
$int = 122;
$min = 1;
$max = 200;
if (filter_var($int, FILTER_VALIDATE_INT, array("options" => array("min_range"=>$min, "max_range"=>$max))) === false) {
echo("Variable value is not within the legal range");
} else {
echo("Variable value is within the legal range");
}
?>

Variable value is within the legal range
اعتبارسنجی یک آدرس IPV6
<?php
$ip = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";
if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
echo("$ip is a valid IPv6 address");
} else {
echo("$ip is not a valid IPv6 address");
}
?>

2001:0db8:85a3:08d3:1319:8a2e:0370:7334 is a valid IPv6 address
اعتبارسنجی URL – باید حاوی QueryString باشد
<?php
$url = "https://www.raiatec.com";
if (!filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED) === false) {
echo("$url is a valid URL with a query string");
} else {
echo("$url is not a valid URL with a query string");
}
?>

https://www.raiatec.com is not a valid URL with a query string
حذف کاراکترهایی با مقدار ASCII بزرگتر از 127
<?php
$str = "<h1>Hello WorldÆØÅ!</h1>";
$newstr = filter_var($str, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
echo $newstr;
?>

Hello World!
–
۳۳. توابع Callback
مثال:
<?php
function my_callback($item) {
return strlen($item);
}
$strings = ["apple", "orange", "banana", "coconut"];
$lengths = array_map("my_callback", $strings);
print_r($lengths);
?>

Array ( [0] => 5 [1] => 6 [2] => 6 [3] => 7 )
از 7 PHP به بعد می توانید توابع ناشناس را به عنوان توابع callback ارسال کنید.
<?php
$strings = ["apple", "orange", "banana", "coconut"];
$lengths = array_map( function($item) { return strlen($item); } , $strings);
print_r($lengths);
?>

Array ( [0] => 5 [1] => 6 [2] => 6 [3] => 7 )
callback در توابع تعریف شده توسط کاربر
<?php
function exclaim($str) {
return $str . "! ";
}
function ask($str) {
return $str . "? ";
}
function printFormatted($str, $format) {
// Calling the $format callback function
echo $format($str);
}
// Pass "exclaim" and "ask" as callback functions to printFormatted()
printFormatted("Hello world", "exclaim");
printFormatted("Hello world", "ask");
?>

Hello world! Hello world?
–
۳۴. PHP و JSON
JSON چیست؟
- ()json_encode
- ()json_decode
تابع ()json_encode
<?php
$age = array("Peter"=>35, "Ben"=>37, "Joe"=>43);
echo json_encode($age);
?>

{“Peter”:35,”Ben”:37,”Joe”:43}
مثال۲:
این مثال نحوه کدگذاری یک آرایه نمایه شده را در یک آرایه JSON نشان می دهد:
<?php
$cars = array("Volvo", "BMW", "Toyota");
echo json_encode($cars);
?>

[“Volvo”,”BMW”,”Toyota”]
تابع ()json_decode
مثال۱:
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';
var_dump(json_decode($jsonobj));
?>

object(stdClass)#1 (3) { [“Peter”]=> int(35) [“Ben”]=> int(37) [“Joe”]=> int(43) }
مثال۲:
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';
var_dump(json_decode($jsonobj, true));
?>

array(3) { [“Peter”]=> int(35) [“Ben”]=> int(37) [“Joe”]=> int(43) }
دسترسی به مقادیر رمزگشایی شده
مثال۱:
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';
$obj = json_decode($jsonobj);
echo $obj->Peter;
echo $obj->Ben;
echo $obj->Joe;
?>

353743
مثال۲:
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';
$arr = json_decode($jsonobj, true);
echo $arr["Peter"];
echo $arr["Ben"];
echo $arr["Joe"];
?>

353743
حلقه زدن از طریق مقدارها
مثال۱:
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';
$obj = json_decode($jsonobj);
foreach($obj as $key => $value) {
echo $key . " => " . $value . "<br>";
}
?>

Peter => 35
Ben => 37
Joe => 43
مثال۲:
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';
$arr = json_decode($jsonobj, true);
foreach($arr as $key => $value) {
echo $key . " => " . $value . "<br>";
}
?>

Peter => 35
Ben => 37
Joe => 43
–
۳۵. استثناها در PHP
- یک استثنا شیئی است که خطا یا رفتار غیرمنتظره یک اسکریپت PHP را توصیف می کند.
- استثنائات توسط بسیاری از توابع و کلاس های PHP ایجاد می شود.
- توابع و کلاس های تعریف شده توسط کاربر نیز می توانند استثناء ایجاد کنند.
- استثناها راه خوبی برای متوقف کردن یک تابع در هنگام برخورد با داده هایی است که نمی تواند از آنها استفاده کند.
پرتاب یک استثنا
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
echo divide(5, 0);
?>

Fatal error: Uncaught Exception: Division by zero in C:\xampp\htdocs\phptest.com\public_html\index.php:8 Stack trace: #0 C:\xampp\htdocs\phptest.com\public_html\index.php(13): divide(5, 0) #1 {main} thrown in C:\xampp\htdocs\phptest.com\public_html\index.php on line 8
دستور try…catch
try {
code that can throw exceptions
} catch(Exception $e) {
code that runs when an exception is caught
}
مثال:
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $e) {
echo "Unable to divide.";
}
?>

Unable to divide.
try…catch…finally
try {
code that can throw exceptions
} catch(Exception $e) {
code that runs when an exception is caught
} finally {
code that always runs regardless of whether an exception was caught
}
مثال۱:
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $e) {
echo "Unable to divide. ";
} finally {
echo "Process complete.";
}
?>

Unable to divide. Process complete.
مثال۲:
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} finally {
echo "Process complete.";
}
?>

Process complete.
شیء استثنا
new Exception(message, code, previous)
مقادیر پارامترها
پارامتر | توضیح |
message |
اختیاری. رشته ای که توضیح می دهد چرا استثنا پرتاب شده است
|
code |
اختیاری. یک عدد صحیح که می تواند برای تشخیص آسان این استثنا از سایر موارد مشابه استفاده شود
|
previous |
اختیاری. اگر این استثنا در یک بلوک catch یک استثنا دیگر پرتاب شده باشد، توصیه می شود آن استثنا را به این پارامتر منتقل کنید
|
متدها:
متد | شرح |
getMessage() |
رشته ای را برمی گرداند که توضیح می دهد چرا استثنا پرتاب شده است
|
getPrevious() |
اگر این استثنا توسط یکی دیگر راه اندازی شده باشد، این روش استثنا قبلی را برمی گرداند. اگر نه، آنگاه null برمیگرداند
|
getCode() |
کد استثنا را برمی گرداند
|
getFile() |
مسیر کامل فایلی که استثنا در آن پرتاب شده را برمی گرداند
|
getLine() |
شماره خط خط کدی را که استثنا را ایجاد کرده است برمیگرداند
|
مثال:
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero", 1);
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $ex) {
$code = $ex->getCode();
$message = $ex->getMessage();
$file = $ex->getFile();
$line = $ex->getLine();
echo "Exception thrown in $file on line $line: [Code $code]
$message";
}
?>

Exception thrown in C:\xampp\htdocs\phptest.com\public_html\index.php on line 4: [Code 1] Division by zero
منبع:
w3schools.com