web-dev-qa-db-fra.com

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

J'ai un formulaire qui transmet 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 continue à avoir 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 pour obtenir la date exacte?

95
Deviland

Parce que vous passez une chaîne en tant que second argument de la fonction date, qui doit être un entier.

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

Essayez strtotime qui analysera toute description de date/heure textuelle en anglais dans un timestamp Unix (entier):

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

$_GET['start_date'] n'est pas numérique, c'est mon pari, mais un format de date non supporté par strtotime. Vous devrez reformater la date en un format utilisable pour strtotime ou utiliser la combinaison de explode / mktime .

Je pourrais vous ajouter un exemple si vous aviez la gentillesse d’afficher le format que vous recevez actuellement.

7

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

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

J'ai rencontré la même situation (dans mon cas, avec une valeur de date dans un champ personnalisé PHP dans une vue Drupal), et ce qui a fonctionné pour moi était d'utiliser intval au lieu de strtotime pour transformer la valeur en entier, était fondamentalement 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 pourrait valoir la peine d'essayer.

5
spidersilk

Cela m'a beaucoup aidé -

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

C'est une vieille question, mais il y a une autre manière subtile que ce message peut arriver. 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 MyCustomExceptionHandler est défini à peu près comme:

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

Cela déclenchera en réalité une nouvelle exception dans le gestionnaire d'exceptions personnalisées, car la classe Exception attend un numéro pour le deuxième paramètre de son constructeur, mais PDOException peut avoir modifié de manière dynamique le type de retour de $e->getCode() en chaîne.

Une solution de contournement serait de définir votre gestionnaire d'exceptions personnalisé, comme suit:

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

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

0
Arghadeeph Halder

Vous devez définir le fuseau horaire à l'aide de date_default_timezone_set ().

0
AlanP

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

Cela peut arriver aussi si vous avez un espace avant ou après. Par exemple. "1557399276"

0
Nuno