Değişkeni null veya boş dize için kontrol etmenin daha iyi bir yolu var mı?


174

PHP dinamik bir dil olduğundan, sağlanan alanın boş olup olmadığını kontrol etmenin en iyi yolu nedir?

Bunu sağlamak istiyorum:

  1. null boş bir dize olarak kabul edilir
  2. yalnızca boşluk içeren bir dize boş kabul edilir
  3. "0" boş kabul edilmez

Şimdiye kadar sahip olduğum şey bu:

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

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

Bunu yapmanın daha basit bir yolu olmalı mı?


1
Boş ($ soru) kullanmayı söyleyebilirim, ama bu da 0'ın boş olduğunu düşünüyor.
Powerlord

2
yoda koşulları korkunç
user3791372

Yanıtlar:


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

7
Bu çözse de, daha basit olup olmadığından emin değilim. Yine de +1
Allain Lalonde

4
OP son derece basit bir operasyonun 'daha basit' bir versiyonunu istediğinden, gerçekte garanti edilen 'daha iyi' olduğunu söyleyeceğim.
kaos

2
Bir fonksiyona çevirdim. Bu basit doğrulama kodunu yapmalıdır
Michael Haren

7
burada! isset () amacı nedir? is_null () ile farkı nedir?
nickf

2
ayrıca return (! empty ($ question) || trim ($ question) === '');
SpYk3HH

109

Eski yazı ama benim yaptığım gibi biri gerekebilir;)

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

$strdeğişkeninizle değiştirin . NULLve ""her ikisi de kullanırken 0 döndürür strlen.


4
Ve her zaman vardır:if(strcmp('', $var) == 0)...
peter

12
Neden == 0 ve sadece eğer değil (strlen ($ str))?
Noumenon

14
@Noumenon Çünkü bu hiçbir şeyi çözmeden okunabilirliği olumsuz etkileyecektir. (Elbette) bunun tersi anlamına gelirken, önerinizi "bir uzunluk varsa" olarak okumak gerçekten kolaydır.
Mattias Åslund

11
Birisi bunun için önemsiyorsa, sadece boşluklu dize için yardımcı olmayacak
airboss

5
Değişken ayarlanmazsa, bu bir uyarı oluşturur
Konstantin Pereiaslov

25

PHP'nin empty () işlevini kullanın. Aşağıdaki şeyler boş 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 için boş fonksiyonu kontrol edin


7
Poster, "0" ı boş düşünmek istemediklerini söyledi
dougd_in_nc

18

Yanlış olduğumu alçakgönüllülükle kabul edeceğim, ancak kendi tarafımda test ettim ve aşağıdakilerin hem string (0) "" ve NULL değerli değişkenleri test etmek için çalıştığını buldum:

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

Bu da başarıyı test etmek için tersine çevrilebilir:

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

"if (trim ($ n)) .." önerebilir miyim, aksi takdirde bir $ _POST var (örneğin) basitçe "" ise, geçerli kabul edilir, ancak çoğu durumda bu boş bir dize kadar iyidir
StartGuy

"" Belirli bir işlev için kabul edilebilir bir değer değilse, trim kullanmak harika bir fikir olacaktır.
Adal

3
Bu "0", sayısal 0 veya 0.0 ve FALSE için false değerini döndürür.
Vedmant

7

İşlevden yanlış negatiflere dikkat edin trim()- düzeltme işleminden önce dizgeye döküm yapar ve boş bir dizi geçirirseniz örneğin "Dizi" döndürür. Bu, verilerinizi nasıl işlediğinize bağlı olarak bir sorun olmayabilir, ancak sağladığınız kodla question[]POST verilerinde adlı bir alan sağlanabilir ve boş olmayan bir dize gibi görünebilir. Bunun yerine şunu ö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

Bir dizeyi beklediğiniz yerde bir dizi alırsanız hata olduğunu söylemeliyim. Bir dizi bekliyorsanız, bunun için ayrı bir filtreleme işleviniz olmalıdır.
OIS

Bu kod bir hata olarak ele almıyor mu? Filtreleme başka bir yerde yapılırsa, bağımsız değişkenlerin doğrulama kuralları hakkındaki bilgileri ayrı yerlere kopyalamamasına dikkat edilmelidir.
grantwparks

3

Daha iyi bir yol yoktur, ancak genellikle oldukça sık yaptığınız bir işlem olduğundan, işlemi otomatikleştirmeniz daha iyi olur.

Çoğu çerçeve, argümanları kolay bir görevi ayrıştırmanın bir yolunu sunar. Bunun için kendi nesnenizi oluşturabilirsiniz. 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 bu şekeri büyük miktarda kullanır.

Ama bundan daha fazlasını konuşuyorsunuz, "// Hatayı burada ele alın". 2 işi karıştırıyorsunuz: verileri almak ve işlemek. Bu hiç de aynı değil.

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

Formunuzun verilerini temsil eden nesneler oluşturun, ardından işlemleri ekleyin ve ona geri dönün. Hızlı bir PHP betiğini hackleyen çok daha fazla iş geliyor (ve ilk kez), ancak her zamanki PHP ile form doğrulaması hızla spaguetti kodu olma eğiliminde olduğundan yeniden kullanılabilir, esnek ve çok daha az hataya eğilimlidir.


22
İstediğinin tam tersini yaptın ... basitlik.
TravisO

2

Bu dizileri ve dizeleri kontrol eder :

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

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

Fena değil. PHPst'in yanıtı aynı ama daha kısaca yapar.
Allain Lalonde

2

daha sağlam olmak için (tablolama, geri dönüş…), şunu tanımlarım:

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

kaynaklar:


1

Bir alan için bir değer sağlandığını kontrol etmek istediğinizde, o alan a string, a arrayveya tanımlanmamış olabilir. Yani, aşağıdakiler yeterlidir

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

0

Bunun için boş () kullanılır, ancak boş () davranışı birkaç kez değişmiştir. Her zaman olduğu gibi, php dokümanları her zaman tam davranış için en iyi kaynaktır ve bu sayfalardaki yorumlar genellikle zaman içindeki değişikliklerin iyi bir geçmişini sağlar. Nesne özelliklerinin eksikliğini kontrol etmek istiyorsanız, şu anda çok defansif bir yöntem:

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.