بخش نهم: آرایه‌های فوق‌سراسری و کاربردهای عملی

۹-۱. مفهوم آرایه فوق‌سراسری

آرایه‌های فوق‌سراسری (Superglobals) آرایه‌هایی هستند که در همه بخش‌های برنامه، حتی داخل توابع، بدون نیاز به تعریف متغیر سراسری قابل دسترسی هستند. این آرایه‌ها توسط PHP ساخته می‌شوند و نام آن‌ها با حرف بزرگ شروع می‌شود.

آرایه‌های فوق‌سراسری اصلی عبارت‌اند از:

آرایه کاربرد
$_GET داده‌های ارسال‌شده با روش GET
$_POST داده‌های ارسال‌شده با روش POST
$_REQUEST ترکیب داده‌های GET و POST و COOKIE
$_COOKIE داده‌های کوکی
$_SESSION داده‌های نشست
$_SERVER اطلاعات سرور و محیط اجرا
$_FILES فایل‌های آپلودشده
$_ENV متغیرهای محیطی

۹-۲. آرایه $_GET

داده‌هایی را نگه می‌دارد که از طریق آدرس (Query String) ارسال می‌شوند. برای مثال، اگر آدرس زیر درخواست شود:

page.php?name=Ali&age=17

آنگاه:

<?php
echo $_GET["name"]; // Ali
echo $_GET["age"];  // 17
?>

نکته امنیتی: همیشه قبل از استفاده از داده‌های $_GET، وجود کلید را بررسی کنید.

<?php
if (isset($_GET["name"])) {
    echo htmlspecialchars($_GET["name"]);
}
?>

مطالعه تکمیلی: تابع htmlspecialchars کاراکترهای خطرناک HTML را تبدیل می‌کند و از حملات XSS جلوگیری می‌کند. استفاده از آن برای نمایش داده‌های کاربر در صفحه ضروری است.

۹-۳. آرایه $_POST

داده‌های فرم‌هایی را نگه می‌دارد که با روش POST ارسال شده‌اند. برای مثال، فرم زیر:

<form method="post" action="result.php">
    <input type="text" name="username">
    <input type="submit" value="ارسال">
</form>

در فایل result.php:

<?php
if (isset($_POST["username"])) {
    echo "نام کاربر: " . htmlspecialchars($_POST["username"]);
}
?>

نکته: داده‌های $_POST در آدرس مرورگر نمایش داده نمی‌شوند و برای ارسال اطلاعات حساس مناسب‌ترند.

۹-۴. آرایه $_REQUEST

ترکیبی از $_GET، $_POST و $_COOKIE است. استفاده از آن توصیه نمی‌شود، زیرا مشخص نیست داده از کدام منبع آمده است.

<?php
if (isset($_REQUEST["name"])) {
    echo htmlspecialchars($_REQUEST["name"]);
}
?>

مطالعه تکمیلی: به دلایل امنیتی و شفافیت کد، بهتر است به‌جای $_REQUEST از $_GET یا $_POST به‌طور مشخص استفاده شود.

۹-۵. آرایه $_SERVER

اطلاعات مربوط به سرور و درخواست را نگه می‌دارد. چند کلید پرکاربرد:

<?php
echo $_SERVER["SERVER_NAME"];   // نام سرور
echo $_SERVER["REQUEST_METHOD"]; // روش درخواست (GET یا POST)
echo $_SERVER["PHP_SELF"];      // مسیر فایل جاری
echo $_SERVER["REMOTE_ADDR"];   // آی‌پی کاربر
?>

نکته امنیتی: استفاده از $_SERVER["PHP_SELF"] در فرم‌ها بدون پاک‌سازی می‌تواند خطرناک باشد. بهتر است از یک رشته ثابت یا htmlspecialchars استفاده شود.

۹-۶. آرایه $_SESSION

برای نگهداری اطلاعات در بین درخواست‌های مختلف استفاده می‌شود. برای شروع نشست، باید session_start() فراخوانی شود.

<?php
session_start();

$_SESSION["username"] = "علی";
$_SESSION["role"] = "admin";
?>

در صفحه دیگر:

<?php
session_start();

if (isset($_SESSION["username"])) {
    echo "خوش آمدید " . $_SESSION["username"];
} else {
    echo "لطفاً وارد شوید.";
}
?>

حذف یک مقدار از نشست

<?php
unset($_SESSION["role"]);
?>

پایان دادن به نشست

<?php
session_destroy();
?>

مطالعه تکمیلی: $_SESSION یک آرایه انجمنی است که PHP آن را مدیریت می‌کند. داده‌های نشست در سرور ذخیره می‌شوند و شناسه نشست از طریق کوکی به مرورگر فرستاده می‌شود. برای امنیت بیشتر، پس از ورود کاربر موفق، شناسه نشست را با session_regenerate_id تغییر دهید.

۹-۷. آرایه $_COOKIE

داده‌هایی را نگه می‌دارد که در مرورگر کاربر ذخیره شده‌اند.

تنظیم کوکی

<?php
setcookie("username", "علی", time() + 3600);
?>

خواندن کوکی

<?php
if (isset($_COOKIE["username"])) {
    echo "کاربر: " . htmlspecialchars($_COOKIE["username"]);
}
?>

نکته: کوکی‌ها در مرورگر ذخیره می‌شوند و کاربر می‌تواند آن‌ها را تغییر دهد. بنابراین نباید اطلاعات حساس در آن‌ها ذخیره شود.

۹-۸. آرایه $_FILES

اطلاعات فایل‌های آپلودشده را نگه می‌دارد. ساختار آن دوبعدی است.

<?php
if (isset($_FILES["myfile"])) {
    echo "نام فایل: " . $_FILES["myfile"]["name"] . "<br>";
    echo "نوع فایل: " . $_FILES["myfile"]["type"] . "<br>";
    echo "اندازه فایل: " . $_FILES["myfile"]["size"] . "<br>";
    echo "مسیر موقت: " . $_FILES["myfile"]["tmp_name"] . "<br>";
    echo "کد خطا: " . $_FILES["myfile"]["error"] . "<br>";
}
?>

مطالعه تکمیلی: آپلود فایل نیاز به تنظیمات امنیتی دقیق دارد؛ مانند بررسی نوع فایل، اندازه فایل و استفاده از move_uploaded_file برای انتقال فایل از مسیر موقت به مسیر نهایی. این موضوع در جزوه‌های جداگانه بررسی می‌شود.

۹-۹. کاربرد عملی: نمایش لیست کاربران

<?php
$users = [
    ["id" => 1, "name" => "علی", "age" => 17],
    ["id" => 2, "name" => "رضا", "age" => 20],
    ["id" => 3, "name" => "مریم", "age" => 16]
];

echo "<table border='1'>";
echo "<tr><th>شناسه</th><th>نام</th><th>سن</th></tr>";

foreach ($users as $user) {
    echo "<tr>";
    echo "<td>" . $user["id"] . "</td>";
    echo "<td>" . $user["name"] . "</td>";
    echo "<td>" . $user["age"] . "</td>";
    echo "</tr>";
}

echo "</table>";
?>

۹-۱۰. کاربرد عملی: فیلتر کردن لیست کالاها

<?php
$products = [
    ["name" => "کیبورد", "price" => 450000],
    ["name" => "ماوس", "price" => 250000],
    ["name" => "مانیتور", "price" => 3500000]
];

$maxPrice = 500000;

$cheap = array_filter($products, function ($product) use ($maxPrice) {
    return $product["price"] <= $maxPrice;
});

foreach ($cheap as $product) {
    echo $product["name"] . " : " . $product["price"] . "<br>";
}
?>

نکته: برای استفاده از متغیر بیرونی در تابع بازخوانی، از use استفاده می‌کنیم.

۹-۱۱. کاربرد عملی: محاسبه جمع سبد خرید

<?php
$cart = [
    ["name" => "کیبورد", "price" => 450000, "qty" => 2],
    ["name" => "ماوس", "price" => 250000, "qty" => 1]
];

$total = 0;

foreach ($cart as $item) {
    $total += $item["price"] * $item["qty"];
}

echo "جمع کل: " . $total . " تومان";
?>

۹-۱۲. کاربرد عملی: گروه‌بندی داده‌ها

<?php
$students = [
    ["name" => "علی", "field" => "کامپیوتر"],
    ["name" => "رضا", "field" => "حسابداری"],
    ["name" => "مریم", "field" => "کامپیوتر"]
];

$grouped = [];

foreach ($students as $student) {
    $grouped[$student["field"]][] = $student["name"];
}

print_r($grouped);
?>

خروجی:

Array
(
    [کامپیوتر] => Array
        (
            [0] => علی
            [1] => مریم
        )

    [حسابداری] => Array
        (
            [0] => رضا
        )
)

مطالعه تکمیلی: این الگو (ساخت آرایه انجمنی با کلید دسته‌بندی و مقدار آرایه‌ای) در گزارش‌گیری و پردازش داده بسیار رایج است. در PHP 7 به بعد می‌توان از array_reduce نیز برای این کار استفاده کرد، اما حلقه foreach خواناتر است.

۹-۱۳. نکات امنیتی مهم

  1. همیشه قبل از استفاده از کلیدهای آرایه‌های فوق‌سراسری، وجود آن‌ها را با isset بررسی کنید.
  2. داده‌های کاربر را با htmlspecialchars پاک‌سازی کنید.
  3. از $_REQUEST پرهیز کنید و منبع داده را مشخص کنید.
  4. اطلاعات حساس را در کوکی ذخیره نکنید.
  5. برای داده‌های ورودی، نوع و محدوده را اعتبارسنجی کنید.
  6. در استفاده از $_FILES، نوع و اندازه فایل را کنترل کنید.

۹-۱۴. جمع‌بندی بخش نهم

  • آرایه‌های فوق‌سراسری در همه بخش‌های برنامه قابل دسترسی هستند.
  • $_GET و $_POST برای دریافت داده از فرم‌ها استفاده می‌شوند.
  • $_SESSION برای نگهداری اطلاعات در بین درخواست‌ها کاربرد دارد.
  • $_SERVER اطلاعات سرور و درخواست را نگه می‌دارد.
  • $_FILES برای آپلود فایل استفاده می‌شود.
  • همیشه داده‌های ورودی را بررسی و پاک‌سازی کنید.
  • آرایه‌ها در ساخت جدول، فیلتر کردن، گروه‌بندی و محاسبات تجمعی کاربرد فراوان دارند.