سؤال

أنا جديد إلى حد ما على PHP وأقوم بإنشاء موقع ويب لشركتي. أنا أستخدم بعض التعليمات البرمجية الموجودة التي حصلت عليها ولكن لا يبدو أنها تجعلها تعمل بشكل صحيح - أي مساعدة ستكون موضع تقدير كبير!

لدي متغير ، $ id, ، والذي يحدد نوع فئة المنتج لعرضه على الصفحة. أحتاج أولاً إلى التحقق من أن متغير المعرف قد تم تعيينه ، وإذا لم يكن الأمر كذلك ، فإن المتغير الافتراضي إلى الفئة 0.

الرمز الذي لدي كما يلي:

setdefault($id, 0);

function setdefault(&$var, $default="") 
{
   if (!isset($var)) 
   {
      $var = $default;
   }
}

لذلك مع العنوان www.website.com/browse.php ، أتوقع أن يكون افتراضيًا إلى $ id = 0 ؛ باستخدام العنوان www.website.com/browse.php؟id=3 ، أتوقع أن يعين $ id إلى 3 وعرض المنتجات ذات الصلة. ومع ذلك ، على الرغم من إعداد $ id ، إلا أنه لا يزال افتراضيًا إلى 0. هل هناك شيء غير صحيح بشكل واضح مع الكود الخاص بي؟

هل كانت مفيدة؟

المحلول

ربما تتوقع أن تستخدم PHP $ _post و $ _get كمتغيرات عالمية. اعتادت PHP إعدادها بهذه الطريقة ، مرة أخرى في اليوم ، ولكن الإصدارات الأحدث تتطلب منك الرجوع صراحة هذه المتغيرات.

يمكنك تجربة هذا:

setdefault($_GET['id'], 0);

function setdefault(&$var, $default="") 
{
   if (!isset($var)) 
   {
      $var = $default;
   }
}

أو حتى أكثر ببساطة (باستخدام المشغل الثلاثية):

$id = array_key_exists('id', $_GET) ? $_GET['id'] : 0;

نصائح أخرى

أولاً ، إذا كان هذا هو php 5.xi نوصي بشدة بأن لا تمرر المتغيرات بالرجوع إليها باستخدام &. ما قيل. ستكون دعوة وظيفة ISSET صحيحة دائمًا في الحصول على الوظيفة. لكنك ستتلقى تحذيرًا متغيرًا غير محدد على SetDefault ($ ID ، 0) ؛

جرب هذا بدلا من ذلك.

$id = isset($id) ? $id : 0;

إذا لم يتم تعيين $ ID ، فإن المكالمة إلى SetDefault ($ id ، 0) ستقوم بإنشاء تحذير. وظيفة مثل setDefault لا تعمل في PHP. استخدم هذا بدلاً من ذلك.

if (!isset($id)) $id = 0;

إذا كنت تفعل ذلك لمتغيرات الصفيف ، مثل $ _get و $ _post ، يمكنك القيام بذلك:

function getuservar($A, $index, $default = '') {
    if (!isset($A[$index])) return $default;
    if (get_magic_quote_gpc()) return stripslashes($A[$index]);
    return $A[$index];
}

$clean_id = getuservar($_GET, 'id', 0);

يعد نموذج الإرجاع هذا أفضل لأنك تتوقف عن استخدام صفيف $ _get على الفور واستخدم المتغيرات التي يتم تنظيفها فقط في بقية الكود. تقوم بتنظيف المتغيرات الخارجية مرة واحدة ولا تلمس المتغيرات الخارجية مرة أخرى في الكود الخاص بك. $ a يمكن أن يكون $ _get ، $ _post ، $ _request أو $ _cookie.

كما أنه يتعامل مع أشياء Magic_quote المزعجة لك حتى تعرف البيانات الموجودة في المتغير هو النص الذي أرسله المستخدم. فقط تذكر تنظيفه مرة أخرى عند إرساله إلى المستخدم أو إلى قاعدة البيانات.

كيف هو $id يجري تعيين؟ إذا register_globals هو خارج (وهو خارج افتراضيا في PHP 4.2 وأحدث) ، تحتاج إلى النظر في $_GET['id'] أو $_POST['id'] بدلا من ذلك (أو $_REQUEST['id'], ، ولكن هناك أسباب لتجنب ذلك).

الرمز المطلوب تعيينه $id إلى وقت ما من سلسلة الاستعلام (browse.php?id=3) ستحتاج أيضا إلى إدراج. قد تفكر في register_globals الإعدادات التي لدى PHP التي ستنشئ متغيرات تلقائيًا عند تضمينها في سلسلة الاستعلام. لا تعيد تمكين هذه الميزة ، لعدة سنوات حتى الآن ، تبين أنها فكرة سيئة حقًا.

يجب فحص أي متغير تقوم بسحبه من سلسلة الاستعلام للنوع/السلامة قبل استخدامه. لذلك على سبيل المثال ، يمكنك سحب المتغير من $_GET Super Global ، تحقق لمعرفة ما إذا كان الرقم ، إذا لم يكن ذلك بعد ذلك ، قم بتعيين الافتراضي:

if (!is_numeric($_GET['id']) {
  setdefault($_GET['id'], 0);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top