–
۲۰. متغیرهای جهانی Superglobals
- GLOBALS$
- SERVER_$
- REQUEST_$
- POST_$
- GET_$
- FILES_$
- ENV_$
- COOKIE_$
- SESSION_$
GLOBALS$
<?php
$x = 75;
$y = 25;
function addition() {
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addition();
echo $z;
?>

100
SERVER_$
<!DOCTYPE html>
<html>
<body>
<?php
echo $_SERVER['PHP_SELF'];
echo "<br>";
echo $_SERVER['SERVER_NAME'];
echo "<br>";
echo $_SERVER['HTTP_HOST'];
echo "<br>";
echo $_SERVER['HTTP_REFERER'];
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];
?>
</body>
</html>

/phptest.com/public_html/index.php
PhpStorm 2021.3
localhost:63342
Warning: Undefined array key “HTTP_REFERER” in C:\xampp\htdocs\phptest.com\public_html\index.php on line 13
Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36
/phptest.com/public_html/index.php
REQUEST_$
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// collect value of input field
$name = $_REQUEST['fname'];
if (empty($name)) {
echo "Name is empty";
} else {
echo $name;
}
}
?>
</body>
</html>

Name:
POST_$
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// collect value of input field
$name = $_POST['fname'];
if (empty($name)) {
echo "Name is empty";
} else {
echo $name;
}
}
?>
</body>
</html>

Name:
GET_$
<html>
<body>
<a href="test_get.php?subject=PHP&web=W3schools.com">Test $GET</a>
</body>
</html>
<html>
<body>
<?php
echo "Study " . $_GET['subject'] . " at " . $_GET['web'];
?>
</body>
</html>
–
۲۱. عبارات با قاعده
سینتکس:
$exp = "/raiatec/i";
- جداکننده ( delimiter ) می تواند هر کاراکتری باشد بجز حرف، عدد، بک اسلش و فاصله. متداول ترین جداکننده، اسلش (/) است، اما زمانی که الگوی شما حاوی اسلش است، از جداکننده های دیگر مانند # یا ~ استفاده می شود.
توابع عبارات با قاعده
تابع | شرح |
()preg_match |
اگر الگو در رشته پیدا شد 1 و در غیر این صورت 0 برمی گرداند
|
()preg_match_all |
تعداد دفعاتی که الگو در رشته پیدا شده است را برمیگرداند که ممکن است 0 نیز باشد
|
()preg_replace |
یک رشته جدید را برمیگرداند که در آن الگوهای همسان با رشته دیگری جایگزین شدهاند
|
()preg_match
<?php
$str = "Visit Raiatec";
$pattern = "/raiatec/i";
echo preg_match($pattern, $str); // Outputs 1
?>

1
()preg_match_all
مثال:
<?php
$str = "The rain in SPAIN falls mainly on the plains.";
$pattern = "/ain/i";
echo preg_match_all($pattern, $str);
?>

4
()preg_replace
مثال:
<?php
$str = "Visit Microsoft!";
$pattern = "/microsoft/i";
echo preg_replace($pattern, "W3Schools", $str);
?>

Visit W3Schools!
اصلاح کننده ها ( Modifiers ) در عبارات باقاعده
Modifiers | شرح |
i |
جستجوی غیر حساس به حروف بزرگ را انجام می دهد
|
m |
جستجوی چند خطی را انجام می دهد (الگوهایی که ابتدا یا انتهای یک رشته را جستجو می کنند با ابتدا یا انتهای هر خط مطابقت دارند)
|
u |
تطابق صحیح الگوهای رمزگذاری شده UTF-8 را فعال می کند
|
الگوهای عبارات باقاعده
عبارت | شرح |
[abc] |
یک کاراکتر از گزینه های بین پرانتز را پیدا می کند
|
[^abc] |
هر کاراکتری را که بین پرانتزها نباشد را پیدا می کند
|
[0-9] |
یک کاراکتر از محدوده 0 تا 9 را پیدا می کند
|
متا کاراکترها
متا کاراکتر | شرح |
| |
برای هر یک از الگوهای جدا شده با | مطابقت پیدا می کند مانند: گربه|سگ|ماهی
|
. |
فقط یک نمونه از هر کاراکتر را پیدا می کند
|
^ |
مطابقت را به عنوان ابتدای یک رشته پیدا می کند مانند: Hello^
|
$ |
مطابقت را در انتهای رشته پیدا می کند مانند: $World
|
d\ |
یک رقم پیدا می کند
|
s\ |
یک کاراکتر فضای خالی پیدا می کند
|
b\ |
یک مطابقت در ابتدای کلمه ای مانند این پیدا می کند: bWORD\ یا در انتهای کلمه ای مانند این: WORD\b
|
uxxxx\ |
کاراکتر یونیکد مشخص شده با عدد هگزادسیمال xxxx را پیدا می کند
|
شمارشگرها ( Quantifiers )
برای سنجش تعداد از شمارشگرها استفاده می شود.
شمارشگر | شرح |
+n |
با هر رشته ای که حداقل یک n داشته باشد مطابقت دارد
|
*n |
با هر رشته ای که حاوی صفر یا بیشتر از n باشد مطابقت دارد
|
?n |
با هر رشته ای که شامل صفر یا یک وقوع n باشد مطابقت دارد
|
n{x} |
با هر رشته ای که دارای دنباله ای از X n است مطابقت دارد
|
n{x,y} |
هر رشته ای را که حاوی دنباله ای از X تا Y n باشد مطابقت می دهد
|
n{x,} |
با هر رشته ای که دارای دنباله ای از حداقل X n باشد مطابقت دارد
|
توجه: اگر عبارت شما نیاز به جستجوی یکی از کاراکترهای خاص دارد، میتوانید از بک اسلش ( \ ) برای فرار از آنها استفاده کنید. به عنوان مثال، برای جستجوی یک یا چند علامت سوال می توانید از عبارت زیر استفاده کنید: ‘/+?\/’ = pattern$
گروه بندی
<?php
$str = "Apples and bananas.";
$pattern = "/ba(na){2}/i";
echo preg_match($pattern, $str);
?>

1
–
۲۲. فرمها در PHP
ایجاد یک فرم ساده HTML
<!DOCTYPE HTML>
<html>
<body>
<form action="welcome.php" method="post">
Name: <input type="text" name="نام"><br>
E-mail: <input type="text" name="ایمیل"><br>
<input type="ارسال">
</form>
</body>
</html>

Name:
Email:
<html>
<body>
Welcome <?php echo $_POST["name"]; ?><br>
Your email address is: <?php echo $_POST["email"]; ?>
</body>
</html>
Welcome John
Your email address is john.doe@example.com
<!DOCTYPE HTML>
<html>
<body>
<form action="welcome_get.php" method="get">
Name: <input type="text" name="name"><br>
E-mail: <input type="text" name="email"><br>
<input type="submit">
</form>
</body>
</html>

Name:
E-mail:
<html>
<body>
Welcome <?php echo $_GET["name"]; ?><br>
Your email address is: <?php echo $_GET["email"]; ?>
</body>
</html>
نکته: هنگام پردازش فرم های PHP به امنیت فکر کنید!
کد بالا حاوی هیچ گونه اعتبارسنجی فرم نیست، فقط نشان می دهد که چگونه می توانید داده های فرم را ارسال و بازیابی کنید.
در ادامه نحوه پردازش فرم های PHP با در نظر گرفتن امنیت را بررسی می کنیم. اعتبارسنجی صحیح داده های فرم برای محافظت از فرم شما در برابر هکرها و هرزنامه ها مهم است!
مقایسه GET و POST
چه زمانی از GET استفاده کنیم؟
چه زمانی از POST استفاده کنیم؟
نکته: توسعه دهندگان POST را برای ارسال داده های فرم ترجیح می دهند.
اعتبارسنجی فرمها
مثال اعتبارسنجی فرم:
* required field
Your Input:
فیلد | قوانین اعتبارسنجی |
Name |
ضروری. فقط باید شامل حروف و فضای خالی باشد
|
ضروری. باید دارای یک آدرس ایمیل معتبر (با @ و .) باشد.
|
|
Website |
اختیاری. در صورت وجود، باید دارای یک URL معتبر باشد
|
Comment |
اختیاری. فیلد ورودی چند خطی (textarea)
|
Gender |
ضروری. باید جنسیت را انتخاب کرد
|
فیلدهای متنی
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
دکمه های رادیویی
Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other
المان فرم
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
متغیر SERVER[“PHP_SELF”]_$ چیست؟
SERVER[“PHP_SELF”]_$ یک متغیر سوپر گلوبال است که نام فایل اسکریپت در حال اجرا را برمی گرداند.
تابع ()htmlspecialchars چیست؟
تابع ()htmlspecialchars کاراکترهای خاص را به موجودیت های HTML تبدیل می کند. این بدان معنی است که کاراکترهای HTML مانند < و > را با < و > جایگزین می کند. این مانع از سوء استفاده مهاجمان از کد با تزریق کد HTML یا Javascript (حملات Cross-site Scripting) در فرم ها می شود.
نکته مهم در مورد امنیت فرم PHP
نکته: برنامه نویسی متقابل سایت (XSS) نوعی آسیب پذیری امنیتی رایانه است که معمولاً در برنامه های کاربردی وب یافت می شود. XSS مهاجمان را قادر می سازد تا اسکریپت سمت سرویس گیرنده را به صفحات وب که توسط سایر کاربران مشاهده می شود تزریق کنند.
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
<form method="post" action="test_form.php">
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
چگونه از سوء استفادههای SERVER[“PHP_SELF”]_$ جلوگیری کنیم؟
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
اعتبارسنجی داده های فرم با PHP
<script>location.href('http://www.hacked.com')</script>
<script>location.href('http://www.hacked.com')</script>
-
کاراکترهای غیر ضروری (فضای اضافی، تب، خط جدید) را از داده های ورودی کاربر حذف کنید (با تابع PHP trim())
-
حذف بک اسلش (\) از داده های ورودی کاربر (با تابع PHP stripslashes())
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>PHP Form Validation Example</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Name: <input type="text" name="name">
<br><br>
E-mail: <input type="text" name="email">
<br><br>
Website: <input type="text" name="website">
<br><br>
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
<?php
echo "<h2>Your Input:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>
</body>
</html>

مثال اعتبار سنجی فرم PHP
Your Input:
فیلدهای ضروری (required)
فیلد | قوانین اعتبارسنجی |
Name |
ضروری. فقط باید شامل حروف و فضای خالی باشد
|
ضروری. باید دارای یک آدرس ایمیل معتبر (با @ و .) باشد.
|
|
Website |
اختیاری. در صورت وجود، باید دارای یک URL معتبر باشد
|
Comment |
اختیاری. فیلد ورودی چند خطی (textarea)
|
Gender |
ضروری. باید جنسیت را انتخاب کرد
|
<?php
// define variables and set to empty values
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "Name is required";
} else {
$name = test_input($_POST["name"]);
}
if (empty($_POST["email"])) {
$emailErr = "Email is required";
} else {
$email = test_input($_POST["email"]);
}
if (empty($_POST["website"])) {
$website = "";
} else {
$website = test_input($_POST["website"]);
}
if (empty($_POST["comment"])) {
$comment = "";
} else {
$comment = test_input($_POST["comment"]);
}
if (empty($_POST["gender"])) {
$genderErr = "Gender is required";
} else {
$gender = test_input($_POST["gender"]);
}
}
?>
اعتبارسنجی نام ، ایمیل و URL
اعتبارسنجی نام
$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z-' ]*$/",$name)) {
$nameErr = "Only letters and white space allowed";
}
نکته: تابع ()preg_match یک رشته را برای الگو جستجو می کند، اگر الگو وجود داشته باشد true و در غیر این صورت false را برمی گرداند.
اعتبارسنجی ایمیل
$email = test_input($_POST["email"]);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailErr = "Invalid email format";
}
اعتبارسنجی URL
$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
$websiteErr = "Invalid URL";
}
مثال از اعتبارسنجی Name , Email و URL
<?php
// define variables and set to empty values
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "Name is required";
} else {
$name = test_input($_POST["name"]);
// check if name only contains letters and whitespace
if (!preg_match("/^[a-zA-Z-' ]*$/",$name)) {
$nameErr = "Only letters and white space allowed";
}
}
if (empty($_POST["email"])) {
$emailErr = "Email is required";
} else {
$email = test_input($_POST["email"]);
// check if e-mail address is well-formed
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailErr = "Invalid email format";
}
}
if (empty($_POST["website"])) {
$website = "";
} else {
$website = test_input($_POST["website"]);
// check if URL address syntax is valid (this regular expression also allows dashes in the URL)
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
$websiteErr = "Invalid URL";
}
}
if (empty($_POST["comment"])) {
$comment = "";
} else {
$comment = test_input($_POST["comment"]);
}
if (empty($_POST["gender"])) {
$genderErr = "Gender is required";
} else {
$gender = test_input($_POST["gender"]);
}
}
?>

PHP Form Validation Example
* required field
Your Input:
حفظ مقادیر در فیلدهای ورودی
Name: <input type="text" name="name" value="<?php echo $name;?>">
E-mail: <input type="text" name="email" value="<?php echo $email;?>">
Website: <input type="text" name="website" value="<?php echo $website;?>">
Comment: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>
Gender:
<input type="radio" name="gender"
<?php if (isset($gender) && $gender=="female") echo "checked";?>
value="female">Female
<input type="radio" name="gender"
<?php if (isset($gender) && $gender=="male") echo "checked";?>
value="male">Male
<input type="radio" name="gender"
<?php if (isset($gender) && $gender=="other") echo "checked";?>
value="other">Other
نمونه فرم کامل
* required field
Your Input:
منبع:
w3schools.com