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ę?

Deviland
źródło
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']));
DChaplin
źródło
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']));
Faisal
źródło
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.

Wesley van Opdorp
źródło
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ć.

jedwab pająk
źródło
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);
}
Vladimir Salguero
źródło
3

To mi bardzo pomogło -

$new_date = date_format(date_create($old_date), 'Y-m-d');
Tushar Walzade
źródło
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();
  }
}
Parris Varney
źródło
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”

Nuno
źródło
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.

Arghadeeph Halder
źródło
0

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

AlanP
źródło
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

M w
źródło
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
A. Alem 11
źródło