Cara yang lebih baik untuk memeriksa variabel untuk string null atau kosong?

174

Karena PHP adalah bahasa yang dinamis, apa cara terbaik untuk memeriksa untuk melihat apakah bidang yang disediakan kosong?

Saya ingin memastikan bahwa:

  1. null dianggap sebagai string kosong
  2. string white space only dianggap kosong
  3. bahwa "0" tidak dianggap kosong

Inilah yang saya dapatkan sejauh ini:

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

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

Harus ada cara yang lebih sederhana untuk melakukan ini?

Allain Lalonde
sumber
1
Saya akan mengatakan menggunakan kosong ($ pertanyaan), tetapi itu juga menganggap 0 kosong.
Powerlord
2
kondisi yoda mengerikan
user3791372

Jawaban:

278
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str){
    return (!isset($str) || trim($str) === '');
}
Michael Haren
sumber
7
Meskipun ini menyelesaikannya, saya tidak yakin apakah ini lebih sederhana. Pokoknya +1
Allain Lalonde
4
Karena OP meminta versi 'sederhana' dari operasi yang sangat sederhana, saya akan mengatakan bahwa 'lebih baik' adalah apa yang sebenarnya dijamin.
chaos
2
Saya mengubahnya menjadi fungsi. ini akan membuat kode validasi Anda lebih mudah
Michael Haren
7
apa tujuan dari! isset () di sini? apa bedanya dengan is_null ()?
nickf
2
juga kembalikan (! kosong ($ pertanyaan) || trim ($ pertanyaan) === '');
SpYk3HH
109

Posting lama tetapi seseorang mungkin membutuhkannya seperti saya;)

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

ganti $strdengan variabel Anda. NULLdan ""keduanya mengembalikan 0 saat menggunakan strlen.

jrowe
sumber
4
Dan selalu ada:if(strcmp('', $var) == 0)...
peter
12
Mengapa == 0 dan bukan hanya jika (strlen ($ str))?
Noumenon
14
@Noumenon Karena itu akan merusak keterbacaan tanpa menyelesaikan apa pun. Sangat mudah untuk membaca saran Anda sebagai "jika ada panjang" sementara itu (tentu saja) berarti sebaliknya.
Mattias Åslund
11
Tidak akan membantu untuk string dengan spasi saja, jika seseorang peduli untuk itu
airboss
5
Jika variabel tidak disetel, ini akan menghasilkan peringatan
Konstantin Pereiaslov
25

Gunakan fungsi PHP kosong (). Hal-hal berikut dianggap kosong

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

Untuk lebih jelasnya periksa fungsi kosong

kta
sumber
7
Poster mengatakan bahwa mereka TIDAK ingin mempertimbangkan "0" kosong
dougd_in_nc
18

Saya akan dengan rendah hati menerima jika saya salah, tetapi saya menguji sendiri dan menemukan bahwa berikut ini berfungsi untuk menguji kedua string (0) "" dan variabel bernilai NULL:

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

Yang juga dapat dibalik untuk menguji kesuksesan seperti:

if ( !$question ) {
  // Handle error here
}
Adal
sumber
bolehkah saya menyarankan "if (trim ($ n)) .." kalau tidak, jika $ _POST var (misalnya) hanyalah "", itu akan dianggap valid, sedangkan, dalam banyak kasus ini sama baiknya dengan string kosong
StartupGuy
Jika "" bukan nilai yang dapat diterima untuk fungsi tertentu, maka menggunakan trim akan menjadi ide bagus.
Adal
3
Ini akan menghasilkan false untuk "0", angka 0 atau 0,0, dan FALSE.
Vedmant
7

Hati-hati negatif palsu dari trim()fungsi - ia melakukan cast-to-string sebelum pemangkasan, dan dengan demikian akan mengembalikan misalnya "Array" jika Anda memberikannya array kosong. Itu mungkin bukan masalah, tergantung pada bagaimana Anda memproses data Anda, tetapi dengan kode yang Anda berikan, bidang bernama question[]bisa diberikan dalam data POST dan tampaknya bukan string kosong. Sebaliknya, saya akan menyarankan:

$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
Ben Blank
sumber
Id mengatakan jika Anda mendapatkan array di mana Anda mengharapkan sebuah string, itu harus menjadi kesalahan. Jika Anda mengharapkan array maka Anda harus memiliki fungsi penyaringan yang terpisah untuk itu.
OIS
Bukankah kode itu memperlakukannya sebagai kesalahan? Jika penyaringan dilakukan di tempat lain, harus diperhatikan bahwa itu bukan duplikasi pengetahuan tentang aturan validasi args ke tempat yang terpisah.
Grantwparks
3

Tidak ada cara yang lebih baik tetapi karena ini adalah operasi yang biasanya Anda lakukan cukup sering, Anda sebaiknya mengotomatiskan prosesnya.

Sebagian besar kerangka kerja menawarkan cara untuk membuat argumen parsing tugas yang mudah. Anda dapat membangun objek sendiri untuk itu. Contoh cepat dan kotor:

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 menggunakan gula semacam itu secara besar-besaran.

Tetapi Anda berbicara lebih dari itu, dengan "// Menangani kesalahan di sini". Anda mencampur 2 pekerjaan: mendapatkan data dan memprosesnya. Ini tidak sama sekali.

Ada mekanisme lain yang dapat Anda gunakan untuk memvalidasi data. Sekali lagi, kerangka kerja dapat menunjukkan Anda praktik terbaik.

Buat objek yang mewakili data formulir Anda, lalu lampirkan proses dan kembali ke sana. Kedengarannya jauh lebih banyak pekerjaan yang meretas skrip PHP cepat (dan ini adalah pertama kalinya), tetapi itu dapat digunakan kembali, fleksibel, dan jauh lebih rentan kesalahan karena validasi bentuk dengan PHP biasa cenderung dengan cepat menjadi kode spaguetti.

e-satis
sumber
21
Anda melakukan kebalikan dari apa yang dia inginkan ... kesederhanaan.
TravisO
2

Yang ini memeriksa array dan string:

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

  return strlen(trim($val)) ? true : false;
}
Chris Clower
sumber
Tidak buruk. Jawaban oleh PHPst melakukan hal yang sama tetapi lebih ringkas.
Allain Lalonde
2

untuk menjadi lebih kuat (tabulasi, kembali ...), saya mendefinisikan:

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

sumber:

bcag2
sumber
1

Saat Anda ingin memeriksa apakah suatu nilai disediakan untuk suatu bidang, bidang itu mungkin a string, an array, atau tidak terdefinisi. Jadi, berikut ini sudah cukup

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

kosong () digunakan untuk bekerja untuk ini, tetapi perilaku kosong () telah berubah beberapa kali. Seperti biasa, dokumen php selalu menjadi sumber terbaik untuk perilaku yang tepat dan komentar pada halaman tersebut biasanya memberikan sejarah perubahan yang baik dari waktu ke waktu. Jika Anda ingin memeriksa kekurangan properti objek, metode yang sangat defensif saat ini adalah:

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