2011-07-06 4 views
8

현재 Doctrine 2와 MySQL을 사용하고 있습니다. MySQL에서 datetime 필드를 PHP에서 각각 DateTime으로 작업 할 때 몇 가지 문제가 발생합니다. 내 데이터베이스에서 날짜 값이 "0000-00-00"이면 PHP에서이 값은 -0001-11-30으로 변환됩니다. 나는 그것에 대해 기쁘게 생각합니다, 그래서 나는 "0000-00-00"날짜의 가치를 확인해야합니다. 이 문제에 도움이되는 사람이 있습니까? 감사.PHP가 0000-00-00 값을 가진 DateTime 객체를 -0001-11-30으로 변환하는 것을 막는 방법

N.B. "0000-00-00"대신 "-0001-11-30"을 확인하는 것이 옳은지 생각하고 있습니다.

+1

@domanokz - * 표시 잘못의 단계가 될 것입니다 * 방향 –

+0

그래, 내가 잊고, PHP의 변수는 그것의 변경 내용에 따라 데이터 유형. – dpp

답변

7

날짜가 설정되지 않은 경우 NULL을 사용하여 해당 상태를 나타냅니다. 이를 통해 문제가 해결되고 데이터베이스 스키마가 훨씬 명확하고 상세하게 표시됩니다.

-4

에 설명 된대로 내가 이것을 사용 날짜

$date = new DateTime('0000-00-00 00:00'); 
if (DateTime::createFromFormat('Y-m-d', $date->format('Y-m-d'))) { 
    // Valid 
} else { 
    // Not valid 
} 
0

을이 문제를 방지 안다 검증이 조각을 사용하여, 사용자의 현재 세션을 설정할 수 있습니다 내 코드 전체에서 작동합니다. Date-like 문자열이나 DateTime (Immutable) 객체를 전달하십시오. PHP DateTime 또는 DateTimeImmutable 객체가 유출됩니다. 입력이 "0000-00-00"과 같은 문자열이면 false입니다. 두 번째 매개 변수로 또한 불변 여부로 결과를 강제 할 수

function ensureDateTime ($input, $immutable = NULL) { 
    if (! $input instanceof \DateTimeInterface) { 
     if (in_array($input, ['0000-00-00', '0000-00-00 00:00:00'], true)) { 
      $input = false; 
     } elseif ($immutable) { 
      $input = new \DateTimeImmutable($input); 
     } else { 
      $input = new \DateTime($input); 
     } 
    } elseif (true === $immutable && $input instanceof \DateTime) { 
     $input = new \DateTimeImmutable($input->format(TIMESTAMPFORMAT), $input->getTimezone()); 
    } elseif (false === $immutable && $input instanceof \DateTimeImmutable) { 
     $input = new \DateTime($input->format(TIMESTAMPFORMAT), $input->getTimezone()); 
    } 
    return $input; 
} 

기본적으로 "내가 시작 모르겠어요,하지만 난 내가 원하는 걸 알고있다", 기능.

(참고 : 여기에 PHP 7 구문의 비트,하지만 쉽게 PHP 5에 적용)

관련 문제