Gặp phải giá trị số không được định dạng tốt


120

Tôi có một biểu mẫu chuyển hai ngày (bắt đầu và kết thúc) sang một tập lệnh PHP sẽ thêm những ngày đó vào DB. Tôi đang gặp sự cố khi xác thực điều này. Tôi tiếp tục mắc các lỗi sau

Gặp phải giá trị số không được định dạng tốt

Đây là khi tôi sử dụng

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

Nhưng khi tôi sử dụng hàm strtotime () theo lời khuyên của nhiều trang web, tôi nhận được ngày dấu thời gian unix là 1/1/1970. Bất kỳ ý tưởng làm thế nào tôi có thể có được ngày chính xác?


5
Bạn cần đăng những gì $_GET['start_date']có chứa.
JohnP

1
Tôi cho rằng của bạn $_GET['start_date']không phải là dấu thời gian được datehàm như một đối số thứ hai mong đợi
Nemoden

Câu trả lời thứ hai từ DChaplin là thích hợp hơn trong trường hợp này
cw24

Tôi nhận được điều này khi cố gắng chọn từ một bàn mà tôi không tham gia ..
Connor Leech

Câu trả lời:


225

Bởi vì bạn đang chuyển một chuỗi làm đối số thứ hai cho hàm date, nên là một số nguyên.

chuỗi ngày (chuỗi $ format [, int $ timestamp = time ()])

Hãy thử strtotime sẽ phân tích cú pháp về bất kỳ mô tả datetime bằng văn bản tiếng Anh nào thành dấu thời gian Unix (số nguyên):

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

1
Tôi gặp lỗi tương tự trong hàm tạo của một lớp, tôi đang gỡ lỗi và vấn đề trong hàm tạo đó là tôi đang nhận dưới dạng tham số và số nguyênpublic function __construct(int $someId....)
Marcos Di Paolo

Với việc nhập tham số trong PHP ngày càng trở thành 'chuẩn mực', những gì @MarcosDiPaolo đề cập chắc chắn sẽ được nhìn thấy thường xuyên hơn. Một phần quà chết là dấu vết ngăn xếp sẽ trỏ đến dòng khai báo tham số đang được nhập sai.
parttimeturtle

Tôi vẫn không hiểu quá trình hoạt động ở đây là gì @parttimeturtle
Marcos Di Paolo

@MarcosDiPaolo Các loại tham số bạn chuyển cho hàm tạo đó phải khớp với các Loại đang được gợi ý trong định nghĩa hàm. "4" được biểu thị bằng một chuỗi khác với 4 được biểu thị bằng một số nguyên. Vì vậy, hãy tuân theo định nghĩa hàm hoặc tắt các loại nghiêm ngặt, nếu bạn thực sự cần kết hợp các giá trị 'tương tự', ví dụ: chuỗi "4" với số nguyên 4.
parttimeturtle

9

Đơn giản bạn có thể giải quyết vấn đề này bằng cách sử dụng strtotime()chức năng.

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

7

$_GET['start_date']không phải là số là đặt cược của tôi, nhưng một định dạng ngày không được hỗ trợ bởi strtotime. Bạn sẽ cần phải định dạng lại ngày thành một định dạng khả thi cho strtotime hoặc sử dụng kết hợp bùng nổ / mktime .

Tôi có thể thêm cho bạn một ví dụ nếu bạn đủ tử tế để đăng định dạng bạn hiện nhận được.


Truyền sẽ không khắc phục được sự cố vì PHP sẽ tự động truyền nó khi được chuyển cho phương thức.
JohnP

5

Tôi đã gặp phải tình huống tương tự (trong trường hợp của tôi với giá trị ngày tháng trong trường PHP tùy chỉnh trong chế độ xem Drupal) và điều phù hợp với tôi là sử dụng intval thay vì strtotime để biến giá trị thành số nguyên - vì về cơ bản nó là một dấu thời gian , nhưng ở dạng chuỗi thay vì số nguyên. Rõ ràng đó sẽ không phải là trường hợp của tất cả mọi người, nhưng nó có thể đáng để thử.


5

Lỗi này xảy ra khi bạn thực hiện các phép tính với các biến sử dụng chữ cái kết hợp với số (chữ và số), ví dụ: 24kb, 886ab ...

Tôi đã gặp lỗi trong chức năng sau

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

Ứng dụng tải lên hình ảnh nhưng nó không hoạt động, nó hiển thị cảnh báo sau:

nhập mô tả hình ảnh ở đây

Giải pháp: Các intval()chức năng trích xuất các giá trị số nguyên của một biến với dữ liệu chữ và số và tạo ra một biến mới với giá trị tương tự nhưng chuyển đổi sang một số nguyên với các intval()chức năng. Đây là mã:

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

3

Điều này đã giúp tôi rất nhiều -

$new_date = date_format(date_create($old_date), 'Y-m-d');

1

Đây là một câu hỏi cũ, nhưng có một cách tinh tế khác mà thông điệp này có thể xảy ra. Nó được giải thích khá tốt ở đây, trong tài liệu .

Hãy tưởng tượng bối cảnh này:

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

MyCustomExceptionHandlerđược định nghĩa gần giống như:

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

Điều này thực sự sẽ kích hoạt một ngoại lệ mới trong trình xử lý ngoại lệ tùy chỉnh vì Exceptionlớp đang mong đợi một số cho tham số thứ hai trong phương thức khởi tạo của nó, nhưng PDOExceptioncó thể đã tự động thay đổi kiểu trả về $e->getCode()thành một chuỗi.

Một giải pháp cho điều này sẽ là xác định trình xử lý ngoại lệ tùy chỉnh của bạn như:

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

1

Truyền một chuỗi không nhất thiết là một vấn đề, nếu nó chỉ chứa các chữ số.

Một lý do khác mà điều này có thể xảy ra là nếu bạn có khoảng trắng trước hoặc sau. Ví dụ: "1557399276"


0

Nếu lỗi xảy ra tại bất kỳ thời điểm tính toán nào, hãy kiểm tra kỹ các giá trị có chứa bất kỳ dấu phẩy (,) nào không. Giá trị chỉ được ở định dạng số nguyên / số thực.


0

Bạn cần đặt múi giờ bằng date_default_timezone_set ().


0

Trong trường hợp của tôi, nó là chìa khóa cho sem_get

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

$ key phải là int, nếu không bạn sẽ gặp lỗi sau:

Thông báo PHP: Một giá trị số không được định dạng tốt gặp phải trong


0

nếu $ _GET ['start_date'] là một chuỗi thì hãy chuyển nó thành số nguyên hoặc kép để xử lý theo số.

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.