Null veya boş dize değişkeni kontrol etmek için iyi bir yolu?

6 Cevap php

PHP dinamik bir dil olduğu için ne bir sağlanan alan boş olup olmadığını görmek için kontrol iyi yolu nedir?

Ben emin olmak istiyorum:

  1. boş boş bir dize olarak kabul edilir
  2. Bir boşluk yalnızca dize boş kabul edilir
  3. "0" boş kabul edilmez olduğunu

Bu şimdiye kadar var budur:

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

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

Bunu yapmanın basit bir yolu olmalı?

6 Cevap

Ben yaptım eski bir yazı ama birisi gerekebilir ;)

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

replace $str with your variable. NULL and "" both return 0 when using strlen.

trim() işlevi yanlış negatifler Dikkat - bu düzeltme önce bir döküm-to-dize gerçekleştirir ve böylece örneğin dönecektir "Dizi" boş bir dizi geçmek durumunda. Bu sizin verileri işlemek nasıl bağlı olarak, bir sorun olabilir, ama olmayabilir adında bir alan question[] POST veri temin ve boş olmayan bir dize gibi görünen olabilir, arz kodu ile. Bunun yerine, ben öneririm:

$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

Orada iyi bir yol ama genellikle oldukça sık yapmak bir operasyon olduğundan, daha iyi sürecini otomatik hale ediyorum.

Çoğu çerçeveler, kolay bir görev ayrıştırma argümanlar yapmak için bir yol sunar. Eğer bunun için nesnenin sahibi inşa edebilirsiniz. Hızlı ve kirli örnek:

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

Symfony kitlesel şeker bu tür kullanın.

But you are talking about more than that, with your "// Handle error here ". You are mixing 2 jobs : getting the data and processing it. This is not the same at all.

Verileri doğrulamak için kullanabileceğiniz başka mekanizmalar vardır. Yine, çerçeveler size iyi pratices gösterebilir.

Formun verileri temsil nesneleri oluşturmak, sonra processses eklemek ve ona geri düşmek. Bu (ve ilk kez) hızlı bir PHP komut dosyası kesmek çok daha fazla iş geliyor ama her zamanki PHP ile Form doğrulama hızlı spaguetti kod olma eğilimindedir çünkü eğilimli, yeniden kullanılabilir, esnek ve çok daha az hata var.

Yanılıyorsam naçizane kabul edeceğiz, ama benim kendi ucunda test edilmiş ve bulunan bu iki dize (0) "" ve NULL değerli değişkenler test için aşağıdaki işler:

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

Ayrıca gibi başarı için test etmek için ters olabilir ki:

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

PHP'nin boş () işlevini kullanın. Aşağıdakiler boş olarak kabul edilir

"" (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)

Daha fazla bilgi kontrol için empty function

boş () bunun için çalışmak için kullanılan, ancak () boş bir davranış birkaç kez değişti. Her zaman olduğu gibi, php dokümanlar her zaman kesin davranış için en iyi kaynaktır ve bu sayfalarda yorumlar genellikle zaman içinde değişiklikler iyi bir geçmişi sağlar. Eğer nesne özellikleri eksikliği kontrol etmek isterseniz, şu anda bir çok defansif bir yöntemdir:

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {