null 또는 빈 문자열에 대한 변수를 확인하는 더 좋은 방법은 무엇입니까?


174

PHP는 동적 언어이므로 제공된 필드가 비어 있는지 확인하는 가장 좋은 방법은 무엇입니까?

나는 그것을 보장하고 싶다 :

  1. null은 빈 문자열로 간주됩니다
  2. 공백 만있는 문자열은 비어있는 것으로 간주됩니다.
  3. "0"은 비어있는 것으로 간주되지 않습니다

이것이 내가 지금까지 얻은 것입니다.

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

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

이 작업을 수행하는 더 간단한 방법이 있어야합니까?


1
empty ($ question)을 사용한다고 말하지만 0은 비어 있다고 간주합니다.
Powerlord

2
yoda 조건은
무섭다

답변:


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
나는 그것을 기능으로 바꾸었다. 이 간단한 유효성 검사 코드를 확인해야합니다
마이클 하렌

7
! isset ()의 목적은 무엇입니까? is_null ()과 어떻게 다른가요?
nickf

2
또한 return (! empty ($ question) || trim ($ question) === '');
SpYk3HH

109

오래된 게시물이지만 누군가가 내가 한 것처럼 필요할 수도 있습니다.)

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

$str변수로 대체 하십시오. NULL""사용할 때 둘 다 0을 반환 strlen합니다.


4
그리고 항상있다 :if(strcmp('', $var) == 0)...
피터

12
(strlen ($ str))이 아니라 == 0 인 이유는 무엇입니까?
누 메논

14
@Noumenon 그 이유는 아무것도 해결하지 않으면 서 가독성을 떨어 뜨리기 때문입니다. "길이가 있다면"(물론) 반대의 의미로 당신의 제안을 읽는 것은 정말 쉽습니다.
Mattias Åslund

11
공백 문자열을하지 도움이 될 것입니다 만, 만약 그 누군가의 염려
airboss

5
변수를 설정하지 않으면 경고가 표시됩니다.
Konstantin Pereiaslov

25

PHP의 empty () 함수를 사용하십시오. 다음은 비어있는 것으로 간주됩니다

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

내가 틀렸다면 겸손히 받아 들일 것이지만, 나는 내 자신의 목적으로 테스트했으며 string (0) ""및 NULL 값 변수를 테스트하는 데 다음이 작동한다는 것을 알았습니다.

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

성공 여부를 테스트하기 위해 되돌릴 수도 있습니다.

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

"(($ N)를 트림)하면 .."나는 제안 할 수 있습니다 (예를 들어)를 $ _POST VAR은 단순히 그렇지 않은 경우 ""대부분의 경우이 빈 문자열 좋은으로 반면이 유효한 것으로 간주 될 것이다
StartupGuy

""가 특정 기능에 허용되는 값이 아닌 경우 트림을 사용하는 것이 좋습니다.
Adal

3
"0", 숫자 0 또는 0.0 및 FALSE에 대해 false를 리턴합니다.
Vedmant

7

trim()함수 에서 오 탐지에주의하십시오. 트리밍하기 전에 문자열로 캐스트를 수행하므로 빈 배열을 전달하면 "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

그 코드는 그것을 오류로 취급하지 않습니까? 필터링이 다른 곳에서 수행되는 경우 인수의 유효성 검사 규칙에 대한 지식이 별도의 장소로 복제되지 않도록주의해야합니다.
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);

심포니는 그런 종류의 설탕을 대량으로 사용합니다.

그러나 "// 여기에서 오류 처리"를 사용하여 그 이상에 대해 이야기하고 있습니다. 데이터를 가져 와서 처리하는 두 가지 작업을 혼합하고 있습니다. 이것은 전혀 동일하지 않습니다.

데이터를 확인하는 데 사용할 수있는 다른 메커니즘이 있습니다. 다시 말해, 프레임 워크는 최고의 실용성을 보여줄 수 있습니다.

양식의 데이터를 나타내는 객체를 만든 다음 프로세스를 첨부하고 다시 사용합니다. 빠른 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 문서는 항상 정확한 행동을위한 최고의 소스이며 해당 페이지의 주석은 일반적으로 시간이 지남에 따라 변경 내역을 제공합니다. 객체 속성이 없는지 확인하려는 경우 현재 매우 방어적인 방법은 다음과 같습니다.

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.