درس 11 من 17
المتغيرات العامة Superglobals
$_GET، $_POST، $_SESSION، $_COOKIE، $_SERVER وأكثر — كل شيء تحتاجه
ما هي Superglobals؟
الـ Superglobals هي متغيرات مدمجة في PHP متاحة في أي مكان في الكود — داخل الدوال والكلاسات وكل مكان — بدون الحاجة للكلمة المفتاحية
كلها تبدأ بـ
global.
كلها تبدأ بـ
$_ وتُخزّن في مصفوفات:
| المتغير | ما يحتوي | متى يُستخدم |
|---|---|---|
| $_GET | بيانات من URL (query string) | البحث، فلترة الصفحات |
| $_POST | بيانات من form بطريقة POST | تسجيل الدخول، إرسال البيانات |
| $_REQUEST | GET + 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
لحذف جلسة المستخدم عند تسجيل الخروج، ما الترتيب الصحيح؟