Partage
  • Partager sur Facebook
  • Partager sur Twitter

Base de données

Utilisation de données de type DateTime

Sujet résolu
    23 septembre 2022 à 16:13:38

    Bonjour,

    Mes requêtes qui contiennent des dates me donnent du soucis.

    Pour illustrer mon propos j'ai créé deux tables avec dans chacune d'elle une colonne de type DateTime

    Un première requête SELECT me permet d'accéder à l'enregistrement de la première table

    Dans la deuxième requête j'utilise la donnée 'date' que j'ai récupéré ci-dessus pour récupérer un enregistrement

    J'ai une erreur fatale : Syntax error or access violation: 1064 You have an error in your SQL syntax;

    La date récupérée dans la table 01 est de type string

    Je l'ai inséré telle quelle dans la table 02.

    Voyant que cela ne fonctionnait pas je l'ai transformé en type objet. Ce n'est pas mieux

    Voici mon code :

    <?php
    // Première requête
    $r1 = $bdd->query("SELECT maDate FROM table01
    					WHERE id = 18	");
    $d1 = $r1->fetch();
    $maDate = $d1['maDate'];
    
    // Seconde requête
             $r2 = $bdd->query("SELECT nom FROM table2
             					WHERE saDate = $maDate				
             					");
             $d2 = $r2->fetch();
             $nom = $d2['nom'];
    /*Nota :
    Dans les deux tables la colonne maDate et taDate sont du type DateTime 
    var_dump($maDate) me donne un résultat de type string       
    */
    ?>

    Où est mon erreur ?

    Merci par avance pour votre réponse
     

    • Partager sur Facebook
    • Partager sur Twitter
      23 septembre 2022 à 17:44:53

      Bonjour,

      José13330 a écrit:

      Où est mon erreur ?

      La première, celle qui cause l'erreur : Faire des requêtes en PHP sans les préparer ?

      Sans protéger la variable $maDate dans la deuxième requête, tu génères le SQL suivant :

      SELECT nom FROM table2 WHERE saDate = 2022-09-23 17:36:00

      Ce qui est erroné est devrait être :

      SELECT nom FROM table2 WHERE saDate = "2022-09-23 17:36:00"

      Regarde la coloration syntaxique.

      Cet aspect mis à part tu pourrais surtout fonctionner en une seule requête :

      SELECT nom FROM table2
      WHERE saDate = (
      	SELECT maDate
      	FROM table01
          WHERE id = 18
      )

      Ou encore plus propre avec une jointure :

      SELECT T2.nom
      FROM
      	table2 T2
      		INNER JOIN table1 T1
      			ON T2.saDate = T1.maDate
      WHERE T1.id = 18

      Ce qui donne le PHP suivant :

      $requete = $bdd->query("
      SELECT T2.nom
      FROM
      	table2 T2
      		INNER JOIN table1 T1
      			ON T2.saDate = T1.maDate
      WHERE T1.id = 18"
      );
      $nom = $requete->fetchColumn();

      Note au passage l'utilisation de fetchColumn qui récupères directement la valeur de la première colonne de la première ligne.

      -
      Edité par Benzouye 23 septembre 2022 à 17:48:58

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        24 septembre 2022 à 10:17:58

        Bonjour

        Merci pour ta réponse, merci d'avoir pris sur ton temps pour cela

        Ma procédure de codage fonctionnait avec PHP 7.4

        En passant sur PHP 8.1.9 est apparu le dysfonctionnement sur lequel je bloquais

        Je retiens deux choses :

        M'intéresser un peu plus aux différents PDOStatmen et leur utilisation. J'avais tendance à toujours utiliser fetch

        PHP 8 est plus strict sur la syntaxe 

        • Partager sur Facebook
        • Partager sur Twitter
          24 septembre 2022 à 12:43:24

          Le code posté au départ ne fonctionnait pas plus en PHP 7.4, car le problème est côté SQL, sans encadrer une valeur de date la requête plante...

          Ce qu'il faut surtout retenir ici c'est la préparation de requête.

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

          Base de données

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown