2012-10-17 4 views
5
$p = (isset($_REQUEST["p"])?$_REQUEST["p"]:""); 

यह सामान्य लाइन है जो मैं आमतौर पर अपने PHP कोड में उपयोग करता हूं, यह सामान्य तरीका है। मुझे हमेशा लगता है कि इसे लिखने के लिए एक बेहतर (छोटा और तेज) तरीका है?

+0

इनलाइन सशर्त यथासंभव कम है। आप पाठ्यक्रम के एक समारोह को परिभाषित कर सकते हैं। समस्या आपका कोड नहीं है लेकिन तथ्य यह है कि अगर आप वास्तव में सेट पैरामीटर सेट करते हैं तो आपको पता नहीं है। आपके मामले के लिए सबसे अच्छा और साफ-सुथरा तरीका शायद अस्तित्व की जांच करने वाले फ़ंक्शन का उपयोग करके अनुरोध मानों को मैप करके आवश्यक चर प्रारंभ करना है। – matthias

+1

यह आपकी मदद कर सकते http://stackoverflow.com/a/12798041/1226894 – Baba

+1

आप इस छोटे नहीं कर सकते। आप इसे छोटा क्यों करना चाहते हैं? पर्याप्त छोटा नहीं है? –

उत्तर

14

अपना खुद का कार्य बनाएं:

function getIfSet(&$value, $default = null) 
{ 
    return isset($value) ? $value : $default; 
} 

$p = getIfSet($_REQUEST['p']); 

कोई अन्य साफ समाधान नहीं है।

+1

क्यों डाउनवोट ?? – Aelios

+0

हाँ हम हमेशा इसके लिए एक फ़ंक्शन बना सकते हैं लेकिन यह मेरे कथन के समान है। पहले उत्तर – Champ

+0

बस एक अधिक सुरक्षित समारोह – Aelios

7

आप इसे और कितना छोटा चाहते हैं?

बेशक

, अगर आप आप एक अनुरोध मूल्य का उपयोग इस हर समय का उपयोग कर रहे हैं, आप एक समारोह कहीं बनाना होगा और उपयोग करते हैं:

:

function reqVal($val, $default = "", $no_sql = true) 
{ 
    $var = isset($_REQUEST[$val]) ? $_REQUEST[$val] : $default; 
    $var = $no_sql ? nosql($var) : $var; 
    return $var; 
} 

function getVal($val, $default = "", $no_sql = true) 
{ 
    $var = isset($_GET[$val]) ? $_GET[$val] : $default; 
    $var = $no_sql ? nosql($var) : $var; 
    return $var; 
} 

function postVal($val, $default = "", $no_sql = true) 
{ 
    $var = isset($_POST[$val]) ? $_POST[$val] : $default; 
    $var = $no_sql ? nosql($var) : $var; 
    return $var; 
} 

अब एसक्यूएल incjection जांच जोड़ने

function nosql($var) 
{ 
    if (is_array($var)) { 
     foreach ($var as $key => $elem) $var[$key] = nosql($elem); 
    } else if ($var === null) { 
     return null; 
    } else { 
     if (get_magic_quotes_gpc()) $var = stripslashes($var); 
     $var = mysql_real_escape_string($var); 
    } 
    return $var; 
} 

और पहुँच इसे इस तरह हमेशा सरल:

$p = reqVal('p', 0); 
$p = getVal('p', 'something', false); 
$p = postVal('p'); // or just forget the 2nd and 3rd parameter 
+0

मुझे लगता है कि यह सबसे अच्छा समाधान है, लेकिन शायद एलीओस के उत्तर की तरह 'डिफ़ॉल्ट मान' पैरामीटर जोड़ने के साथ। – enenen

+0

तो मेरा सबसे अच्छा है: डी – Aelios

+0

जवाब संपादित और हाँ, @Aelios यह पहली बार किया था, कि अगर महत्वपूर्ण है;) – Peon

2

मैं आमतौर पर इस तथ्य का लाभ ले कि PHP शिथिल टाइप किया और बस करना है: इस तरह

$p = (string) $_REQUEST['p']; 

, भले ही $_REQUEST['p'] सेट नहीं है, कोई रिक्त स्ट्रिंग अभी भी $p में संग्रहीत हो जाता है। ध्यान रखें कि यह केवल तभी काम करता है जब आपका त्रुटि हैंडलर नोटिस को अनदेखा करता है, क्योंकि एक अनसेट कुंजी तक पहुंचने से E_NOTICE "undefined index" के साथ ट्रिगर होगा।

+0

और आप सही खाली के बीच अंतर कैसे जानेंगे स्ट्रिंग और अनुरोध चर त्रुटि? – Aelios

+0

"अनुरोध चर त्रुटि" से आपका क्या मतलब है? चैंप के अपने संस्करण में अंतर कैसे पता चलता है? –

+0

चैंप नहीं करता है, मैं – Aelios

0

यह वास्तव में इतना आम है, कि मुझे आश्चर्य है कि PHP में ऐसा करने का कोई मूल तरीका नहीं है। अधिकांश डेवलपर्स एक सरणी से सुरक्षित रूप से पढ़ने के लिए अपना स्वयं का फ़ंक्शन लिखते हैं।

/** 
* Gets the value associated with the specified key from an array. 
* @param array $array The array to search for the key. 
* @param mixed $key The key of the value to get. 
* @param mixed $default The default value to return, if the 
* specified key does not exist. 
* @return mixed Value that is associated with the specified 
* key, or the default value, if no such key exists. 
*/ 
function getValueFromArray($array, $key, $default = null) 
{ 
    $containsKey = isset($array[$key]); 
    if ($containsKey) 
    return $array[$key]; 
    else 
    return $default; 
} 

/** 
* Gets the value associated with the specified key from an array. 
* @param array $array The array to search for the key. 
* @param mixed $key The key of the value to get. 
* @param mixed $value Retrieves the found value, or is set to null 
* if the key could not be found. 
* @return bool Returns true if the key could be found, otherwise false. 
*/ 
public function tryGetValueFromArray($array, $key, &$value) 
{ 
    $containsKey = isset($array[$key]); 
    if ($containsKey) 
    $value = $array[$key]; 
    else 
    $value = null; 
    return $containsKey; 
} 
+2

हालांकि मैं ओओ प्रोग्रामिंग के लिए सब कुछ कर रहा हूं, अगर ओपी एक छोटे और तेज़ तरीके से पूछता है: कार्य और विशेष रूप से कक्षाएं –

+0

@EliasVanOotegem जाने का तरीका नहीं हैं - यह कार्य करने के बाद, दृष्टिकोण के आधार पर निर्भर करता है, आपको जो कोड लिखना है वह वास्तव में छोटा है, बस 'getValueFromArray ($ _ REQUEST,' p ') को कॉल करना। जहां तक ​​मुझे पता है वहां कोई मूल कार्य नहीं है। – martinstoeckli

+0

निश्चित रूप से, एक बार फ़ंक्शन पूरी तरह से लिखा जाता है, तो आपको कुछ वर्ण कम लिखना पड़ता है, लेकिन फ़ंक्शन कॉल अधिक महंगी होती है, और धीमी होती है (इनलाइन टर्नरी की तुलना में ओपी अब उपयोग कर रहा है)। यह देखते हुए कि वह _smaller और fast_ वैकल्पिक के बाद है, फ़ंक्शन छोटे कोड प्रदान करते हैं, लेकिन धीमे होते हैं। बस एक साइड-नोट, कि स्पीड फ्रंट –

0

आप अलग अलग समाधान यहाँ http://php.net/manual/en/function.isset.phpउपयोगकर्ता योगदान नोट्स खंड में के कई उदाहरण मिल सकते हैं।

इस प्रयास करें:

function get_if_set($varname, $parent=null) { 
    if (!is_array($parent) && !is_object($parent)) { 
     $parent = $GLOBALS; 
    } 
    return array_key_exists($varname, $parent) ? $parent[$varname] : null; 
} 
0

जवाब है कि एक समारोह में अपने मौजूदा कोड लपेट अच्छा कर रहे हैं - वे वास्तव में ऊपर साफ कोड करना यदि आप उनमें से एक गुच्छा मिल गया है।

हालांकि बेहतर समाधान आपके शुरू होने से पहले अपेक्षित मूल्यों के सेट के आधार पर आपकी संपूर्ण अनुरोध सरणी को स्वच्छ करना है।

उदाहरण के लिए:

function sanitiseRequest() { 
    $expected = array(
     'p' => '', 
     'id' => 0, 
     //etc 
    ); 

    //throw away any input that wasn't expected... 
    foreach($_REQUEST as $key=>$value) { 
     if(!isset($expected[$key]) { unset $_REQUEST[$key]; } 
    } 
    //and for any expected values that weren't passed, set them to the defaults. 
    foreach($expected as $key=>$defvalue) { 
     if(!isset($_REQUEST[$key]) { $_REQUEST[$key] = $defvalue; } 
    } 
} 

तब बस अपने कोड के शुरू में इस समारोह के लिए एक कॉल जोड़ने के लिए, और आप अपने कोड में कहीं और isset($_REQUEST[..]) करने के बारे में चिंता करने की जरूरत नहीं होगी।

इस अवधारणा को आने वाले तर्कों को सही डेटा प्रकार के साथ-साथ, या कोई अन्य डेटा सफाई करने के लिए मजबूर करने के लिए विस्तारित किया जा सकता है, जिसे आप करना चाहते हैं। यह आपको पूर्ण विश्वास दे सकता है कि आने वाले डेटा की अपेक्षा के अनुसार आबादी आ रही है।

उम्मीद है कि मदद करता है।

3

अगर आप कुछ कम करना चाहते हैं, और एक खाली (स्ट्रिंग) डिफ़ॉल्ट मान, निम्न कार्य करता से ही संतोष कर रहे हैं:

$p = @$_REQUEST['p']; 

@ त्रुटि दमन संचालक है तथा एक चेतावनी है, तो देने से अभिव्यक्ति रखेंगे मान सेट नहीं है।

http://www.php.net/manual/en/language.operators.errorcontrol.php

+0

यह बहुत अच्छा है। साझा करने और जोड़ने के लिए धन्यवाद! –

0

यह एक मेरे लिए अच्छी तरह से काम करता है। और आपको नाम दो बार लिखना नहीं है। यह पहले से सेट होने पर var को नहीं बदलेगा। इसलिए register_globals का उपयोग करके पुराने एप्लिकेशन के त्वरित एन गंदे रूपांतरण के लिए उपयोग करना सुरक्षित है।

function getIfSet($key, $default = null) 
{ 
    global $$key; 

    if(!isset($$key)){ 
     if(isset($_REQUEST[$key])){ 
      $$key=$_REQUEST[$key]; 
     }else{ 
      if(!is_null($default)){ 
       $$key = $default; 
      } 
     } 
    } 
} 
function getIfSetArray($list){ 
    foreach($list as $item){ 
     getIfSet($item); 
    } 
} 

getIfSet('varname'); 
getIfSetArray(['varname_1','varname_2']); 

echo $varname; 
echo $varname_1; 
संबंधित मुद्दे