अशक्त या खाली स्ट्रिंग के लिए चर जांचने का बेहतर तरीका?


174

चूंकि PHP एक गतिशील भाषा है, इसलिए यह देखने का सबसे अच्छा तरीका है कि क्या प्रदान किया गया फ़ील्ड खाली है?

मैं यह सुनिश्चित करना चाहता हूं:

  1. नल को एक रिक्त स्ट्रिंग माना जाता है
  2. एक सफेद स्थान केवल स्ट्रिंग को खाली माना जाता है
  3. उस "0" को खाली नहीं माना जाता है

यह वही है जो मैंने अब तक प्राप्त किया है:

$question = trim($_POST['question']);

if ("" === "$question") {
    // Handle error here
}

ऐसा करने का एक सरल तरीका होना चाहिए?


1
मैं खाली ($ प्रश्न) का उपयोग करने के लिए कहूंगा, लेकिन यह भी 0 को खाली मानता है।
पॉवरलॉर्ड

2
yoda की स्थितियाँ भयावह हैं
user3791372

जवाबों:


278
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str){
    return (!isset($str) || trim($str) === '');
}

7
हालांकि यह इसे हल करता है, मुझे यकीन नहीं है कि यह सरल है। वैसे भी +1
एलन लालोंडे

4
चूंकि ओपी एक बहुत ही सरल ऑपरेशन के 'सरल' संस्करण के लिए कह रहा है, मैं यह कहने जा रहा हूं कि 'बेहतर' वह है जो वास्तव में वारंट है।
अराजकता

2
मैंने इसे एक समारोह में बदल दिया। इससे आपका सत्यापन कोड सरल हो जाना चाहिए
माइकल हरन

7
यहाँ isset () का उद्देश्य क्या है? यह is_null () से कैसे भिन्न है?
nick

2
भी लौटें (खाली ($ प्रश्न) || ट्रिम ($ प्रश्न) === '');
SpYk3HH

109

पुरानी पोस्ट लेकिन किसी को इसकी आवश्यकता हो सकती है जैसा मैंने किया था;)

if (strlen($str) == 0){
do what ever
}

$strअपने चर के साथ बदलें । NULLऔर ""दोनों 0 का उपयोग करते समय वापस आते हैं strlen


4
: और वहाँ हमेशा हैif(strcmp('', $var) == 0)...
पीटर

12
क्यों == 0 और नहीं तो बस (strlen ($ str))?
नौमेनन

14
@ नौमेनन क्योंकि इससे कुछ भी हल किए बिना पठनीयता ख़राब हो जाएगी। अपने सुझाव को "यदि कोई लंबाई है" के रूप में पढ़ना आसान है, जबकि यह (निश्चित रूप से) विपरीत का मतलब है।
मटियास undslund

11
रिक्त स्थान के साथ स्ट्रिंग के लिए मदद नहीं करेगा केवल, अगर के लिए है कि कोई चिंताओं
airboss

5
यदि चर सेट नहीं किया जाता है, तो यह चेतावनी का उत्पादन करेगा
कोन्सटेंटिन पेरियासालोव

25

PHP के खाली () फ़ंक्शन का उपयोग करें। निम्नलिखित चीजों को खाली माना जाता है

"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
"0" (0 as a string)
NULL
FALSE
array() (an empty array)
$var; (a variable declared, but without a value)

अधिक जानकारी के लिए खाली फ़ंक्शन की जांच करें


7
पोस्टर में कहा गया है कि वे "0" को खाली नहीं मानना ​​चाहते हैं
dougd_in_nc

18

यदि मैं गलत हूँ तो विनम्रतापूर्वक स्वीकार करूँगा, लेकिन मैंने अपने अंत में परीक्षण किया और पाया कि निम्नलिखित दोनों स्ट्रिंग (0) "और NULL मूल्यवान वैरिएबल के परीक्षण के लिए काम करता है:

if ( $question ) {
  // Handle success here
}

सफलता के लिए परीक्षण करने के लिए इसे उलटा भी किया जा सकता है:

if ( !$question ) {
  // Handle error here
}

क्या मैं सुझाव दे सकता हूं कि अगर (ट्रिम ($ n)) .. "अन्यथा यदि $ _POST var (उदाहरण के लिए) बस" "है, तो इसे वैध माना जाएगा, जबकि, ज्यादातर मामलों में यह एक खाली स्ट्रिंग जितना ही अच्छा है
स्टार्टअपग्यू

यदि विशिष्ट फ़ंक्शन के लिए "" एक स्वीकार्य मूल्य नहीं है, तो ट्रिम का उपयोग करना एक महान विचार होगा।
अदल

3
यह "0", संख्यात्मक 0 या 0.0 और FALSE के लिए गलत होगा।
वेदमांत

7

trim()फ़ंक्शन से झूठी नकारात्मक से सावधान रहें - यह ट्रिमिंग से पहले एक कास्ट-टू-स्ट्रिंग करता है, और इस तरह से "एरे" वापस आ जाएगा यदि आप इसे एक खाली सरणी पास करते हैं। यह एक मुद्दा नहीं हो सकता है, यह इस बात पर निर्भर करता है कि आप अपने डेटा को कैसे संसाधित करते हैं, लेकिन आपके द्वारा आपूर्ति किए जाने वाले कोड के साथ, question[]POST डेटा में नामांकित फ़ील्ड को आपूर्ति की जा सकती है और एक गैर-रिक्त स्ट्रिंग प्रतीत होती है। इसके बजाय, मैं सुझाव दूंगा:

$question = $_POST['question'];

if (!is_string || ($question = trim($question))) {
    // Handle error here
}

// If $question was a string, it will have been trimmed by this point

यदि आप एक स्ट्रिंग प्राप्त करते हैं, जहां आप एक स्ट्रिंग की उम्मीद करते हैं, तो यह कहना चाहिए कि यह एक त्रुटि होनी चाहिए। यदि आप किसी सरणी की अपेक्षा करते हैं तो उसके लिए आपके पास एक अलग फ़िल्टरिंग फ़ंक्शन होना चाहिए।
OIS

क्या वह कोड इसे एक त्रुटि के रूप में नहीं मान रहा है? यदि फ़िल्टरिंग कहीं और की जाती है, तो ध्यान रखना होगा कि यह args के सत्यापन नियमों के ज्ञान को अलग-अलग स्थानों पर दोहरा नहीं रहा है।
अनुदान

3

कोई बेहतर तरीका नहीं है, लेकिन चूंकि यह एक ऑपरेशन है जो आप आमतौर पर अक्सर करते हैं, आप बेहतर प्रक्रिया को स्वचालित करेंगे।

अधिकांश चौखटे तर्कों को आसान कार्य बनाने का एक तरीका प्रदान करते हैं। आप उसके लिए अपनी वस्तु का निर्माण कर सकते हैं। त्वरित और गंदे उदाहरण:

class Request
{

    // This is the spirit but you may want to make that cleaner :-)
    function get($key, $default=null, $from=null)
    {
         if ($from) :
             if (isset(${'_'.$from}[$key]));
                return sanitize(${'_'.strtoupper($from)}[$key]); // didn't test that but it should work
         else
             if isset($_REQUEST[$key])
                return sanitize($_REQUEST[$key]);

         return $default;
    }

    // basics. Enforce it with filters according to your needs
    function sanitize($data)
    {
          return addslashes(trim($data));
    }

    // your rules here
    function isEmptyString($data)
    {
        return (trim($data) === "" or $data === null);
    }


    function exists($key) {}

    function setFlash($name, $value) {}

    [...]

}

$request = new Request();
$question= $request->get('question', '', 'post');
print $request->isEmptyString($question);

सिम्फनी उस तरह की चीनी का बड़े पैमाने पर उपयोग करती है।

लेकिन आप इससे अधिक की बात कर रहे हैं, आपके "// हैंडल एरर" के साथ। आप 2 कार्य कर रहे हैं: डेटा प्राप्त करना और उसे संसाधित करना। ऐसा बिल्कुल नहीं है।

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

ऐसी वस्तुओं का निर्माण करें जो आपके फॉर्म के डेटा का प्रतिनिधित्व करती हैं, फिर प्रक्रियाएं संलग्न करें और इसे वापस करें। यह कहीं अधिक काम लगता है जो एक त्वरित PHP स्क्रिप्ट को हैक कर रहा है (और यह पहली बार है), लेकिन यह पुन: प्रयोज्य, लचीला और बहुत कम त्रुटि वाला है क्योंकि सामान्य PHP के साथ फार्म सत्यापन जल्दी से स्पेगेटी कोड बन जाता है।


22
आपने जो चाहा उसके ठीक विपरीत किया ... सादगी।
ट्रैविसो

2

यह एक सरणियों और तारों की जाँच करता है :

function is_set($val) {
  if(is_array($val)) return !empty($val);

  return strlen(trim($val)) ? true : false;
}

बुरा नहीं। PHPst द्वारा उत्तर एक ही है, लेकिन अधिक संक्षिप्त रूप से।
एलन लालोंड

2

अधिक मजबूत होना (सारणीकरण, वापसी…), मैं परिभाषित करता हूं:

function is_not_empty_string($str) {
    if (is_string($str) && trim($str, " \t\n\r\0") !== '')
        return true;
    else
        return false;
}

// code to test
$values = array(false, true, null, 'abc', '23', 23, '23.5', 23.5, '', ' ', '0', 0);
foreach ($values as $value) {
    var_export($value);
    if (is_not_empty_string($value)) 
        print(" is a none empty string!\n");
    else
        print(" is not a string or is an empty string\n");
}

सूत्रों का कहना है:


1

जब आप यह जांचना चाहते हैं कि किसी फ़ील्ड के लिए कोई मान प्रदान किया गया है, तो वह फ़ील्ड a string, a array, या undifined हो सकता है । तो, निम्नलिखित पर्याप्त है

function isSet($param)
{
    return (is_array($param) && count($param)) || trim($param) !== '';
}

0

खाली () इसके लिए काम करता था, लेकिन कई बार खाली () का व्यवहार बदल गया है। हमेशा की तरह, php डॉक्स हमेशा सटीक व्यवहार के लिए सबसे अच्छा स्रोत होते हैं और उन पन्नों पर टिप्पणियां आमतौर पर समय के साथ परिवर्तनों का एक अच्छा इतिहास प्रदान करती हैं। यदि आप वस्तु गुणों की कमी की जाँच करना चाहते हैं, तो इस समय एक बहुत ही रक्षात्मक तरीका है:

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.