নাল বা খালি স্ট্রিংয়ের জন্য ভেরিয়েবল চেক করার আরও ভাল উপায়?


174

যেহেতু পিএইচপি একটি গতিশীল ভাষা তাই কোনও প্রদত্ত ক্ষেত্র খালি কিনা তা দেখার জন্য যাচাই করার সর্বোত্তম উপায় কী?

আমি তা নিশ্চিত করতে চাই:

  1. নাল একটি খালি স্ট্রিং হিসাবে বিবেচনা করা হয়
  2. একটি সাদা স্থান কেবল স্ট্রিং খালি বিবেচনা করা হয়
  3. যে "0" খালি বিবেচনা করা হয় না

আমি এ পর্যন্ত এটি পেয়েছি:

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

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

এটি করার একটি সহজ উপায় আছে?


1
আমি খালি ($ প্রশ্ন) ব্যবহার করতে বলব, তবে এটি 0 টি শূন্য বলেও মনে করে।
পাওয়ারলর্ড

2
ইয়োদা পরিস্থিতিগুলি ভয়াবহ
ব্যবহারকারী 3791372

উত্তর:


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

7
যদিও এটি এটি সমাধান করে, আমি নিশ্চিত না এটি সহজ simp +1 টি যাহাই হউক না কেন
Allain Lalonde

4
যেহেতু ওপি একটি অত্যন্ত সাধারণ অপারেশনের একটি 'সহজ' সংস্করণ চাইছে, তাই আমি বলতে চাই যে 'ভাল' আসলে এটিই চাওয়া হয়েছে।
বিশৃঙ্খলা

2
আমি এটি একটি ফাংশনে পরিণত। এটির মাধ্যমে আপনার বৈধতা কোডটি সহজ করা উচিত
মাইকেল হরেন

7
এখানে isset () এর উদ্দেশ্য কী? এটি কীভাবে আলাদা?
নিকফ

2
এছাড়াও ফিরে (! খালি ($ প্রশ্ন) || ছাঁটাই ($ প্রশ্ন) === '');
SpYk3HH

109

পুরানো পোস্ট তবে কারওর প্রয়োজন যেমন আমার মতো হতে পারে;)

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

$strআপনার পরিবর্তনশীল সঙ্গে প্রতিস্থাপন । NULLএবং ""উভয়ই 0 ব্যবহার করে ফিরে আসে strlen


4
এবং সর্বদা আছে:if(strcmp('', $var) == 0)...
পিটার

12
কেন == 0 এবং যদি কেবল (স্ট্রেন ($ স্ট্র)) না হয়?
নুমেনন

14
@ নুমেনন কারণ এটি কোনও কিছু সমাধান না করেই পঠনযোগ্যতাকে ক্ষতিগ্রস্থ করবে। আপনার পরামর্শটি "যদি দৈর্ঘ্য থাকে তবে" হিসাবে পড়তে পারা যায় তবে এর (অবশ্যই) অর্থ এর বিপরীত।
ম্যাটিয়াস -স্লুন্ড

11
কেবল স্থানগুলির সাথে স্ট্রিংয়ের জন্য সহায়তা করবে না, যদি কেউ তার জন্য যত্ন করে
এয়ারবস

5
যদি ভেরিয়েবলটি সেট না করা হয় তবে এটি একটি সতর্কতা তৈরি করবে
কনস্টান্টিন পেরিয়াস্লোভ

25

পিএইচপি-র খালি () ফাংশনটি ব্যবহার করুন। নিম্নলিখিত জিনিসগুলি খালি মনে করা হয়

"" (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" খালি বিবেচনা করতে চান না
ডগড_ইন_সিএন

18

আমি ভুল হলে আমি বিনীতভাবে গ্রহণ করব, তবে আমি নিজের প্রান্তে পরীক্ষা করে দেখেছি যে নিম্নলিখিত দুটি স্ট্রিং (0) "" এবং NULL মূল্যবান ভেরিয়েবল পরীক্ষা করার জন্য কাজ করে:

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

যা সাফল্যের জন্য পরীক্ষায়ও বিপরীত হতে পারে:

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

আমি কি "যদি (ট্রিম ($ n)) প্রস্তাব দিতে পারি .." অন্যথায় যদি $ $পস্ট ভার (উদাহরণস্বরূপ) কেবল "" হয় তবে এটি বৈধ হিসাবে বিবেচিত হবে, যদিও বেশিরভাগ ক্ষেত্রে এটি খালি স্ট্রিংয়ের মতোই ভাল
স্টার্টআপগুই

নির্দিষ্ট ফাংশনের জন্য যদি "" গ্রহণযোগ্য মান না হয় তবে ট্রিম ব্যবহার করা দুর্দান্ত ধারণা হবে।
অ্যাডাল

3
এটি "0", সংখ্যা 0 বা 0.0 এবং মিথ্যা হিসাবে ফিরে আসবে।
বেদমন্ত

7

trim()ফাংশন থেকে মিথ্যা নেতিবাচক সতর্কতা অবলম্বন করুন - এটি ছাঁটাইয়ের আগে একটি কাস্ট-টু-স্ট্রিং সম্পাদন করে এবং এভাবে আপনি যদি খালি অ্যারে পাস করেন তবে "অ্যারে" যেমন ফিরে আসবে। আপনি কীভাবে আপনার ডেটা প্রক্রিয়াকরণ করবেন তার উপর নির্ভর করে এটি কোনও সমস্যা হতে পারে না তবে আপনি যে কোড সরবরাহ করেন সেটির সাথে question[]পোষ্টের ডেটাতে নামের একটি ক্ষেত্র সরবরাহ করা যেতে পারে এবং খালি খালি স্ট্রিং বলে মনে হয়। পরিবর্তে, আমি পরামর্শ দেব:

$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

আইডি বলুন আপনি যদি এমন কোনও অ্যারে পেয়ে থাকেন যেখানে আপনি স্ট্রিংয়ের প্রত্যাশা করেছিলেন এটি ত্রুটি হওয়া উচিত। আপনি যদি অ্যারে আশা করেন তবে তার জন্য আপনার আলাদা ফিল্টারিং ফাংশন থাকা উচিত।
ওআইএস

কোডটি কি এটি একটি ত্রুটি হিসাবে আচরণ করছে না? যদি অন্য কোথাও থেকে ফিল্টারিং করা হয় তবে যত্ন নিতে হবে যে এটি আরোগুলির বৈধতা সংক্রান্ত বিধিগুলি পৃথক স্থানে নকল করছে না।
গ্র্যান্টপর্পস ২:01

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);

সাইফনি এ জাতীয় চিনি ব্যাপকভাবে ব্যবহার করে।

তবে আপনি আপনার "// এখানে হ্যান্ডেল ত্রুটি" দিয়ে আরও বেশি কথা বলছেন with আপনি 2 টি কাজের মিশ্রণ করছেন: ডেটা পাওয়া এবং এটি প্রক্রিয়াজাতকরণ। এটি মোটেও এক রকম নয়।

অন্যান্য বৈধতা রয়েছে যা আপনি ডেটা যাচাই করতে ব্যবহার করতে পারেন। আবার ফ্রেমওয়ার্কগুলি আপনাকে সেরা অভ্যাসগুলি দেখাতে পারে।

আপনার ফর্মের ডেটা উপস্থাপন করে এমন বস্তু তৈরি করুন, তারপরে প্রক্রিয়াগুলি সংযুক্ত করুন এবং এতে ফিরে যান। এটি আরও বেশি কাজ বলে মনে হচ্ছে যে দ্রুত পিএইচপি স্ক্রিপ্ট হ্যাকিং (এবং এটি প্রথমবারের মতো), তবে এটি স্বাভাবিকভাবে পিএইচপি সহ ফর্ম বৈধতা দ্রুত স্প্যাগুটি কোডে পরিণত হওয়ার প্রবণতা, কারণ এটি পুনরায় ব্যবহারযোগ্য, নমনীয় এবং কম ত্রুটিযুক্ত


22
তিনি যা চেয়েছিলেন তার ঠিক বিপরীতে করেছেন ... সরলতা।
ট্র্যাভিসো


2

আরও দৃust় হতে (ট্যাবুলেশন, ফিরে ...), আমি সংজ্ঞায়িত করছি:

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

যদি আপনি একটি মান একটি ক্ষেত্রের জন্য প্রদান করা হয় চেক করতে চান করে, তখন সেই ক্ষেত্রটিতে কোনও হতে পারে string, একটি array, বা undifined। সুতরাং, নিম্নলিখিতটি যথেষ্ট

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

0

খালি () এটির জন্য কাজ করত তবে খালি () এর আচরণ বেশ কয়েকবার পরিবর্তিত হয়েছে। সর্বদা হিসাবে, পিএইচপি ডক্স সর্বদা সঠিক আচরণের জন্য সর্বোত্তম উত্স এবং সেই পৃষ্ঠাগুলিতে দেওয়া মন্তব্যগুলি সময়ের সাথে সাথে পরিবর্তনের একটি ভাল ইতিহাস সরবরাহ করে। আপনি যদি অবজেক্টের বৈশিষ্ট্যের অভাব পরীক্ষা করতে চান তবে এই মুহুর্তে একটি খুব রক্ষণাত্মক পদ্ধতি হ'ল:

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.