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?

Deviland
sumber
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']));
DChaplin
sumber
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']));
Faisal
sumber
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.

Wesley van Opdorp
sumber
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.

jaring laba-laba
sumber
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);
}
Vladimir Salguero
sumber
3

Ini sangat membantu saya -

$new_date = date_format(date_create($old_date), 'Y-m-d');
Tushar Walzade
sumber
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();
  }
}
Parris Varney
sumber
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"

Nuno
sumber
0

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

Arghadeeph Halder
sumber
0

Anda perlu menyetel zona waktu menggunakan date_default_timezone_set ().

AlanP
sumber
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

Tikar
sumber
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
A. Aleem 11
sumber