Une valeur numérique mal formée rencontrée


120

J'ai un formulaire qui passe deux dates (début et fin) à un script PHP qui les ajoutera à une base de données. J'ai des problèmes pour valider cela. Je reçois toujours les erreurs suivantes

Une valeur numérique mal formée rencontrée

C'est à ce moment que j'utilise ce qui suit

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

Mais lorsque j'utilise la fonction strtotime () comme conseillé par de nombreux sites, j'obtiens une date d'horodatage unix du 1/1/1970. Des idées comment puis-je obtenir la date correcte?


5
Vous devez publier ce que $_GET['start_date']contient.
JohnP

1
Je suppose que votre $_GET['start_date']n'est pas un horodatage qui est attendu par la datefonction comme deuxième argument
Nemoden

La deuxième réponse de DChaplin est plus appropriée dans ce cas
cw24

J'ai eu cela en essayant de sélectionner une table à laquelle je n'avais pas rejoint ..
Connor Leech

Réponses:


225

Parce que vous passez une chaîne comme deuxième argument à la fonction de date, qui doit être un entier.

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

Essayez strtotime qui analysera toute description datetime textuelle en anglais dans un horodatage Unix (entier):

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

1
J'obtiens la même erreur dans le constructeur d'une classe, je déboguais et le problème dans ce constructeur est que je reçois en tant que paramètre et entierpublic function __construct(int $someId....)
Marcos Di Paolo

La saisie de paramètres en PHP devenant de plus en plus la `` norme '', ce que @MarcosDiPaolo a mentionné sera certainement vu plus fréquemment. Un cadeau mortel est que la trace de la pile pointe vers la ligne de la déclaration de paramètre qui est mal tapée.
parttimeturtle

Je ne comprends toujours pas quelle est la marche à suivre ici @parttimeturtle
Marcos Di Paolo

@MarcosDiPaolo, les types de paramètres que vous passez à ce constructeur doivent correspondre aux types indiqués dans la définition de fonction. "4" représenté par une chaîne est différent de 4 représenté par un entier. Alors se conformer soit à la définition de la fonction ou désactiver les types stricts, si vous avez vraiment besoin de fusionner les valeurs « similaires », par exemple , chaîne « 4 » à l' entier 4.
parttimeturtle

9

Vous pouvez simplement résoudre ce problème en utilisant la strtotime()fonction.

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

7

$_GET['start_date']n'est pas numérique est mon pari, mais un format de date non pris en charge par strtotime. Vous aurez besoin de reformater la date à un format pratique pour strtotime combinaison ou l' utilisation d' exploser / mktime .

Je pourrais vous ajouter un exemple si vous aviez la gentillesse de publier le format que vous recevez actuellement.


La diffusion ne résoudra pas le problème car PHP le castera automatiquement lorsqu'il sera transmis à la méthode.
JohnP

5

Je me suis heurté à la même situation (dans mon cas avec une valeur de date dans un champ PHP personnalisé dans une vue Drupal), et ce qui a fonctionné pour moi était d'utiliser intval au lieu de strtotime pour transformer la valeur en un entier - car c'était essentiellement un horodatage , mais sous la forme d'une chaîne plutôt que d'un entier. Évidemment, ce ne sera pas le cas pour tout le monde, mais cela vaut peut-être la peine d'essayer.


5

Cette erreur se produit lorsque vous effectuez des calculs avec des variables qui utilisent des lettres combinées avec des nombres (alphanumériques), par exemple 24kb, 886ab ...

J'ai eu l'erreur dans la fonction suivante

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

L'application télécharge des images mais cela n'a pas fonctionné, elle a montré l'avertissement suivant:

entrez la description de l'image ici

Solution: La intval()fonction extrait la valeur entière d'une variable avec des données alphanumériques et crée une nouvelle variable avec la même valeur mais convertie en entier avec la intval()fonction. Voici le 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

Cela m'a beaucoup aidé -

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

1

C'est une vieille question, mais il y a une autre manière subtile de faire passer ce message. C'est assez bien expliqué ici, dans la documentation .

Imaginez ce scénario:

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

Et MyCustomExceptionHandlerest défini à peu près comme:

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

Cela déclenchera en fait une nouvelle exception dans le gestionnaire d'exceptions personnalisé car la Exceptionclasse attend un nombre pour le deuxième paramètre dans son constructeur, mais PDOExceptionpeut avoir changé dynamiquement le type de retour de $e->getCode()en chaîne.

Une solution de contournement pour cela serait de définir votre gestionnaire d'exceptions personnalisé comme:

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

1

Passer une chaîne n'est pas nécessairement un problème, si elle ne contient que des chiffres.

Une autre raison pour laquelle cela peut arriver est si vous avez un espace avant ou après. Par exemple, "1557399276"


0

Si l'erreur se produit au moment d'un calcul, vérifiez que les valeurs ne contiennent pas de virgule (,). Les valeurs doivent être uniquement au format entier / flottant.


0

Vous devez définir le fuseau horaire en utilisant date_default_timezone_set ().


0

Dans mon cas, c'était la clé de sem_get

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

$ key doit être un int, sinon vous obtiendrez l'erreur suivante:

Remarque PHP: Une valeur numérique non bien formée rencontrée dans


0

si $ _GET ['start_date'] est une chaîne, convertissez-la en entier ou en double pour traiter numériquement.

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.