/ دورة PHP الشاملة
0/17 مكتملة
درس 11 من 17

المتغيرات العامة Superglobals

$_GET، $_POST، $_SESSION، $_COOKIE، $_SERVER وأكثر — كل شيء تحتاجه

🕐 50 دقيقة 📝 6 أسئلة 💻 7 أمثلة عملية

ما هي Superglobals؟

الـ Superglobals هي متغيرات مدمجة في PHP متاحة في أي مكان في الكود — داخل الدوال والكلاسات وكل مكان — بدون الحاجة للكلمة المفتاحية global.

كلها تبدأ بـ $_ وتُخزّن في مصفوفات:

المتغيرما يحتويمتى يُستخدم
$_GETبيانات من URL (query string)البحث، فلترة الصفحات
$_POSTبيانات من form بطريقة POSTتسجيل الدخول، إرسال البيانات
$_REQUESTGET + POST + COOKIE معاًعام — تجنّبه واستخدم المحدد
$_SESSIONبيانات الجلسة (تبقى بين الصفحات)تسجيل الدخول، سلة المشتريات
$_COOKIEملفات تعريف الارتباطتذكّر المستخدم، الإعدادات
$_SERVERمعلومات السيرفر والطلبIP المستخدم، URL الحالي، Method
$_FILESالملفات المرفوعةرفع الصور والملفات
$_ENVمتغيرات البيئةإعدادات السيرفر
$_GLOBALSكل المتغيرات العامةالوصول للمتغيرات من داخل الدوال

$_GET — بيانات الـ URL

$_GET يستقبل البيانات المُرسَلة عبر الـ URL كـ query string. مثلاً:
localhost/page.php?name=Ahmed&age=25
PHP — $_GET
<?php
// URL: localhost/search.php?query=php&page=2&lang=ar

// الوصول للبيانات
$query = $_GET['query'] ?? '';   // 'php'
$page  = $_GET['page']  ?? 1;   // '2'
$lang  = $_GET['lang']  ?? 'en'; // 'ar'

// دائماً نظّف المدخلات!
$safe_query = htmlspecialchars($query);
$safe_page  = (int) $page; // تحويل لرقم

echo "البحث عن: " . $safe_query . "<br>";
echo "الصفحة: " . $safe_page . "<br>";
echo "اللغة: " . htmlspecialchars($lang);

// التحقق من وجود المتغير أولاً
if (isset($_GET['category'])) {
    $cat = htmlspecialchars($_GET['category']);
    echo "<br>الفئة: " . $cat;
} else {
    echo "<br>لا توجد فئة محددة";
}

// بناء URL جديد
$new_url = "search.php?" . http_build_query([
    'query' => $safe_query,
    'page'  => $safe_page + 1,
    'lang'  => $lang
]);
echo "<br><a href='" . $new_url . "'>الصفحة التالية</a>";
?>
الناتج
البحث عن: php الصفحة: 2 اللغة: ar لا توجد فئة محددة الصفحة التالية →

$_POST — استقبال بيانات الفورم

$_POST يستقبل البيانات المُرسَلة من فورم HTML بطريقة method="POST". البيانات لا تظهر في URL.
HTML + PHP — login form
<!-- login.php -->
<?php
$error   = '';
$success = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 1. استقبال البيانات
    $email    = trim($_POST['email']    ?? '');
    $password = $_POST['password']      ?? '';
    $remember = isset($_POST['remember']); // checkbox

    // 2. التحقق الأساسي (Validation)
    if (empty($email) || empty($password)) {
        $error = 'يرجى ملء جميع الحقول';
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $error = 'البريد الإلكتروني غير صحيح';
    } elseif (strlen($password) < 8) {
        $error = 'كلمة المرور قصيرة جداً (8 أحرف على الأقل)';
    } else {
        // 3. الاتصال بالـ DB والتحقق (سنتعلمه في الدروس القادمة)
        $success = 'تم تسجيل الدخول بنجاح!';
    }
}
?>
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<body>
    <?php if ($error): ?>
        <div style="color:red"><?= htmlspecialchars($error) ?></div>
    <?php endif; ?>
    <?php if ($success): ?>
        <div style="color:green"><?= htmlspecialchars($success) ?></div>
    <?php endif; ?>

    <form method="POST" action="login.php">
        <input type="email"    name="email"    placeholder="البريد الإلكتروني" required>
        <input type="password" name="password" placeholder="كلمة المرور"       required>
        <label><input type="checkbox" name="remember"> تذكّرني</label>
        <button type="submit">دخول</button>
    </form>
</body>
</html>

$_SESSION — الجلسات بين الصفحات

$_SESSION يُخزّن بيانات تبقى محفوظة بين الصفحات المختلفة طوال وجود المستخدم في الموقع. يُستخدم لحفظ حالة تسجيل الدخول وسلة المشتريات وأكثر.

مهم جداً: يجب استدعاء session_start() في أول سطر من كل صفحة تستخدم Sessions.
PHP — $_SESSION
<?php
// ─── index.php — تسجيل الدخول ───────────────────────────
session_start(); // دائماً في أول السطر!

// تسجيل بيانات المستخدم في الـ Session
$_SESSION['user_id']   = 42;
$_SESSION['username']  = 'Ahmed';
$_SESSION['role']      = 'admin';
$_SESSION['logged_in'] = true;
$_SESSION['login_time'] = time(); // وقت الدخول

echo "تم تسجيل الدخول!";
echo "مرحباً " . $_SESSION['username'];
?>

<?php
// ─── dashboard.php — التحقق من الجلسة ──────────────────
session_start();

// التحقق من تسجيل الدخول
if (!isset($_SESSION['logged_in']) || !$_SESSION['logged_in']) {
    header('Location: login.php');
    exit; // مهم! لا تنسَ exit بعد header
}

$username = htmlspecialchars($_SESSION['username']);
$role     = htmlspecialchars($_SESSION['role']);
$login_dur = time() - $_SESSION['login_time'];

echo "مرحباً $username ($role)";
echo "<br>وقت الجلسة: $login_dur ثانية";

// تعديل بيانات الجلسة
$_SESSION['last_visit'] = date('Y-m-d H:i:s');
?>

<?php
// ─── logout.php — تسجيل الخروج ─────────────────────────
session_start();
session_unset();     // مسح كل متغيرات الجلسة
session_destroy();   // تدمير الجلسة نهائياً

// مسح الـ cookie
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

header('Location: login.php');
exit;
?>

$_COOKIE — ملفات تعريف الارتباط

$_COOKIE يُخزّن بيانات صغيرة في متصفح المستخدم. تبقى حتى بعد إغلاق المتصفح (على عكس Sessions).
PHP — $_COOKIE
<?php
// ─── تعيين Cookie ───────────────────────────────────────
// setcookie(name, value, expires, path, domain, secure, httponly)

// Cookie يبقى 30 يوم
setcookie('username', 'Ahmed', time() + (30 * 24 * 60 * 60), '/');

// Cookie آمن (HTTPS فقط + لا يُقرأ بـ JavaScript)
setcookie(
    'remember_token',
    bin2hex(random_bytes(32)),
    time() + (30 * 24 * 60 * 60),
    '/',
    '',
    true,   // Secure (HTTPS)
    true    // HttpOnly (لا JavaScript)
);

// إعداد اللغة
setcookie('lang', 'ar', time() + (365 * 24 * 60 * 60), '/');

// ─── قراءة Cookie ───────────────────────────────────────
if (isset($_COOKIE['username'])) {
    $user = htmlspecialchars($_COOKIE['username']);
    echo "أهلاً مجدداً، $user!";
} else {
    echo "زيارة جديدة";
}

$lang = $_COOKIE['lang'] ?? 'en';
echo "<br>اللغة: $lang";

// ─── حذف Cookie ─────────────────────────────────────────
// اجعل وقت الانتهاء في الماضي
setcookie('username', '', time() - 3600, '/');
?>
الناتج
أهلاً مجدداً، Ahmed! اللغة: ar

$_SERVER — معلومات السيرفر والطلب

$_SERVER يحتوي معلومات قيّمة عن السيرفر وطلب المستخدم الحالي.
PHP — $_SERVER
<?php
// معلومات الطلب
echo "HTTP Method: "  . $_SERVER['REQUEST_METHOD']  . "<br>"; // GET أو POST
echo "URL الحالي: "   . $_SERVER['REQUEST_URI']     . "<br>"; // /page.php?q=test
echo "اسم الصفحة: "  . $_SERVER['PHP_SELF']        . "<br>"; // /page.php
echo "اسم المضيف: "  . $_SERVER['HTTP_HOST']       . "<br>"; // localhost
echo "IP المستخدم: " . $_SERVER['REMOTE_ADDR']     . "<br>"; // 127.0.0.1
echo "المتصفح: "     . $_SERVER['HTTP_USER_AGENT'] . "<br>";

// معلومات السيرفر
echo "برنامج السيرفر: " . $_SERVER['SERVER_SOFTWARE'] . "<br>"; // Apache
echo "مسار الملف: "    . $_SERVER['DOCUMENT_ROOT']    . "<br>";

// URL الكامل
$protocol = isset($_SERVER['HTTPS']) ? 'https' : 'http';
$full_url  = $protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
echo "الـ URL الكامل: " . $full_url . "<br>";

// التحقق من نوع الطلب
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    echo "هذا طلب POST";
} else {
    echo "هذا طلب GET";
}

// Referrer (من أين جاء المستخدم)
$referrer = $_SERVER['HTTP_REFERER'] ?? 'مباشر';
echo "<br>جاء من: " . htmlspecialchars($referrer);
?>
الناتج
HTTP Method: GET URL الحالي: /page.php اسم الصفحة: /page.php اسم المضيف: localhost IP المستخدم: 127.0.0.1 برنامج السيرفر: Apache/2.4.54 الـ URL الكامل: http://localhost/page.php هذا طلب GET جاء من: مباشر

$_FILES — رفع الملفات

$_FILES يحتوي معلومات الملفات المرفوعة من فورم HTML.
PHP — رفع الملفات
<!-- HTML form — لازم enctype -->
<form method="POST" enctype="multipart/form-data">
    <input type="file" name="photo" accept="image/*">
    <button type="submit">رفع الصورة</button>
</form>

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['photo'])) {
    $file = $_FILES['photo'];

    // معلومات الملف
    echo "الاسم: "   . $file['name']     . "<br>";
    echo "النوع: "   . $file['type']     . "<br>";
    echo "الحجم: "   . $file['size']     . " bytes<br>";
    echo "الحالة: "  . $file['error']    . "<br>";

    // التحقق من الأخطاء
    if ($file['error'] !== UPLOAD_ERR_OK) {
        die("خطأ في الرفع: " . $file['error']);
    }

    // التحقق من النوع والحجم
    $allowed_types = ['image/jpeg', 'image/png', 'image/webp'];
    $max_size      = 5 * 1024 * 1024; // 5MB

    if (!in_array($file['type'], $allowed_types)) {
        die("نوع الملف غير مسموح! (JPG, PNG, WEBP فقط)");
    }
    if ($file['size'] > $max_size) {
        die("الملف كبير جداً! الحد الأقصى 5MB");
    }

    // إنشاء اسم فريد للملف
    $ext      = pathinfo($file['name'], PATHINFO_EXTENSION);
    $new_name = uniqid('img_') . '.' . strtolower($ext);
    $dest     = 'uploads/' . $new_name;

    // النقل من المؤقت للمجلد الدائم
    if (move_uploaded_file($file['tmp_name'], $dest)) {
        echo "تم الرفع بنجاح: <img src='$dest' width='200'>";
    } else {
        echo "فشل النقل! تحقق من صلاحيات مجلد uploads/";
    }
}
?>

$_GLOBALS — الوصول للمتغيرات العامة من داخل الدوال

PHP — $GLOBALS
<?php
$site_name = "PhineX";
$version   = "2.0";

function showSiteInfo() {
    // بدون $GLOBALS لا تستطيع الوصول لهذه المتغيرات
    // echo $site_name; // خطأ!

    // طريقة 1: $GLOBALS
    echo $GLOBALS['site_name'] . " v" . $GLOBALS['version'];

    // طريقة 2: global (الأفضل)
    global $site_name, $version;
    echo $site_name . " v" . $version;
}

showSiteInfo(); // PhineX v2.0

// الأفضل دائماً: تمرير القيم كـ parameters
function showInfo(string $name, string $ver): void {
    echo "$name v$ver";
}
showInfo($site_name, $version);
?>
الناتج
PhineX v2.0 PhineX v2.0 PhineX v2.0

أمان Superglobals — لا تثق في المدخلات!

⚠️ قاعدة ذهبية: لا تثق أبداً في مدخلات المستخدم كل بيانات $_GET و$_POST و$_COOKIE يمكن تزويرها. دائماً نظّفها وتحقق منها قبل الاستخدام.
PHP — تنظيف المدخلات
<?php
// ❌ خاطئ — لا تستخدم المدخل مباشرةً
$name = $_POST['name'];
echo "مرحباً " . $name; // XSS Attack!

// ✅ صحيح — تنظيف النص قبل العرض
$name = htmlspecialchars($_POST['name'] ?? '');
echo "مرحباً " . $name;

// ✅ تنظيف متقدم
function sanitize(string $input, string $type = 'string'): mixed {
    $input = trim($input);
    return match($type) {
        'string'  => htmlspecialchars(strip_tags($input), ENT_QUOTES, 'UTF-8'),
        'int'     => (int) filter_var($input, FILTER_SANITIZE_NUMBER_INT),
        'float'   => (float) filter_var($input, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION),
        'email'   => filter_var($input, FILTER_SANITIZE_EMAIL),
        'url'     => filter_var($input, FILTER_SANITIZE_URL),
        default   => htmlspecialchars($input),
    };
}

// استخدام الدالة
$name  = sanitize($_POST['name']  ?? '', 'string');
$age   = sanitize($_POST['age']   ?? '', 'int');
$email = sanitize($_POST['email'] ?? '', 'email');
$page  = sanitize($_GET['page']   ?? '', 'int');

// Validation مع filter_var
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "البريد غير صحيح";
}
if (!filter_var($age, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => 120]])) {
    echo "العمر غير صحيح";
}
?>

🧪 اختبر فهمك

6 أسئلة
سؤال 1
ما الفرق الرئيسي بين $_GET و$_POST؟
سؤال 2
ما الدالة التي يجب استدعاؤها في أول سطر من كل صفحة تستخدم $_SESSION؟
سؤال 3
ما $_SERVER index الذي يعطيك IP المستخدم الزائر؟
سؤال 4
ما الـ attribute المطلوب في فورم HTML لرفع الملفات؟
سؤال 5
ما الدالة المناسبة لتنظيف مدخل نصي لعرضه في HTML؟
سؤال 6
لحذف جلسة المستخدم عند تسجيل الخروج، ما الترتيب الصحيح؟