Napotkano nieprawidłową wartość liczbową


120

Mam formularz, który przekazuje dwie daty (początek i koniec) do skryptu PHP, który doda je do bazy danych. Mam problemy z potwierdzeniem tego. Ciągle otrzymuję następujące błędy

Napotkano nieprawidłową wartość liczbową

Wtedy używam następującego

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

Ale kiedy używam funkcji strtotime () zgodnie z zaleceniami wielu witryn, otrzymuję datę unixowego znacznika czasu 1/1/1970. Jakieś pomysły, jak uzyskać prawidłową datę?


5
Musisz opublikować, co $_GET['start_date']zawiera.
JohnP

1
Zakładam, że $_GET['start_date']nie jest to znacznik czasu, który jest oczekiwany przez datefunkcję jako drugi argument
Nemoden

Druga odpowiedź od DChaplin jest bardziej odpowiednia w tym przypadku
cw24

Dostałem to, próbując wybrać ze stołu, do którego nie dołączyłem ...
Connor Leech

Odpowiedzi:


225

Ponieważ jako drugi argument funkcji daty przekazujesz ciąg znaków, który powinien być liczbą całkowitą.

string date (string $ format [, int $ timestamp = czas ()])

Wypróbuj strtotime, który przeanalizuje dowolny angielski tekstowy opis daty i godziny do uniksowego znacznika czasu (liczby całkowitej):

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

1
Otrzymuję ten sam błąd w konstruktorze klasy, debugowałem, a problem w tym konstruktorze jest taki, że otrzymuję jako parametr i liczbę całkowitąpublic function __construct(int $someId....)
Marcos Di Paolo

Ponieważ wpisywanie parametrów w PHP staje się coraz bardziej „normą”, to, o czym wspomniał @MarcosDiPaolo, będzie z pewnością częściej spotykane. Martwy gratis jest to, że ślad stosu będzie wskazywał wiersz deklaracji parametru, który został nieprawidłowo wpisany.
parttimeturtle

Nadal nie rozumiem, jaki jest kierunek działań tutaj @parttimeturtle
Marcos Di Paolo

@MarcosDiPaolo Typy parametrów, które przekazujesz do tego konstruktora, muszą być zgodne z typami, które są wskazywane w definicji funkcji. „4” reprezentowane przez ciąg różni się od 4 reprezentowanego przez liczbę całkowitą. Więc albo dostosuj się do definicji funkcji, albo wyłącz ścisłe typy, jeśli naprawdę potrzebujesz połączyć „podobne” wartości, np. Ciąg „4” do liczby całkowitej 4.
parttimeturtle

9

Po prostu możesz rozwiązać ten problem za pomocą strtotime()funkcji.

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

7

$_GET['start_date']mój zakład nie jest numeryczny, ale format daty nie jest obsługiwany przez strtotime. Będziesz musiał ponownie sformatować datę do działającego formatu dla strtotime lub użyć kombinacji eksplodowania / mktime .

Mógłbym dodać przykład, gdybyś był na tyle uprzejmy, aby opublikować format, który obecnie otrzymujesz.


Przesyłanie nie rozwiąże problemu, ponieważ PHP automatycznie przesyła je po przekazaniu do metody.
JohnP

5

Wpadłem na tę samą sytuację (w moim przypadku z wartością daty w niestandardowym polu PHP w widoku Drupal) i to, co zadziałało, to użycie intval zamiast strtotime, aby zamienić wartość na liczbę całkowitą - ponieważ w zasadzie był to znacznik czasu , ale w postaci łańcucha, a nie liczby całkowitej. Oczywiście nie dotyczy to wszystkich, ale warto spróbować.


5

Ten błąd występuje, gdy wykonujesz obliczenia ze zmiennymi, które używają liter połączonych z liczbami (alfanumerycznymi), na przykład 24kb, 886ab ...

Wystąpił błąd w następującej funkcji

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

Aplikacja przesyła obrazy, ale nie działa, wyświetla następujące ostrzeżenie:

wprowadź opis obrazu tutaj

Rozwiązanie:intval() funkcja wyodrębnia całkowitą wartość zmiennej z danych alfanumerycznych i tworzy nową zmienną o takiej samej wartości, ale przekształca się całkowitą z intval()funkcji. Oto 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);
}


1

To stare pytanie, ale istnieje inny subtelny sposób, w jaki może się wydarzyć ta wiadomość. Całkiem dobrze wyjaśniono to tutaj, w dokumentacji .

Wyobraź sobie ten scenariusz:

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

I MyCustomExceptionHandlerjest z grubsza zdefiniowany tak:

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

W rzeczywistości spowoduje to wyzwolenie nowego wyjątku w niestandardowej obsłudze wyjątków, ponieważ Exceptionklasa oczekuje liczby dla drugiego parametru w swoim konstruktorze, ale PDOExceptionmogła dynamicznie zmienić zwracany typ $e->getCode()na ciąg.

Obejściem tego problemu byłoby zdefiniowanie niestandardowej obsługi wyjątków, takiej jak:

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

1

Przekazanie łańcucha niekoniecznie stanowi problem, jeśli zawiera tylko cyfry.

Innym powodem, dla którego może się to zdarzyć, jest spacja przed lub po. Np. „1557399276”


0

Jeśli błąd występuje w momencie jakichkolwiek obliczeń, sprawdź dokładnie, czy wartości nie zawierają przecinka (,). Wartości muszą być podane tylko w formacie liczb całkowitych / zmiennoprzecinkowych.


0

Musisz ustawić strefę czasową za pomocą date_default_timezone_set ().


0

W moim przypadku był to klucz do sem_get

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

$ key powinien być int, w przeciwnym razie pojawi się następujący błąd:

Uwaga PHP: napotkano niepoprawnie sformułowaną wartość liczbową w


0

jeśli $ _GET ['data_początkowa'] jest ciągiem znaków, zamień go na liczbę całkowitą lub podwójną, aby uzyskać dane liczbowe.

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.