PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 17-05-2016 15:44:30

passnic
Membre
Inscription : 17-05-2016
Messages : 1

je n'arrive pas à inserer une variable DATETIME dans la BDD

je reçois l'erreur suivante: Catchable fatal error: Object of class DateTime could not be converted to string in C:\wamp\www\Jeu_de_calcul\jeu_de_calcul.php on line 117
je suis bloqué depuis deux jours voici mon code:


<?php

/************************************** CONSTANTES *************************************/

define("MANCHES_PAR_PARTIE", 2);
define("OPERANDE1_MINI", 3);
define("OPERANDE1_MAXI", 10);
define("OPERANDE2_MINI", 2);
define("FUSEAU_HORAIRE", "Europe/Paris");

/************************************** FONCTIONS **************************************/

// Fonction de tirage au sort de l'opération de calcul
function tire_au_sort_opération() {
   // tirage au sort des 2 opérandes
   $opérande1 = rand(OPERANDE1_MINI, OPERANDE1_MAXI);
   $opérande2 = rand(OPERANDE2_MINI, $opérande1-1);
   // tirage au sort de l'opérateur
   $operateurs = array ( '+', '-', '*'); // remarque : les constantes de type tableau ont été introduites par PHP 7 (possibilité non utilisée ici, car cette version du langage est encore très peu répandue)
   $indice_aléatoire = rand(0,2);
   $opérateur = $operateurs[$indice_aléatoire];
   // contruction et renvoi de l'opération (chaîne de caractères)
   $opération = "$opérande1 $opérateur $opérande2";
   return $opération;
}


// Fonction d'affichage du formulaire de saisie de la réponse du joueur
function affiche_formulaire_saisie_réponse() {
  echo "<form method=\"post\">\n";
   // champ de saisie du résultat
   echo "    <label>Réponse </label>\n";
  echo "    <input type=\"text\" name=\"réponse_joueur\" value=\"\">\n";
  // bouton de validation
  echo "    <input type=\"submit\" name=\"validation_réponse_joueur\" value=\"Valider\">\n";
  echo "</form>\n";
}


// Fonction de calcul du résultat de la manche jouée
function calcule_et_affiche_résultat_manche($opération, $réponse_joueur) {
   echo "<p>Opération : $opération</p>\n";
   echo "<p>Votre réponse : ".htmlspecialchars($réponse_joueur, ENT_COMPAT, "UTF-8")."</p>\n";
   eval('$résultat_opération = '.$opération.';');
   if ($résultat_opération == $réponse_joueur) {
      $_SESSION['score']++;
     $rep=1;
      echo "<p>Bravo : résultat correct !</p>\n";
   }
   else
    {
      echo "<p>Erreur : le résultat correct est $résultat_opération</p>\n";
    $rep=0;
  }
   $_SESSION['nombre_manches']++;
  if (!isset($_SESSION['sauvegarde_manches_partie']))
      $_SESSION['sauvegarde_manches_partie']=array($_SESSION['nombre_manches'], $opération, $réponse_joueur, $rep);
    else
    array_push($_SESSION['sauvegarde_manches_partie'], $_SESSION['nombre_manches'], $opération, $réponse_joueur, $rep);
 
}


/********************************* PROGRAMME PRINCIPAL *********************************/

// Cas d'un premier chargement de la page ou d'une demande de nouvelle partie par le joueur :
// initialisation des variables de session
if (!isset($_SESSION['nombre_manches']) || isset($_GET['nouvelle_partie'])) {
   $_SESSION['nombre_manches'] = 0;
   $_SESSION['score'] = 0;
}

// Si la partie est en cours (manches restant à jouer)
if ($_SESSION['nombre_manches'] < MANCHES_PAR_PARTIE) {
   echo "<h3>Manche ".($_SESSION['nombre_manches']+1)." sur ".MANCHES_PAR_PARTIE."</h3>\n";
   // écran 2 : si le formulaire a été validé (bouton "Valider" cliqué)
   if (isset($_POST['validation_réponse_joueur'])) {
      // affichage des informations et du résultat de la manche
      calcule_et_affiche_résultat_manche($_SESSION['opération'], $_POST['réponse_joueur']);
    //ajout dans la variable de sauvegarde des manches
    //$_SESSION['sauvegarde_manches_partie'] = "/$opération $réponse_joueur";
      // si la partie est en cours : affichage d'un lien pour passer à la manche suivante
      if ($_SESSION['nombre_manches'] < MANCHES_PAR_PARTIE)
         echo "<p><a href=\"".$_SERVER['SCRIPT_NAME']."\">Continuer la partie</a></p>\n";
      // si la partie est terminée (dernière manche jouée) :
      // fin du chronométrage de la partie, puis affichage de son score final et de sa durée
      else {
         [color=#eb5717]$date_fin_partie = new DateTime("now", new DateTimeZone(FUSEAU_HORAIRE));
     //date_format($date_fin_partie, 'Y-m-d H:i:s');
         $durée_partie = $_SESSION['date_début_partie']->diff($date_fin_partie);[/color]
     //date_format($durée_partie, 'H:i:s');
     //$durée_partie=$durée_partie->format('%i:%s');
     $score=$_SESSION["score"];
         echo "<p><strong>Partie terminée<br>Score : ".$_SESSION["score"]." sur ".MANCHES_PAR_PARTIE."</strong></p>\n";
         echo "<p>Durée de la partie : ".$durée_partie->format('%i min %s s')."</p>\n";
     //echo '<pre>';
     $sauvegarde_manches_partie=$_SESSION['sauvegarde_manches_partie'];
     //print_r($_SESSION['sauvegarde_manches_partie']);
    // echo '</pre>';

   
    echo "<p><a href=\"sauvegarde_partie.php ?$date_fin_partie, $durée_partie, $score, $sauvegarde_manches_partie\">Sauvegarder la partie</a> et son score</p>\n";  
     
      unset($_SESSION['sauvegarde_manches_partie']);
       
    }
   }
   // écran 1 : tirage au sort de l'opération et affichage du formulaire de saisie
   else {
         $opération = tire_au_sort_opération();
         // stockage de l'opération courante dans la session
         $_SESSION['opération'] = $opération;
         echo "<p>Opération : $opération</p>\n";
         affiche_formulaire_saisie_réponse();
         // si c'est la première manche : début du chronométrage de la partie
         if ($_SESSION['nombre_manches'] == 0){
            $_SESSION['date_début_partie'] = new DateTime("now", new DateTimeZone(FUSEAU_HORAIRE));
      //$_SESSION['sauvegarde_manches_partie']= '';
     }
   }
}
   
echo "<p><a href=\"".$_SERVER['SCRIPT_NAME']."?nouvelle_partie\">Commencer une nouvelle partie</a></p>\n";

?>
Voici la page sauvegarde:
<?php


// Fonction d'affichage du formulaire de saisie de la réponse du joueur
function affiche_formulaire_saisie_nom() {
  echo "<form method=\"post\">\n";
   // champ de saisie du résultat
    echo "    <label>Votre pseudonyme </label>\n";
  echo "    <input type=\"text\" name=\"pseudo\" value=\"\">\n";
  // bouton de validation
  echo "    <input type=\"submit\" name=\"validation_pseudo_joueur\" value=\"Sauvegarder la partie\">\n";
  echo "</form>\n";
}
function connexion_BD (){
   $link = mysqli_connect("localhost", "script_php", "zh6tjPp6T56N4dbF", "exercices_php"); 
  /* Vérification de la connexion */
  if (mysqli_connect_errno()){
    echo "Échec de la connexion: " . mysqli_connect_error();
    exit();
    }  
}

function save($pseudo, $date, $durée, $score, $sauvegarde_manches_partie){
   
      if ($link = mysqli_connect("localhost", "script_php", "zh6tjPp6T56N4dbF", "exercices_php"))
      {
        $pseudo=$_POST['pseudo'];
        mysqli_query($link,"INSERT INTO jeudecalcul (id_partie,pseudo,date,duree,score,calculs) VALUES ('','$pseudo','$date_fin_partie','','$score','$sauvegarde_manches_partie')");
        mysqli_close($link);
       
      }
   
}

  affiche_formulaire_saisie_nom();
  include 'jeu_de_calcul.php';
  include 'ressources_communes.php';
  //Sauvegarde du jeu
  [color=#ff3108]if (isset($_POST['validation_pseudo_joueur'])){
      if (empty($_POST['pseudo']))
          {
            echo "Vous n'avez pas saisi de pseudonyme!</p>\n ";
            echo "Veuillez saisir votre pseudonyme s'il vous plait</p>\n ";
          }
      else
        {
          $pseudo=$_POST['pseudo'];
          //convertir_au_format_datetime ($date_fin_partie, $durée_partie);
          save($pseudo, $date_fin_partie, $score, $sauvegarde_manches_partie);
          echo "<p>Votre partie a été enregistrée sous le Pseudonyme : ".htmlspecialchars($pseudo, ENT_COMPAT, "UTF-8")."</p>\n";   
         
        }[/color]
  }
  echo "<p><a href=\"jeu_de_calcul.php?nouvelle_partie\">Commencer une nouvelle partie</a></p>\n";
?>
 

Hors ligne

#2 19-05-2016 23:27:10

Jc2
Membre
Lieu : Zillisheim - Alsace
Inscription : 23-03-2016
Messages : 12
Site Web

Re : je n'arrive pas à inserer une variable DATETIME dans la BDD

Bonsoir,


$durée_partie = $_SESSION['date_début_partie']->diff($date_fin_partie);
 

Ici $_SESSION['date_début_partie'] représente une chaîne de texte contenant une valeur représentant une date. Or vous l'utilisez comme si c'était un objet (une instance de classe) via l'opérateur ->
Pour vous mettre sur la voie, il vous faut écrire un truc du genre $duree_partie=$_SESSION['date_début_partie'] - $date_fin_partie en utilisant des fonctions de temps de PHP. Je vous invite à regarder le manuel en ligne de PHP pour trouver la bonne méthode pour le faire.

Jc.

Hors ligne

Pied de page des forums