web-dev-qa-db-fra.com

PHP mysql insère le format de date

J'utilise jQuery datepicker Le format du datepicker est le suivant: 08/25/2012

j'ai des erreurs lors de l'insertion dans ma base de données, il insère seulement 0000-00-00 00 00 00

mes codes est

<?php
$id = $_POST['id'];
$name = $_POST['name'];
$date = $_POST['date'];
$sql = mysql_query( "INSERT INTO user_date VALUE( '', '$name', '$date')" ) or die ( mysql_error() );
echo 'insert successful';
?>

je suis sûr que mon insertion est correcte ....

55
Butternut

Comme indiqué dans Date et heure, littéraux :

MySQL reconnaît les valeurs DATE dans les formats suivants:

  • En tant que chaîne au format 'YYYY-MM-DD' ou 'YY-MM-DD'. Une syntaxe «assouplie» est autorisée: tout caractère de ponctuation peut être utilisé comme séparateur entre les parties de date. Par exemple, '2012-12-31', '2012/12/31', '2012^12^31' et '2012@12@31' sont équivalents.

  • En tant que chaîne sans séparateurs au format 'YYYYMMDD' ou 'YYMMDD', à condition que la chaîne ait un sens en tant que date. Par exemple, '20070523' et '070523' sont interprétés comme étant '2007-05-23', mais '071332' est illégal (il comporte des parties de mois et de jour insensées) et devient '0000-00-00'.

  • Sous forme de nombre au format YYYYMMDD ou YYMMDD, à condition que le nombre ait un sens en tant que date. Par exemple, 19830905 et 830905 sont interprétés comme '1983-09-05'.

Par conséquent, la chaîne '08/25/2012' n'est pas un littéral de date MySQL valide. Vous avez quatre options (dans un vague ordre de préférence, sans aucune information supplémentaire sur vos besoins):

  1. Configurez Datepicker pour fournir les dates dans un format pris en charge à l'aide de altField avec son option altFormat :

    <input type="hidden" id="actualDate" name="actualDate"/>
    
    $( "selector" ).datepicker({
        altField : "#actualDate"
        altFormat: "yyyy-mm-dd"
    });
    

    Ou, si vous souhaitez que les utilisateurs voient la date au format YYYY-MM-DD, définissez simplement l'option dateFormat à la place:

    $( "selector" ).datepicker({
        dateFormat: "yyyy-mm-dd"
    });
    
  2. Utilisez la fonction STR_TO_DATE() de MySQL pour convertir la chaîne:

    INSERT INTO user_date VALUES ('', '$name', STR_TO_DATE('$date', '%m/%d/%Y'))
    
  3. Convertissez la chaîne reçue de jQuery en quelque chose que PHP comprend comme une date, par exemple un DateTime object:

    $dt = \DateTime::createFromFormat('m/d/Y', $_POST['date']);
    

    et ensuite soit:

    • obtenir une chaîne formatée appropriée:

      $date = $dt->format('Y-m-d');
      
    • obtenir le timestamp UNIX:

      $timestamp = $dt->getTimestamp();
      

      qui est ensuite passé directement à la FROM_UNIXTIME() function de MySQL:

      INSERT INTO user_date VALUES ('', '$name', FROM_UNIXTIME($timestamp))
      
  4. Manipulez manuellement la chaîne en un littéral valide:

    $parts = explode('/', $_POST['date']);
    $date  = "$parts[2]-$parts[0]-$parts[1]";
    

Attention

  1. Votre code est vulnérable à l'injection SQL. Vous vraiment devriez utiliser les instructions préparées , dans lesquelles vous transmettez vos variables en tant que paramètres non évalués pour SQL. Si vous ne savez pas de quoi je parle ou comment y remédier, lisez l'histoire de Bobby Tables

  2. En outre, comme indiqué dans l’introduction du chapitre du manuel PHP sur les fonctions mysql_*:

    Cette extension est obsolète à partir de PHP 5.5.0 et n'est pas recommandée pour l'écriture de nouveau code car il sera supprimé à l'avenir. À la place, vous devez utiliser l’extension mysqli ou PDO_MySQL . Consultez également le Vue d'ensemble de l'API MySQL pour obtenir de l'aide supplémentaire lors du choix d'une API MySQL.

  3. Vous semblez utiliser une colonne DATETIME ou TIMESTAMP pour conserver une valeur de date; Je vous recommande d'utiliser plutôt le type DATE de MySQL. Comme expliqué dans Les types DATE, DATETIME et TIMESTAMP :

    Le type DATE est utilisé pour les valeurs avec une partie date mais aucune partie heure. MySQL récupère et affiche les valeurs DATE au format 'YYYY-MM-DD'. La plage prise en charge va de '1000-01-01' à '9999-12-31'.

    Le type DATETIME est utilisé pour les valeurs contenant des parties de date et d'heure. MySQL récupère et affiche les valeurs DATETIME au format 'YYYY-MM-DD HH:MM:SS'. La plage prise en charge va de '1000-01-01 00:00:00' à '9999-12-31 23:59:59'.

    Le type de données TIMESTAMP est utilisé pour les valeurs contenant des parties de date et d'heure. TIMESTAMP a une plage de '1970-01-01 00:00:01' UTC à '2038-01-19 03:14:07' UTC.

167
eggyal

Vous devriez envisager de créer un horodatage à partir de cette date avec mktime ()

par exemple:

$date = explode('/', $_POST['date']);
$time = mktime(0,0,0,$date[0],$date[1],$date[2]);
$mysqldate = date( 'Y-m-d H:i:s', $time );
10
Mihai Iorga
$date_field         = date('Y-m-d',strtotime($_POST['date_field']));
$sql = mysql_query("INSERT INTO user_date (column_name,column_name,column_name) VALUES('',$name,$date_field)") or die (mysql_error());
6
Kishan Chauhan

Vous devez vous assurer que le format de date est AAAA-MM-JJ sur votre sortie jQuery. Je peux voir que jQuery renvoie MM-DD-YYYY, ce qui n’est pas le format valide de la date MySQL et c’est pourquoi il renvoie une erreur.

Pour le convertir à droite, vous pouvez faire ceci:

$dateFormated = split('/', $date);
$date = $dateFormated[2].'-'.$dateFormated[0].'-'.$dateFormated[1];

Ensuite, vous obtiendrez une date formatée qui sera un format MySQL valide, à savoir AAAA-MM-JJ, c'est-à-dire 2012-08-25

Je vous recommanderais également d'utiliser mysql_real_escape_string lorsque vous insérez des données dans la base de données pour éviter les injections SQL comme solution rapide ou pour mieux utiliser PDO ou MySQLi .

Votre requête d'insertion utilisant mysql_real_escape_string devrait plutôt ressembler à ceci:

$sql = mysql_query( "INSERT INTO user_date VALUE( '', '" .mysql_real_escape_string($name). "', '" .mysql_real_escape_string($date). "'" ) or die ( mysql_error() );
1
Ilia Rostovtsev

Obtenir un objet date à partir du sélecteur de date jquery à l'aide de

var myDate = $('element').datepicker('getDate')

Pour mysql, la date doit être au bon format. Une option qui gère les problèmes de fuseau horaire consiste à utiliser moment.js.

moment(myDate).format('YYYY-MM-DD HH:mm:ss')
0
ykay

La méthode la plus simple est

$dateArray = explode('/', $_POST['date']);
$date = $dateArray[2].'-'.$dateArray[0].'-'.$dateArray[1];

$sql = mysql_query("INSERT INTO user_date (column,column,column) VALUES('',$name,$date)") or die (mysql_error());
0
William Worley