İyi biçimlendirilmemiş bir sayısal değerle karşılaşıldı


120

Bir PHP betiğine iki tarih (başlangıç ​​ve bitiş) geçiren ve bunları DB'ye ekleyen bir formum var. Bunu doğrulamakta sorunlar yaşıyorum. Devamlı aşağıdaki hataları alıyorum

İyi biçimlendirilmemiş bir sayısal değerle karşılaşıldı

Bu, aşağıdakileri kullandığım zamandır

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

Ancak strtotime () işlevini birçok site tarafından tavsiye edildiği gibi kullandığımda, 1/1/1970 olan bir unix zaman damgası tarihi alıyorum. Doğru tarihi nasıl bulabileceğime dair bir fikrin var mı?


5
İçindekileri göndermeniz gerekiyor $_GET['start_date'].
JohnP

1
Sanırım senin $_GET['start_date'], ikinci bir argüman olarak işlev tarafından beklenen bir zaman damgası değildate
Nemoden

DChaplin'in ikinci cevabı bu durumda daha uygun
cw24

Katılmadığım bir tablodan seçim yapmaya çalışırken bunu anladım ..
Connor Leech

Yanıtlar:


225

Çünkü tarih işlevine ikinci argüman olarak bir tamsayı olması gereken bir dize geçiriyorsunuz.

dize tarihi (string $ format [, int $ zaman damgası = zaman ()])

Deneyin strtotime edecek herhangi İngiliz bir Unix zaman damgası içine tarih saat açıklamasına metinsel hakkında Parse (tamsayı):

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

1
Bir sınıfın kurucusunda aynı hatayı alıyorum, hata ayıklıyordum ve bu kurucudaki sorun bir parametre ve tamsayı olarak alıyorumpublic function __construct(int $someId....)
Marcos Di Paolo

PHP'de parametre yazmanın daha 'norm' haline gelmesiyle, @MarcosDiPaolo'nun bahsettiği şeyler kesinlikle daha sık görülecektir. Ölü bir bilgi, yığın izlemenin yanlış yazılan parametre bildiriminin satırına işaret etmesidir.
parttimeturtle

Hala buradaki eylemin ne olduğunu anlamıyorum @parttimeturtle
Marcos Di Paolo

@MarcosDiPaolo Bu kurucuya ilettiğiniz parametre türleri, işlev tanımında ipucu verilen Türlerle eşleşmelidir. Bir dizeyle temsil edilen "4", bir tamsayı ile temsil edilen 4'ten farklıdır. Dolayısıyla, 'benzer' değerleri gerçekten birleştirmeniz gerekiyorsa, işlev tanımına uyun veya katı türleri kapatın, örneğin "4" ile tamsayı 4 arasında
parttimeturtle

9

Bu sorunu basitçe strtotime()işlevi kullanarak çözebilirsiniz .

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

7

$_GET['start_date']Bahse girerim sayısal değildir, ancak tarafından desteklenmeyen bir tarih biçimi strtotime. Tarihi strtotime için uygulanabilir bir biçime yeniden biçimlendirmeniz veya patlatma / mktime kombinasyonunu kullanmanız gerekecektir .

Şu anda aldığınız formatı gönderecek kadar nazik olursanız size bir örnek ekleyebilirim.


Yönteme geçildiğinde PHP onu otomatik olarak yayınlayacağından çevrim sorunu çözmez.
JohnP

5

Aynı durumla karşılaştım (benim durumumda bir Drupal görünümünde özel bir PHP alanında bir tarih değeriyle) ve benim için işe yarayan şey, değeri bir tam sayıya dönüştürmek için strtotime yerine intval kullanmaktı - çünkü temelde bir zaman damgasıydı , ancak bir tamsayı yerine bir dize biçimindedir. Açıkçası bu herkes için geçerli olmayacak, ancak denemeye değer olabilir.


5

Bu hata, sayılarla birleştirilmiş harfleri (alfanümerik) kullanan değişkenlerle hesaplamalar yaptığınızda ortaya çıkar, örneğin 24kb, 886ab ...

Aşağıdaki işlevde hata aldım

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

Uygulama görüntüleri yüklüyor ancak çalışmıyor, aşağıdaki uyarıyı gösterdi:

görüntü açıklamasını buraya girin

Çözüm:intval() işlevi alfanümerik veriler ile bir değişkenin tamsayı değeri çıkarır ve aynı değer ile yeni bir değişken oluşturur fakat bir tam sayıya dönüştürülür intval()fonksiyonu. İşte kod:

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

Bu bana çok yardımcı oldu -

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

1

Bu eski bir soru, ancak bu mesajın gerçekleşmesinin başka bir ince yolu var. Burada, belgelerde oldukça iyi açıklanmıştır .

Bu senaryoyu hayal edin:

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

Ve MyCustomExceptionHandlerkabaca şöyle tanımlanır:

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

Bu, aslında özel istisna işleyicisinde yeni bir istisnayı tetikleyecektir çünkü Exceptionsınıf, yapıcısındaki ikinci parametre için bir sayı beklemektedir, ancak PDOExceptiondönüş türünü dinamik $e->getCode()olarak bir dizeye değiştirmiş olabilir .

Bunun için geçici bir çözüm, özel istisna işleyicinizi aşağıdaki gibi tanımlamak olabilir:

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

1

Yalnızca rakamlar içeriyorsa, bir dizeyi iletmek mutlaka bir sorun değildir.

Bunun olmasının bir başka nedeni de öncesinde veya sonrasında bir boşluk olması olabilir. Ör. "1557399276"


0

Hata herhangi bir hesaplama anında ortaya çıkıyorsa, değerlerin virgül (,) içermediğini iki kez kontrol edin. Değerler yalnızca tamsayı / kayar nokta biçiminde olmalıdır.


0

Date_default_timezone_set () kullanarak saat dilimini ayarlamanız gerekir.


0

Benim durumumda sem_get için anahtar buydu

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

$ anahtarı bir int olmalıdır, aksi takdirde aşağıdaki hatayı alırsınız:

PHP Bildirimi: İyi biçimlendirilmemiş bir sayısal değerle karşılaşıldı


0

$ _GET ['başlangıç_tarihi'] bir dizeyse, sayısal olarak ele almak için onu tam sayıya veya iki katına çevirin.

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.