วิธีที่ดีกว่าในการตรวจสอบตัวแปรสำหรับโมฆะหรือสตริงว่าง?


174

เนื่องจาก PHP เป็นภาษาแบบไดนามิกวิธีที่ดีที่สุดในการตรวจสอบเพื่อดูว่าเขตข้อมูลที่ให้ไว้ว่างเปล่าคืออะไร?

ฉันต้องการรับรองว่า:

  1. null ถือว่าเป็นสตริงว่าง
  2. สตริงสีขาวพื้นที่เท่านั้นถือว่าว่างเปล่า
  3. ว่า "0" ไม่ถือว่าว่างเปล่า

นี่คือสิ่งที่ฉันได้รับ:

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

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

จะต้องมีวิธีที่ง่ายกว่าในการทำเช่นนี้?


1
ฉันจะบอกว่าใช้ค่าว่าง (คำถาม $) แต่นั่นก็ถือว่า 0 เป็นค่าว่างด้วย
Powerlord

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 ต่อไป
Allain Lalonde

4
เนื่องจาก OP ขอรุ่นที่ 'เรียบง่าย' ของการดำเนินการที่ง่ายมากฉันจะบอกว่า 'ดีกว่า' คือสิ่งที่รับประกันจริง
ความโกลาหล

2
ฉันเปลี่ยนมันเป็นฟังก์ชั่น สิ่งนี้จะทำให้รหัสการตรวจสอบของคุณง่ายขึ้น
Michael Haren

7
วัตถุประสงค์ของ! isset () ที่นี่คืออะไร? is_null () แตกต่างกันอย่างไร?
nickf

2
กลับด้วย (! empty ($ คำถาม) || trim ($ คำถาม) === '');
SpYk3HH

109

โพสต์เก่า แต่บางคนอาจต้องการมันอย่างที่ฉันทำ;)

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

แทนที่$strด้วยตัวแปรของคุณ NULLและ""ทั้งผลตอบแทน 0 strlenเมื่อใช้


4
และมีเสมอ:if(strcmp('', $var) == 0)...
ปีเตอร์

12
ทำไม == 0 และไม่ใช่แค่ (strlen ($ str))
Noumenon

14
@Noumenon เพราะนั่นจะทำให้เสียการอ่านโดยไม่ต้องแก้ไขอะไร มันเป็นเรื่องง่ายที่จะอ่านคำแนะนำของคุณว่า "หากมีความยาว" ในขณะที่มัน (แน่นอน) หมายถึงสิ่งที่ตรงกันข้าม
Mattias Åslund

11
จะไม่ช่วยสำหรับสตริงที่มีช่องว่างเท่านั้นถ้ามีคนสนใจ
airboss

5
หากไม่ได้ตั้งค่าตัวแปรสิ่งนี้จะสร้างคำเตือน
Konstantin Pereiaslov

25

ใช้ฟังก์ชั่น empty () ของ 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 (ตัวอย่าง) เป็นเพียง "" มันจะถือว่าถูกต้องในขณะที่ในกรณีส่วนใหญ่นี่จะดีเท่ากับสตริงว่างเปล่า
StartupGuy

หาก "" ไม่ใช่ค่าที่ยอมรับได้สำหรับฟังก์ชั่นที่ระบุการใช้การตัดแต่งจะเป็นความคิดที่ดี
Adal

3
สิ่งนี้จะส่งคืนค่าเท็จสำหรับ "0" ตัวเลข 0 หรือ 0.0 และ FALSE
Vedmant

7

ระวังข้อผิดพลาดที่เป็นเท็จจากtrim()ฟังก์ชั่น - มันจะทำการ cast-to-string ก่อนที่จะทำการเล็มและดังนั้นจะส่งคืนเช่น "Array" ถ้าคุณผ่านอาร์เรย์ที่ว่างเปล่า นั่นอาจไม่เป็นปัญหาขึ้นอยู่กับว่าคุณประมวลผลข้อมูลของคุณอย่างไร แต่ด้วยรหัสที่คุณให้ไว้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

ID บอกว่าถ้าคุณได้รับอาร์เรย์ที่คุณคาดหวังสตริงมันควรจะเป็นข้อผิดพลาด หากคุณต้องการอาร์เรย์คุณควรมีฟังก์ชั่นการกรองแยกต่างหาก
OIS

รหัสนั้นไม่ถือเป็นข้อผิดพลาดหรือไม่? หากมีการกรองที่อื่นต้องระมัดระวังไม่ให้มีการทำซ้ำความรู้เกี่ยวกับกฎการตรวจสอบของ args ไปยังที่อื่น
grantwparks

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

Symfony ใช้น้ำตาลชนิดนั้นอย่างหนาแน่น

แต่คุณกำลังพูดถึงมากกว่านั้นด้วย "// จัดการข้อผิดพลาดของคุณที่นี่" คุณกำลังผสม 2 งาน: รับข้อมูลและประมวลผล สิ่งนี้ไม่เหมือนกันเลย

มีกลไกอื่น ๆ ที่คุณสามารถใช้ในการตรวจสอบข้อมูล อีกครั้งกรอบสามารถแสดง pratices ที่ดีที่สุด

สร้างวัตถุที่แสดงข้อมูลของแบบฟอร์มของคุณจากนั้นแนบโปรเซสและถอยกลับไป ฟังก์ชั่นการแฮ็คสคริปต์ PHP อย่างรวดเร็ว (และเป็นครั้งแรก) แต่มันสามารถนำกลับมาใช้ใหม่ได้มีความยืดหยุ่นและมีข้อผิดพลาดน้อยกว่าเนื่องจากการตรวจสอบรูปแบบด้วย PHP ปกติมักจะกลายเป็นรหัสสปาเก็ตตี้


22
คุณทำตรงข้ามกับสิ่งที่เขาต้องการ ... ความเรียบง่าย
TravisO

2

อันนี้ตรวจสอบอาร์เรย์และสตริง:

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

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

ไม่เลว. คำตอบโดย PHPst ทำเหมือนกัน แต่รัดกุมกว่า
Allain Lalonde

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

เมื่อคุณต้องการตรวจสอบว่าค่ามีไว้สำหรับฟิลด์ข้อมูลที่อาจstringเป็นarrayหรือ undifined ดังนั้นต่อไปนี้ก็เพียงพอแล้ว

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

0

empty () ใช้เพื่อทำงานนี้ แต่พฤติกรรมของ empty () มีการเปลี่ยนแปลงหลายครั้ง เช่นเคย php docs เป็นแหล่งที่ดีที่สุดสำหรับพฤติกรรมที่แน่นอนและความคิดเห็นในหน้าเหล่านั้นมักจะให้ประวัติที่ดีของการเปลี่ยนแปลงตลอดเวลา หากคุณต้องการตรวจสอบการขาดคุณสมบัติของวัตถุวิธีการป้องกันที่ดีในขณะนี้คือ:

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.