هل هناك طريقة أفضل للتحقق من المتغيرات نشر في PHP؟

StackOverflow https://stackoverflow.com/questions/1209873

  •  06-07-2019
  •  | 
  •  

سؤال

وأجد في صفحات PHP بلدي أنا في نهاية المطاف مع خطوط وخطوط من التعليمات البرمجية التي تبدو مثل هذا:

$my_id = isset($_REQUEST['my_id']) ? $_REQUEST['my_id'] : '';
$another_var = isset($_REQUEST['another_var']) ? $_REQUEST['another_var'] : 42;
...

هل هناك طريقة أفضل وأكثر إيجازا أو أكثر قابلية للقراءة للتحقق هذه المجموعة وتعيينها إلى متغير محلي إذا كانت موجودة أو تطبيق الافتراضي إذا لم يفعلوا ذلك؟

وتحرير: أنا لا أريد أن استخدام register_globals() - كنت لا تزال لديها مشكلة isset على أي حال

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

المحلول

وماذا عن الاشارات في وظيفة؟

<?php

function getPost($name, $default = null) {
    return isset($_POST[$name]) ? $_POST[$name] : $default;
}

نصائح أخرى

وربما تكون أفضل طريقة لخلق المفرد / فئة ثابتة إلى مجردة بعيدا التفاصيل للتحقق من بيانات الطلب.

وشيء من هذا القبيل:

class Request {

  private $defaults = array();
  private static $_instance = false;

  function getInstance () {
    if (!self::$_instance) {
     $c = __CLASS__;
      self::$_instance = new $c;
    }
    return self::$_instance;
  }

  function setDefaults($defaults) {
    $this->defaults = $defaults;
  }

  public function __get($field) {
    if (isset($_REQUEST[$field]) && !empty($_REQUEST[$field])) {
        return $_REQUEST['field'];        
      } elseif (isset($this->defaults[$field])) {
        return $this->defaults[$field];
      } else {
        return ''; # define a default value here.
      }
   }
}

وبعد ذلك يمكنك القيام به:

# get an instance of the request
$request = Request::getInstance();

# pass in defaults.
$request->setDefaults(array('name'=>'Please Specify'));

# access properties
echo $request->name;
echo $request->email;

وأعتقد أن هذا يجعل الأحمال الفردية الخاصة بك مخطوطات نظافة والملخصات بعيدا التحقق من صحة الخ بالاضافة الى كميات من نطاق مع هذا التصميم لتمديده / إضافة السلوكيات البديلة، إضافة الافتراضي أكثر تعقيدا التعامل مع الخ الخ.

أولا، استخدام $_POST للمتغيرات التي تم نشرها. $_REQUEST هو المزج العديد من المتغيرات واردة مختلفة، وليس فقط $_POST ويمكن أن يسبب مشاكل.

وحل واحد لسؤالك سيكون إنشاء دالة الذي يعالج منطق isset().

function ForceIncomingValue($Key, $Default) {
    if (!isset($_POST[$Key]))
         return $Default;
    else return $_POST[$Key];
}

وقبل كل شيء، أبدا استخدام المتغير $ _REQUEST، وأنها سوف تؤدي إلى الخلل وغيرها من المشاكل خلال تطوير

لم يتم تعيين

function getPOST($key) {
    if(isset($_POST[$key])) {
        return $_POST[$key];
    }
}

وnote that this code leaves the variable empty when $_POST[$key]

ويمكنك أيضا أن تتكيف مع هذا الرمز لتمكين لكم لبدلا تزويدك الافتراضي (معقول) عندما لا يمكن تحميل القيمة.

function getPOST($key, $default = NULL) {
    if(isset($_POST[$key])) {
        return $_POST[$key];
    } else {
        return $default;
    }
}

هل مجموعة من المتغيرات كنت تتوقع معروفة في وقت كتابة هذا التقرير في البرنامج النصي، أم أنك تريد أن تفعل هذا لمجموعة التعسفي من القيم؟ إذا كان الأول هو الصحيح، هل يمكن أن تفعل شيئا من هذا القبيل:

# This array would hold the names of all the variables you're expecting
# and a default value for that variable name
$variableNames = array (...); 
foreach ($variableNames as $key => $default) {
    if (isset ($_REQUEST[$key])) $$key = $_REQUEST[$key];
    else $$key = $default;
}

والأساس، وهذا يستفيد من القدرة PHP لتقييم المتغيرات لإنشاء متغيرات أخرى. (وبالتالي ضعف دولار ل$$ مفتاح - وهذا يعني إنشاء متغير جديد اسمه هو قيمة $ مفتاح)

وأنا لم يحن بعد حتى مع حل جيد لهذه الحالة الأخيرة.

مشغل ائتلافه PHP ل !

<اقتباس فقرة>   

و$username = $_GET['user'] ?? 'nobody';

وبالنسبة لكثير من المتغيرات، مع الاختيار الشرط، أي شخص حر في استخدام بلدي expect .

scroll top