المتغيرات من مصادر خارجية في PHP

من موسوعة حسوب
< PHP
مراجعة 03:47، 4 أبريل 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (استبدال النص - 'PHP\/([^|-]*)-([^|-]*)' ب'PHP/$1_$2')

نماذج HTML‏ (GET و POST)

عند إرسال نموذج إلى شيفرة PHP، فإن المعلومات القادمة من ذاك النموذج صبح متاحًا بصورة تلقائية للشيفرة. وهناك عدد من الطرائق التي يمكن من خلالها الوصول إلى هذه المعلومات، فعلى سبيل المثال:

المثال 1: نموذج HTML بسيط

<form action="foo.php" method="post">
    Name:  <input type="text" name="username" /><br />
    Email: <input type="text" name="email" /><br />
    <input type="submit" name="submit" value="Submit me!" />
</form>

منذ الإصدار 5.4.0 أصبح هناك طريقتان للوصول إلى البيانات التابعة لنموذج HTML. والطرائق المتاحة حاليًا مدرجة أدناه:

المثال 2: الوصول إلى البيانات التابعة لنموذج HTML بسيط من نوع POST

<?php
echo $_POST['username'];
echo $_REQUEST['username'];
?>

وفّرت الاصدارات القديمة من PHP طرائق أخرى للوصول إلى مدخلات المستخدم، وهذه الطريقة مدرجة أدناه. ولمزيد من المعلومات يمكن الرجوع إلى سجل التغييرات أسفل هذه الصفحة.

المثال 3: الطرائق القديمة للوصول إلى مدخلات المستخدم

<?php
  // انتبه: لم تعد هذه الطرق مدعومة في الوقت الحاضر
  // الطرق الصحيحة مبيّنة أعلاه

  // حُذفت هذه الدالة في الإصدار 5.4.0 من اللغة
   import_request_variables('p', 'p_');
   echo $p_username;
  // حُذفت المتغيّرات الطويلة المعرفة مسبقًا في الإصدار 5.4.0 من اللغة
   echo $HTTP_POST_VARS['username'];
  // register_globals
  // حُذفت هذه الخاصّية في الإصدار 5.4.0 من اللغة.
   echo $username;
?>

يكون التعامل مع النماذج من نوع GET مشابهًا لما سبق باستثناء استخدام المتغير GET المعرّف مسبقًا. يمكن استخدام هذا المتغيّر أيضًا مع سلاسل الاستعلام النصية (QUERY_STRING، وهي المعلومات التي تأتي بعد علامة '?' في عنوان URL). فعلى سبيل المثال يحتوي العنوان http://www.example.com/test.php?id=3 على معلومات GET يمكن الوصول إليها باستخدام ‎$_GET['id']‎. راجع أيضًا ‎$_REQUEST.

ملاحظة: تتحوّل النقاط والفراغات في أسماء المتغيرات إلى شرطات سفلية. مثال: ‎<input name="a.b" />‎ يصبح: ‎$_REQUEST["a_b"]‎.

تستطيع PHP كذلك التعامل مع المصفوفات ضمن سياق المتغيرات التابعة للنماذج (راجع السؤال المتعلّق بالموضوع). إذ يمكن على سبيل المثال تجميع المتغيّرات المرتبطة ببعضها سوية، أو استخدام هذه الخاصية للحصول على قيم متعدّدة من قائمة متعددة الاختيارات. لنرسل النموذج إلى نفسه ونعرض المعلومات بعد إتمام عملية الإرسال:

المثال 4: متغيرات أكثر تعقيدًا في النماذج

<?php
if ($_POST) {
    echo '<pre>';
    echo htmlspecialchars(print_r($_POST, true));
    echo '</pre>';
}
?>
<form action="" method="post">
    Name:  <input type="text" name="personal[name]" /><br />
    Email: <input type="text" name="personal[email]" /><br />
    Beer: <br />
    <select multiple name="beer[]">
        <option value="warthog">Warthog</option>
        <option value="guinness">Guinness</option>
        <option value="stuttgarter">Stuttgarter Schwabenbräu</option>
    </select><br />
    <input type="submit" value="submit me!" />
</form>

أسماء المتغيرات عند استخدام صورة لإرسال المعلومات

يمكن استخدام صورة بدلًا عن زر الإرسال الاعتيادي لغرض إرسال معلومات النموذج، وذلك باستخدام وسم مثل:

<input type="image" src="image.gif" name="sub" />

وعندما ينقر المستخدم على مكان معين في الصورة يُلحق بالمعلومات المرسلة إلى الخادوم متغيران إضافيان هما sub_x و sub_y. يتضمن هذان المتغيّران إحداثيات المكان الذي نقر عليه المستخدم ضمن الصورة. تحتوي الأسماء الحقيقية لهذه المتغيرات على نقطة بدلًا عن الشرطة السفلية، ولكن PHP تحوّل النقطة إلى شرطة سفلية تلقائيًا.

كعكات HTTP

تدعم PHP كعكات HTTP (أي HTTP Cookies) كمّا عُرِّفَت في معيار RFC 6265. الكعكات (cookies) هي طريقة لحفظ البيانات في متصفح المستخدم، مما يسمح بتعقب والتعرّف على المستخدمين العائدين إلى الموقع في وقت لاحق. يمكن ضبط الكعكات باستخدام الدالة setcookie()‎. تعدّ الكعكات جزءًا من ترويسة HTTP؛ لذا يجب استدعاء الدالة setcookie()‎ قبل إرسال أي مخرجات إلى المتصفح، وهذا الأمر ينطبق كذلك على الدالة header()‎. تصبح المعلومات التابعة للكعكة متاحةً في مصفوفات بيانات الكعكات مثل $_COOKIE إضافة إلى ‎$_REQUEST. راجع صفحة setcookie()‎ في هذا الدليل للاطلاع على المزيد من التفاصيل والأمثلة.

إن كنت ترغب في إسناد عدد من المتغيرات إلى متغير كعكة واحد، فيمكنك إسناده كمصفوفة، فمثلًا:

<?php
  setcookie("MyCookie[foo]", 'Testing 1', time()+3600);
  setcookie("MyCookie[bar]", 'Testing 2', time()+3600);
?>

ستنشئ الشيفرة السابقة كعكتين منفصلتين على الرغم من كون MyCoookie مصفوفة واحدة. إن كنت ترغب في تعيين كعكة واحدة مع متغيّرات متعددة فعليك باستخدام الدالة serialize()‎ أو explode()‎ على القيمة قبل إسنادها. لاحظ أن الكعكة الجديدة ستحلّ محل الكعكة القديمة في المتصفح إن كانت تحمل الاسم نفسها، إلا إذا كان المسار (path) أو النطاق (domain) مختلفين. لذا، في حال استخدام الكعكات في تطبيق يتضمن سلة تسوق فستحتاج إلى استخدام عدّاد وتمريره مع الكعكة.

المثال 5: مثال عن setcookie()‎

<?php
if (isset($_COOKIE['count'])) {
    $count = $_COOKIE['count'] + 1;
} else {
    $count = 1;
}
setcookie('count', $count, time()+3600);
setcookie("Cart[$count]", $item, time()+3600);
?>

النقاط في أسماء المتغيّرات الخارجية

لا تغير PHP في العادة أسماء المتغيرات التي تمرّر إلى الشيفرة، ولكن يجب الانتباه إلى أن النقطة ليست حرفًا مقبولاً في أسماء متغيرات PHP. ولمعرفة السبب لاحظ المثال التالي:

<?php
$varname.ext;  // اسم متغير غير صحيح
?>

ما يراه مفسر اللغة هنا هو متغير يحمل الاسم ‎$varname يتبعه معامل ربط السلاسل النصية تتبعه السلسلة النصّية المجرّدة (أي سلسلة نصية غير محاطة بعلامات اقتباس ولا تطابق أيًّا من المفاتيح أو الكلمات المحجوزة المعروفة) ext..

من الواضح أنّ هذه ليست النتيجة المطلوبة، لهذا من المهم جدًّا الانتباه إلى أن PHP تبدّل وبصورة تلقائية أي نقطة في أسماء المتغيرات القادمة من خارج الشيفرة إلى شرطات سفلية.

تحديد أنواع المتغيرات

تحدّد PHP أنواع المتغيرات وتحوّلها (بصورة عامة) حسب الحاجة، ولهذا السبب يصعب تحديد نوع المتغيّر في وقت معين. تتضمن PHP مجموعة من الدوال التي تساعد في التعرف على نوع المتغير مثل gettype()‎ و is_array()‎ و is_float()‎ و is_int()‎ و is_object()‎ و is_string()‎. راجع أيضًا الفصل الخاص بالأنواع.

ونظراً لكون HTTP بروتوكولًا نصّيًان فإن الغالبية العظمى من المحتوى (إن لم يكن كلّه) الذي يصل إلى المصفوفات ذوات النطاق العام العالي (superglobals) مثل ‎$_POST و ‎$_GET تبقى على هيئة سلاسل نصية. لن تحاول PHP تغيير القيم إلى نوع معين. في المثال التالي تحتوي ‎$_GET["var1"]‎ على السلسلة النصية "null" وتحتوي ‎$_GET["var2"]‎ على السلسلة النصية "123".

/index.php?var1=null&var2=123

سجل التغييرات

الإصدار الوصف
5.4.0 حذف كل من Register Globals و Magic Quotes و register_long_arrays
5.3.0 أصبح كل من Register Globals و Magic Quotes و register_long_arrays عناصر مهملة
4.2.0 أصبح الموجه register_globals يحمل القيمة off.
4.1.0 أتيحت المصفوفات ذوات النطاق العام العالي مثل  ‎$_POST و ‎$_GET.

مصادر