Ein nicht gut gebildeter numerischer Wert trifft auf


120

Ich habe ein Formular, das zwei Daten (Start und Ende) an ein PHP-Skript übergibt, das diese einer Datenbank hinzufügt. Ich habe Probleme, dies zu bestätigen. Ich erhalte immer wieder die folgenden Fehler

Ein nicht gut gebildeter numerischer Wert trifft auf

Dies ist, wenn ich Folgendes verwende

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

Wenn ich jedoch die von vielen Websites empfohlene Funktion strtotime () verwende, erhalte ich ein Unix-Zeitstempeldatum vom 1.1.1970. Irgendwelche Ideen, wie ich das richtige Datum bekommen kann?


5
Sie müssen posten, was $_GET['start_date']enthält.
JohnP

1
Ich nehme an, Ihr $_GET['start_date']ist kein Zeitstempel, der von der dateFunktion als zweites Argument erwartet wird
Nemoden

Die zweite Antwort von DChaplin ist in diesem Fall angemessener
cw24

Ich habe dies erhalten, als ich versuchte, aus einem Tisch auszuwählen, an dem ich nicht
Connor Leech

Antworten:


225

Weil Sie eine Zeichenfolge als zweites Argument an die Datumsfunktion übergeben, die eine Ganzzahl sein sollte.

Zeichenfolge Datum (Zeichenfolge $ Format [, int $ Zeitstempel = Zeit ()])

Versuchen Sie es mit strtotime, bei dem jede englische Beschreibung von datetime in einen Unix-Zeitstempel (Ganzzahl) analysiert wird :

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

1
Ich erhalte den gleichen Fehler im Konstruktor einer Klasse, ich habe debuggt und das Problem in diesem Konstruktor ist, dass ich als Parameter und Ganzzahl erhaltepublic function __construct(int $someId....)
Marcos Di Paolo

Da die Parametertypisierung in PHP immer mehr zur "Norm" wird, wird das, was @MarcosDiPaolo erwähnte, definitiv häufiger zu sehen sein. Ein totes Werbegeschenk ist, dass der Stack-Trace auf die Zeile der Parameterdeklaration verweist, die falsch eingegeben wurde.
parttimeturtle

Ich verstehe immer noch nicht, wie hier vorgegangen wird @parttimeturtle
Marcos Di Paolo

@MarcosDiPaolo Die Parametertypen, die Sie an diesen Konstruktor übergeben, müssen mit den Typen übereinstimmen, die in der Funktionsdefinition angegeben sind. "4", dargestellt durch eine Zeichenfolge, unterscheidet sich von 4, dargestellt durch eine Ganzzahl. Passen Sie sich also entweder der Funktionsdefinition an oder deaktivieren Sie strenge Typen, wenn Sie wirklich 'ähnliche' Werte zusammenführen müssen, z. B. Zeichenfolge "4" zu Ganzzahl 4.
parttimeturtle

9

Sie können dieses Problem einfach mit der strtotime()Funktion lösen .

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

7

$_GET['start_date']ist nicht numerisch ist meine Wette, aber ein Datumsformat wird von nicht unterstützt strtotime. Sie müssen das Datum für strtotime in ein funktionsfähiges Format umformatieren oder eine Kombination aus explode / mktime verwenden .

Ich könnte Ihnen ein Beispiel hinzufügen, wenn Sie so freundlich wären, das Format zu veröffentlichen, das Sie derzeit erhalten.


Das Casting behebt das Problem nicht, da PHP es automatisch umwandelt, wenn es an die Methode übergeben wird.
JohnP

5

Ich bin auf dieselbe Situation gestoßen (in meinem Fall mit einem Datumswert in einem benutzerdefinierten PHP-Feld in einer Drupal-Ansicht), und was für mich funktioniert hat, war die Verwendung von intval anstelle von strtotime, um den Wert in eine Ganzzahl umzuwandeln - da es sich im Grunde um einen Zeitstempel handelte , aber in Form einer Zeichenfolge statt einer Ganzzahl. Natürlich ist das nicht bei allen der Fall, aber es könnte einen Versuch wert sein.


5

Dieser Fehler tritt auf, wenn Sie Berechnungen mit Variablen durchführen, die Buchstaben in Kombination mit Zahlen (alphanumerisch) verwenden, z. B. 24 KB, 886ab ...

Ich hatte den Fehler in der folgenden Funktion

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

Die Anwendung lädt Bilder hoch, hat aber nicht funktioniert. Die folgende Warnung wurde angezeigt:

Geben Sie hier die Bildbeschreibung ein

Lösung: Die intval()Funktion extrahiert den ganzzahligen Wert einer Variablen mit alphanumerischen Daten und erstellt eine neue Variable mit demselben Wert, die jedoch mit der intval()Funktion in eine Ganzzahl konvertiert wird . Hier ist der Code:

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

Das hat mir sehr geholfen -

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

1

Dies ist eine alte Frage, aber es gibt noch eine andere subtile Möglichkeit, wie diese Nachricht geschehen kann. Es wird hier in den Dokumenten ziemlich gut erklärt .

Stellen Sie sich dieses Szenario vor:

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

Und MyCustomExceptionHandlerist grob definiert als:

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

Dies löst tatsächlich eine neue Ausnahme im benutzerdefinierten Ausnahmehandler aus, da die ExceptionKlasse eine Zahl für den zweiten Parameter in ihrem Konstruktor erwartet, PDOExceptionden Rückgabetyp von jedoch möglicherweise dynamisch geändert hat$e->getCode() in eine Zeichenfolge .

Eine Problemumgehung hierfür besteht darin, Ihren benutzerdefinierten Ausnahmebehandler wie folgt zu definieren:

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

1

Das Übergeben einer Zeichenfolge ist nicht unbedingt ein Problem, wenn sie nur Ziffern enthält.

Ein weiterer Grund, warum dies passieren kann, ist, wenn Sie vorher oder nachher ein Leerzeichen haben. ZB "1557399276"


0

Wenn der Fehler zum Zeitpunkt einer Berechnung auftritt, überprüfen Sie, ob die Werte kein Komma (,) enthalten. Die Werte dürfen nur im Integer / Float-Format vorliegen.


0

Sie müssen die Zeitzone mit date_default_timezone_set () festlegen.


0

In meinem Fall war es der Schlüssel für sem_get

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

$ key sollte ein int sein, sonst wird der folgende Fehler angezeigt:

PHP-Hinweis: Ein nicht wohlgeformter numerischer Wert, der in angetroffen wird


0

Wenn $ _GET ['start_date'] eine Zeichenfolge ist, konvertieren Sie sie in eine Ganzzahl oder ein Doppel, um numerisch zu handeln.

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.