Ditemukan nilai numerik yang tidak terbentuk dengan baik


120

Saya memiliki formulir yang melewati dua tanggal (mulai dan selesai) ke skrip PHP yang akan menambahkannya ke DB. Saya mengalami masalah saat memvalidasi ini. Saya terus mendapatkan kesalahan berikut

Ditemukan nilai numerik yang tidak terbentuk dengan baik

Ini adalah saat saya menggunakan yang berikut ini

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

Tetapi ketika saya menggunakan fungsi strtotime () seperti yang disarankan oleh banyak situs, saya mendapatkan tanggal stempel waktu unix 1/1/1970. Ada ide bagaimana saya bisa mendapatkan tanggal yang benar?


5
Anda perlu memposting apa yang $_GET['start_date']berisi.
YohanesP

1
Saya menganggap Anda $_GET['start_date']bukan stempel waktu yang diharapkan oleh datefungsi sebagai argumen kedua
Nemoden

Jawaban kedua dari DChaplin lebih tepat dalam kasus ini
cw24

Saya mendapatkan ini saat mencoba memilih dari tabel yang belum saya ikuti ..
Connor Leech

Jawaban:


225

Karena Anda meneruskan string sebagai argumen kedua ke fungsi tanggal, yang seharusnya berupa bilangan bulat.

tanggal string (string $ format [, int $ timestamp = time ()])

Coba strtotime yang akan mengurai tentang deskripsi tanggal waktu tekstual bahasa Inggris apa pun menjadi stempel waktu Unix (integer):

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

1
Saya mendapatkan kesalahan yang sama dalam konstruktor kelas, saya melakukan debug dan masalah dalam konstruktor itu adalah saya menerima sebagai parameter dan bilangan bulatpublic function __construct(int $someId....)
Marcos Di Paolo

Dengan pengetikan parameter dalam PHP menjadi lebih 'norma', apa yang disebutkan @MarcosDiPaolo pasti akan lebih sering terlihat. Sebuah giveaway mati adalah jejak tumpukan akan mengarah ke baris deklarasi parameter yang salah ketik.
parttimeturtle

Saya masih tidak mengerti apa yang harus dilakukan di sini @parttimeturtle
Marcos Di Paolo

@MarcosDiPaolo Jenis parameter yang Anda teruskan ke konstruktor itu harus cocok dengan Jenis yang diisyaratkan dalam definisi fungsi. "4" yang diwakili oleh string berbeda dari 4 yang diwakili oleh integer. Jadi, sesuaikan dengan definisi fungsi atau nonaktifkan tipe ketat, jika Anda benar-benar perlu menggabungkan nilai 'serupa', misalnya string "4" ke integer 4.
parttimeturtle

9

Cukup Anda bisa menyelesaikan masalah ini menggunakan strtotime()fungsi.

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

7

$_GET['start_date']bukan numerik adalah taruhan saya, tetapi format tanggal tidak didukung oleh strtotime. Anda perlu memformat ulang tanggal ke format yang bisa diterapkan untuk waktu tempuh atau menggunakan kombinasi explode / mktime .

Saya dapat menambahkan Anda contoh jika Anda berbaik hati mengirim format yang Anda terima saat ini.


Transmisi tidak akan memperbaiki masalah karena PHP akan secara otomatis mentransmisikannya saat diteruskan ke metode.
JohnP

5

Saya mengalami situasi yang sama ini (dalam kasus saya dengan nilai tanggal dalam bidang PHP kustom dalam tampilan Drupal), dan yang berhasil bagi saya adalah menggunakan intval, bukan strtotime untuk mengubah nilai menjadi integer - karena pada dasarnya itu adalah stempel waktu , tetapi dalam bentuk string, bukan integer. Jelas bukan itu yang terjadi pada semua orang, tetapi mungkin patut dicoba.


5

Kesalahan ini terjadi saat Anda melakukan kalkulasi dengan variabel yang menggunakan huruf yang digabungkan dengan angka (alfanumerik), misalnya 24kb, 886ab ...

Saya mengalami kesalahan dalam fungsi berikut

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

Aplikasi mengunggah gambar tetapi tidak berhasil, itu menunjukkan peringatan berikut:

masukkan deskripsi gambar di sini

Solusi: The intval()fungsi ekstrak nilai integer dari variabel dengan data alfanumerik dan menciptakan sebuah variabel baru dengan nilai yang sama tetapi dikonversi ke integer dengan intval()fungsi. Ini kodenya:

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

Ini sangat membantu saya -

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

1

Ini adalah pertanyaan lama, tetapi ada cara halus lain pesan ini bisa terjadi. Ini dijelaskan dengan cukup baik di sini, di dokumen .

Bayangkan pemandangan ini:

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

Dan MyCustomExceptionHandlerdiartikan secara kasar seperti:

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

Ini sebenarnya akan memicu pengecualian baru di penangan pengecualian khusus karena Exceptionkelas mengharapkan angka untuk parameter kedua dalam konstruktornya, tetapi PDOExceptionmungkin secara dinamis mengubah jenis kembalian dari$e->getCode() ke string.

Solusi untuk ini adalah dengan menentukan Anda pengendali pengecualian khusus seperti:

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

1

Meneruskan string tidak selalu menjadi masalah, jika hanya berisi angka.

Salah satu alasan lain hal ini dapat terjadi adalah jika Anda memiliki spasi sebelum atau sesudah. Misalnya "1557399276"


0

Jika kesalahan terjadi pada saat penghitungan apa pun, periksa kembali apakah nilainya tidak mengandung koma (,). Nilai harus hanya dalam format integer / float.


0

Anda perlu menyetel zona waktu menggunakan date_default_timezone_set ().


0

Dalam kasus saya itu adalah kunci untuk sem_get

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

$ key harus berupa int, jika tidak, Anda akan mendapatkan error berikut:

Pemberitahuan PHP: Nilai numerik yang tidak terbentuk dengan baik ditemukan di


0

jika $ _GET ['start_date'] adalah sebuah string maka konversikan dalam integer atau double untuk menangani numerik.

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.