Page 1 sur 1

insérer un timestamp en bdd

Posté : 15 août 2014, 11:35
par laurentsch
Bonjour,

je voudrais insérer une date au format timestamp dans la bdd. Pour que la saisie soit claire, l'utilisateur saisit une date puis celle-ci est convertie en timestamp et insérée en bdd, mais cette dernière étape ne fonctionne pas (pas d'insertion mais pas de message d'erreur PHP malgré l'activation de l'affichage et pas d'erreur SQL quand je teste la requête (que j'affiche) avec un PDO en mode exception. Donc où est le problème ?
if (empty($_POST['year']) || empty($_POST['month']) || empty($_POST['day']))
{
    echo "remplissez tous les champs !<br/>";
}
else
{
    $date = new DateTime($_POST['year'].'-'.$_POST['month'].'-'.$_POST['day']);
    if ($date === false)
    {
        echo 'Date invalide';
    }
    else
	{
		echo "<br/>avant insertion<br/>";
		$sql = "INSERT INTO visites (`timestamp1') VALUES ('".$date->getTimestamp()."')";
		echo "<br/>sql=".$sql."<br/>";
                $qry = mysqli_query($db, $sql);       
    }
}

Re: insérer un timestamp en bdd

Posté : 15 août 2014, 13:16
par yann18
bonjour,
  $sql = "INSERT INTO visites (`timestamp1') VALUES ('".$date->getTimestamp()."')";
ta requête sql n'est pas valide car à la place d'une quote inversée(`) tu utilises une quote(').si tu tu travaillais en mode dev, erreurs php activées, tu allais bien pu t’apercevoir que ta requête comporte une erreur.

     if ($date === false)
cette condition ne sera jamais évaluée(quoique qu'elle n'est pas à l'origine de ton problème) car $date attend un objet de type DateTime et ne sera jamais à false ni à true.Autant vérifier, avec instanceof, que $date est bien une instance de type DateTime :

if (empty($_POST['year']) && empty($_POST['month']) && empty($_POST['day']))
{
    echo "remplissez tous les champs !<br/>";
}
else
{
    $date = new DateTime($_POST['year'].'-'.$_POST['month'].'-'.$_POST['day']);
    if (!$date instanceof DateTime)
    {
        echo 'Date invalide';
    }
    else
        {
                echo "<br/>avant insertion<br/>";
                $sql = "INSERT INTO visites (`timestamp1`) VALUES ('".$date->getTimestamp()."')";
                echo "<br/>sql=".$sql."<br/>";
                if( mysqli_query($db, $sql) ===FALSE )  
	        printf("erreur sql  : %s\n", mysqli_error($db));    
    }
}


Re: insérer un timestamp en bdd

Posté : 15 août 2014, 14:37
par laurentc
Merci de ton aide ; j'ai 2 fichiers presque identiques (2 versions) ; j'avais bien mis l'affichage des erreurs PHP sur l'un d'eux mais pas le bon ! Grâce à toi, une insertion est faite, mais : 0000-00-00 00:00:00 ...Sachant que la colonne est de type "timestamp", qu'est qui va pas ? (Vais être absent plusieurs heures)

Re: insérer un timestamp en bdd

Posté : 15 août 2014, 16:39
par yann18
attention le type timestamp mysql (équivalent à datetime) attend une date et une heure(au format Y-m-d H:i:s) et non un timestamp unix.si l'heure n'est pas renseignée elle sera remplacée par 00:00:00
                 $sql = "INSERT INTO visites (`timestamp1`) VALUES ('".$date->format('Y-m-d')."')";
Après il me semble logique de fixer le type DATE à ta colonne à la place de TIMESTAMP car ne tu stockes que la date.

Re: insérer un timestamp en bdd

Posté : 15 août 2014, 19:31
par laurentsch
OK, je viens de passer le type de la colonne de TIMESTAMP à DATE, mais toujours pas d'insertion... :(

Re: insérer un timestamp en bdd

Posté : 16 août 2014, 16:49
par laurentsch
J'ai fini par trouver une erreur inavouable... :-*