잘못된 형식의 숫자 값이 있습니다.


120

DB에 추가 할 PHP 스크립트에 두 개의 날짜 (시작 및 종료)를 전달하는 양식이 있습니다. 이것을 확인하는 데 문제가 있습니다. 다음과 같은 오류가 계속 발생합니다.

잘못된 형식의 숫자 값이 있습니다.

이것은 내가 다음을 사용할 때

date("d",$_GET['start_date']);

그러나 많은 사이트에서 권장하는대로 strtotime () 함수를 사용하면 1970 년 1 월 1 일의 유닉스 타임 스탬프 날짜가 표시됩니다. 정확한 날짜를 얻는 방법에 대한 아이디어가 있습니까?


5
$_GET['start_date']포함 된 내용을 게시해야합니다 .
JohnP

1
나는 당신이 생각 $_GET['start_date']하지 않은 것입니다 타임 스탬프 에 의해 예상되는 date두 번째 인수로 기능
Nemoden

DChaplin의 두 번째 답변은이 경우에 더 적절합니다
cw24

내가 조인하지 않은 테이블에서 선택하려고 할 때 이것을 얻었습니다 ..
Connor Leech

답변:


225

정수 여야하는 날짜 함수에 두 번째 인수로 문자열을 전달하기 때문입니다.

문자열 날짜 (문자열 $ format [, int $ timestamp = time ()])

영어 텍스트 날짜 / 시간 설명을 Unix 타임 스탬프 (정수) 로 구문 분석 하는 strtotime 을 사용해보십시오 .

date("d", strtotime($_GET['start_date']));

1
나는 클래스의 생성자에서 같은 오류가 발생, 난 디버깅되었으며 그 생성자의 문제는이 매개 변수와 정수로 수신하고있어됩니다public function __construct(int $someId....)
마르코스 디 파올로

PHP에서 매개 변수 입력이 '표준'이됨에 따라 @MarcosDiPaolo가 언급 한 내용이 더 자주 표시 될 것입니다. 죽은 공짜는 스택 추적이 잘못 입력 된 매개 변수 선언의 행을 가리킬 것이라는 점입니다.
parttimeturtle

@parttimeturtle
Marcos Di Paolo

@MarcosDiPaolo 해당 생성자에 전달하는 매개 변수의 유형은 함수 정의에 힌트되는 유형과 일치해야합니다. 문자열로 표시되는 "4"는 정수로 표시되는 4와 다릅니다. 따라서 실제로 '유사한'값을 통합해야하는 경우 함수 정의를 따르거나 엄격한 유형을 해제합니다. 예를 들어 문자열 "4"를 정수 4로 통합합니다.
parttimeturtle

9

단순히 strtotime()함수를 사용하여이 문제를 해결할 수 있습니다 .

date("d", strtotime($_GET['start_date']));

7

$_GET['start_date']숫자가 아닙니다.하지만에서 지원하지 않는 날짜 형식 strtotime입니다. strtotime 에 대해 실행 가능한 형식으로 날짜를 다시 형식화 하거나 explode / mktime 조합을 사용해야 합니다.

현재 받고있는 형식을 게시하기에 충분히 친절하다면 예를 추가 할 수 있습니다.


PHP가 메서드에 전달 될 때 자동으로 캐스팅하므로 캐스팅은 문제를 해결하지 않습니다.
JohnP

5

나는이 같은 상황에 부딪혔다 (내 경우에는 Drupal보기의 사용자 정의 PHP 필드에 날짜 값이 있음), 나를 위해 일한 것은 strtotime 대신 intval을 사용하여 값을 정수로 바꾸는 것이 었습니다. 기본적으로 타임 스탬프이기 때문입니다. 이지만 정수가 아닌 문자열 형식입니다. 분명히 모든 사람에게 해당되는 것은 아니지만 시도해 볼 가치가 있습니다.


5

이 오류는 숫자 (영숫자)와 결합 된 문자를 사용하는 변수로 계산을 수행 할 때 발생합니다 (예 : 24kb, 886ab ...

다음 기능에 오류가 있습니다.

function get_config_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);       
    switch($last) {
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }
    return $this->fix_integer_overflow($val);
}

응용 프로그램이 이미지를 업로드하지만 작동하지 않고 다음 경고가 표시되었습니다.

여기에 이미지 설명 입력

솔루션 :intval()함수는 영숫자 데이터가있는 변수의 정수 값을 추출하고 동일한 값을 가진 새 변수를 생성하지만 intval()함수 를 사용하여 정수로 변환 합니다. 다음은 코드입니다.

function get_config_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);
    $intval = intval(trim($val));
    switch($last) {
        case 'g':
            $intval *= 1024;
        case 'm':
            $intval *= 1024;
        case 'k':
            $intval *= 1024;
    }
    return $this->fix_integer_overflow($intval);
}


1

이것은 오래된 질문이지만이 메시지가 발생할 수있는 또 다른 미묘한 방법이 있습니다. 여기 문서에서 꽤 잘 설명 되어 있습니다.

이 scenerio를 상상해보십시오.

try {
  // code that triggers a pdo exception
} catch (Exception $e) {
  throw new MyCustomExceptionHandler($e);
}

그리고 MyCustomExceptionHandler대략 다음과 같이 정의됩니다.

class MyCustomExceptionHandler extends Exception {
  public function __construct($e) {
    parent::__construct($e->getMessage(), $e->getCode());
  }
}

Exception클래스가 생성자의 두 번째 매개 변수에 대한 숫자를 예상하고 있지만 PDOException의 반환 유형을 $e->getCode()문자열 로 동적으로 변경했을 수 있기 때문에 이것은 실제로 사용자 지정 예외 처리기에서 새 예외를 트리거 합니다.

이에 대한 해결 방법은 다음과 같은 사용자 지정 예외 처리기를 정의하는 것입니다.

class MyCustomExceptionHandler extends Exception {
  public function __construct($e) {
    parent::__construct($e->getMessage());
    $this->code = $e->getCode();
  }
}

1

숫자 만 포함되어있는 경우 문자열을 전달하는 것이 반드시 문제가되는 것은 아닙니다.

이것이 발생할 수있는 또 다른 이유는 전후에 공백이있는 경우입니다. 예 : "1557399276"


0

계산시 오류가 발생한 경우 값에 쉼표 (,)가 포함되어 있지 않은지 다시 확인하십시오. 값은 정수 / 부동 형식이어야합니다.


0

date_default_timezone_set ()을 사용하여 시간대를 설정해야합니다.


0

제 경우에는 sem_get 의 열쇠였습니다.

sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [,
          int $auto_release = 1 ]]] 
          ) : resource

$ key는 정수 여야합니다. 그렇지 않으면 다음 오류가 발생합니다.

PHP주의 사항 : 잘못된 형식의 숫자 값이


0

$ _GET [ 'start_date']가 문자열이면 정수 또는 double로 변환하여 숫자로 처리합니다.

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.