SQL - Php - 2 Requêtes - Problème

Résolu
Bonjour,

J'ai un petit soucis et je ne trouve pas mon erreurs depuis 2, 3 jours...

J'aimerais avec mon URL :

// xxxx.xx.xx.xx/sensor/getTranslation.php?periode=4&capteur=CO

Récupère depuis ma base de donnée, différents capteurs, depuis différents heures, mois, semaine...

J'ai deux paramètres :

1 Paramètres -> Choisir le temps (Semaine, heures...)
1 Paramètres -> Choisir le capteur (CO,CO2,BAT,...)

J'aimerais récupéré toute les informations avec l'URL dans temps :
Par exemple si je choisis : 1 & CO
Je récupéré toute les informations dans l'heure du capteur CO.

Mon problème : Code erreurs page !
Mon code :


<?php

// xxx.xx.xx.xx/sensor/getTranslation.php?periode=4&capteur=CO
 
include 'Database.php';
 
$database  = new Database();
$con = $database->getConnection();
 
$p       = isset($_GET['periode']) ? (int)$_GET['periode'] : 1;
$periode = [1 => 'HOUR', 2 => 'DAY', 3 => 'WEEK', 4 => 'MONTH', 5 => 'YEAR'][$p] ?? 'HOUR';
 
$caps = [
    'CO' => 'blabla', 'CO2' => 'blabla', 'LUX'=> 'blabla', 'BAT' => 'blabla', 'HALL' => 'blabla', 'LP' => 'blabla',
    'PIR' => 'blabla', 'STR' => 'blabla', 'HUM' => 'blabla', 'PRES' => 'blabla', 'TC' => 'blabla'
];
$c       = $_GET['capteur'] ?? 'TC';
$capteur = $caps[$c] ?? 'TC';
 
$sql = <<<sql
SELECT `timestamp`, `sensor`, `value` 
  FROM sensorparser 
 WHERE `timestamp` > CURDATE() - INTERVAL 1 {$periode}
       AND `sensor` = {$capteur} 
sql;
 
$data = $con->query($sql)->fetchAll(PDO::FETCH_ASSOC);
$json = json_encode($data);
 
echo strtr($json, ['filename' => 'fileName', 'folderdirectory' => 'folderDirectory', 'lastchange' => 'lastChange']);


Page : Par exemple : http://xx.xxx.xxx.xxxx:XXXX/sensor_CO/getTranslation.php?periode=4&capteur=CO

( ! ) Fatal error: Uncaught Error: Call to a member function fetchAll() on bool in C:\wamp64\www\sensor_CO\getTranslation.php on line 27

( ! ) Error: Call to a member function fetchAll() on bool in C:\wamp64\www\sensor_CO\getTranslation.php on line 27
Call Stack
# Time Memory Function Location
1 0.0005 404832 {main}( ) ...\getTranslation.php:0

Merci d'avance !

Cordialement

Configuration: Windows / Chrome 80.0.3987.149

4 réponses

  1. Modérateur
    Bonjour,

    Evite de "lier" les instructions.... il est préférable de les exécuter les unes après les autres pour identifier clairement les soucis.
    $res = $con->query($sql);
    $data = $res->fetchAll(PDO::FETCH_ASSOC);
    


    Fais donc également un echo de ta variable $sql pour voir ce qu'elle contient......

    Active également la gestion des erreurs PDO :
    https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

    Reviens nous voir avec le résultat du echo et ton code modifié si l'erreur persiste.

    1
    1. Bonjour Jordane,

      Merci d'avoir répondu,

      Alors j'ai suivis vos instructions, enfin j'ai essayer de comprendre et d'améliorer suivant mon code. Peut-être que j'ai mal compris...

      Voici ce que j'ai réalisé :

      <?php
       
      include 'Database.php';
       
      $database  = new Database();
      $con = $database->getConnection();
       
      $p       = isset($_GET['periode']) ? (int)$_GET['periode'] : 1;
      $periode = [1 => 'HOUR', 2 => 'DAY', 3 => 'WEEK', 4 => 'MONTH', 5 => 'YEAR'][$p] ?? 'HOUR';
       
      $caps = [
          'CO' => 'blabla', 'CO2' => 'blabla', 'LUX'=> 'blabla', 'BAT' => 'blabla', 'HALL' => 'blabla', 'LP' => 'blabla',
          'PIR' => 'blabla', 'STR' => 'blabla', 'HUM' => 'blabla', 'PRES' => 'blabla', 'TC' => 'blabla'
      ];
      $c       = $_GET['capteur'] ?? 'TC';
      $capteur = $caps[$c] ?? 'TC';
       
      $sql = <<<sql
      SELECT `timestamp`, `sensor`, `value` 
        FROM sensorparser 
       WHERE `timestamp` > CURDATE() - INTERVAL 1 {$periode}
             AND `sensor` = {$capteur} 
      sql;
       
      echo $sql; 
      
      try {
      $res = $con->query($sql);
      $data = $res->fetchAll(PDO::FETCH_ASSOC);
      $json = json_encode($data);
      }catch (Exception $e){
       // en cas d'erreur :
         echo " Erreur ! ".$e->getMessage();
         echo " Les datas : " ;
        print_r($datas);
      }
       
      echo strtr($json, ['filename' => 'fileName', 'folderdirectory' => 'folderDirectory', 'lastchange' => 'lastChange']);
      


      Résultats :

      SELECT `timestamp`, `sensor`, `value` FROM sensorparser WHERE `timestamp` > CURDATE() - INTERVAL 1 MONTH AND `sensor` = blabla

      ( ! ) Fatal error: Uncaught Error: Call to a member function fetchAll() on bool in C:\wamp64\www\sensor_CO\getTranslation.php on line 31

      ( ! ) Error: Call to a member function fetchAll() on bool in C:\wamp64\www\sensor_CO\getTranslation.php on line 31
      Call Stack
      # Time Memory Function Location
      1 0.0011 407552 {main}( ) ...\getTranslation.php:0

      Et revenir à PDO, j'ai déjà ça sur ma page Database.php :

      <?php
      
      class Database {
      
          private $host = "xxxxxx";
          private $username = "yyyyy";
          private $password = "yyyy";
          private $database = "yyyyyyyyyyyyyyyy";
      
          public $connection;
      
          public function getConnection() {
              $this->connection = null;
      
              try {
                  $this->connection = new PDO("mysql:host=".$this->host.";dbname=".$this->database, $this->username, $this->password);
                  $this->connection->exec("set names utf8");
              } catch (PDOException $exception) {
                  echo "Error: ".$exception->getMessage();
                  die();
              }
            
      
      
              return $this->connection;
      
          }
      
          public function closeConnection() {
              $this->connection = null;
          }
      
      }
      
      ?>

      Je m'excuse d'avance si j'ai mal compris..
      0
      1. Ok, c'est bon après plusieurs heures de travailles :

        SELECT `timestamp`, `sensor`, `value` FROM sensorparser WHERE `timestamp` > CURDATE() - INTERVAL 1 MONTH AND `sensor` = blabla Erreur ! SQLSTATE[42S22]: Column not found: 1054 Champ 'blabla' inconnu dans where clause Les datas :
        ( ! ) Notice: Undefined variable: datas in C:\wamp64\www\sensor_CO\getTranslation.php on line 37
        Call Stack
        # Time Memory Function Location
        1 0.0006 404864 {main}( ) ...\getTranslation.php:0

        ( ! ) Notice: Undefined variable: json in C:\wamp64\www\sensor_CO\getTranslation.php on line 40
        Call Stack
        # Time Memory Function Location
        1 0.0006 404864 {main}( ) ...\getTranslation.php:0
        0
      2. Modérateur
        Déjà.. tu n'as pas activé les erreurs PDO dans la connexion.

        Ensuite,
        si tu regardes le echo de ta requête SQL tu vois qu'il manque des quotes...
        SELECT `timestamp`, `sensor`, `value` FROM sensorparser WHERE `timestamp` > CURDATE() - INTERVAL 1 MONTH AND `sensor` = blabla 
        

        L'as tu essayé directement dans ta BDD pour voir ce qu'elle te retourne ??

        Ca devrait être ça:
        SELECT `timestamp`, `sensor`, `value` FROM sensorparser WHERE `timestamp` > CURDATE() - INTERVAL 1 MONTH AND `sensor` = ' blabla'
        


        Au niveau de ta class, tu pourrais faire un truc du genre
        <?php
        
        class Database {
        
            private $host = "xxxxxx";
            private $username = "yyyyy";
            private $password = "yyyy";
            private $database = "yyyyyyyyyyyyyyyy";
        
            public $connexion;
        
        	function __construct(){
        		$this->getconnexion();
        	}
        	
            public function getconnexion() {
                $this->connexion = null;
        
                try {
                    $this->connexion = new PDO("mysql:host=".$this->host.";dbname=".$this->database .'charset=utf8', $this->username, $this->password);
                    // Activation des erreurs PDO
        			 $this->connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        			// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
        			 $this->connexion->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                } catch (PDOException $exception) {
                    echo "Error: ".$exception->getMessage();
                    die();
                }
                return $this->connexion;
            }
        
            public function closeconnexion() {
                $this->connexion = null;
            }
        	
        	
        	/**
        	Execution d'une requete preparee
        	*/
        	public function db_Exec($sql,$datas=NULL){
        	
        		//Execution de la requete
        		try{
        		  $requete = $this->connexion->prepare($sql) ;
        		  $requete->execute($datas) ;
        		}catch(Exception $e){
        		  // en cas d'erreur :
        		   echo " Erreur ! ".$e->getMessage();
        		   echo " Les datas : " ;
        		  print_r($datas);
        		  exit;
        		}
        		return $requete;
        	}
        	
        	/**
        	 Requête SELECT
        	 @sql string
        	 @datas array
        	 @return Array
        	*/
        	public function db_All($sql,$datas=NULL){
        		$req = $this->db_Exec($sql,$datas);
        		return $req->fetchAll();
        	}
        
        }
        
        
        ?>
        

        Et dans ton code :
        <?php
         //Affichage des erreurs PHP
         error_reporting(E_ALL);
        ini_set('display_errors', TRUE);
        ini_set('display_startup_errors', TRUE);
        
        //class de connexion à la bdd
        require_once 'Database.php';
         
        $oDb  = new Database();
        //$con = $oDb->getConnection(); // plus besoin, c'est dans le construct..
         
        $p = !empty($_GET['periode']) ? (int)$_GET['periode'] : 1;
        $c = !empty($_GET['capteur']) ? $_GET['capteur'] : 'TC';
        
        $periode = [1 => 'HOUR', 2 => 'DAY', 3 => 'WEEK', 4 => 'MONTH', 5 => 'YEAR'][$p] ?? 'HOUR';
         $caps = [ 'CO' => 'blabla', 'CO2' => 'blabla', 'LUX'=> 'blabla', 'BAT' => 'blabla', 'HALL' => 'blabla', 'LP' => 'blabla',
        		  'PIR' => 'blabla', 'STR' => 'blabla', 'HUM' => 'blabla', 'PRES' => 'blabla', 'TC' => 'blabla'
        		 ];
        		 
        $capteur = !empty($caps[$c]) ? $caps[$c] : 'TC';
         
        $sql = <<<sql
        SELECT `timestamp`, `sensor`, `value` 
          FROM sensorparser 
         WHERE `timestamp` > CURDATE() - INTERVAL 1 {$periode}
               AND `sensor` = :capteur 
        sql;
        $datas = array(':capteur'=>$capteur);
        
        $res = $oDb->db_All($sql,$datas);
        
        if(!empty($res)){
          $json = json_encode($res);
          echo strtr($json, ['filename' => 'fileName', 'folderdirectory' => 'folderDirectory', 'lastchange' => 'lastChange']);
        }else{
          echo "No result !";
        }
        
        0
    2. Merci beaucoup pour le travail fournis c'est juste énorme surtout à 21h un Samedi, désolé...

      Alors j'ai essayé ton code,

      Error: SQLSTATE[HY000] [1049] Base 'meshliumdbcharset=utf8' inconnue

      Alors j'ai enlever le charset=utf8 :

      No result !

      Je suis perdu avec mon code ça m'énerve quand ça m'arrive quoi xD
      0
      1. Modérateur
        Il y a un point virgulequi a sauté juste avant le mot charset il faut juste le remettre
        0
      2. @jordane45
        "mysql:host=".$this->host.";dbname=".$this->database .';charset=utf8', $this->username, $this->password


        Résultat :

        No result !
        0
      3. Modérateur
        @FayWennnBen.. c'est qu'il n'y a pas de résultat correspondant à ta recherche....

        Je te le redemande.. as tu testé ta requête directement dans la BDD pour savoir si elle fonctionne ?
        0
    3. Bien sûr, ça marche :
      http://82.233.223.249:8088/sensor_CO/getTranslation.php?periode=5&capteur=T

      Alors là... wtf, tout marche MAIS que sur le capteur "TC" et avec une autre lettre...

      Même si la solution est juste à côté je craque..
      0
      1. Modérateur
        Là tu nous montres le résultat du code PHP .... moi je te demande le résultat de ta requête SQL exécuté DIRECTEMENT dans ta bdd ( via phpmyadmin par exemple).

        A noter que ton array $caps... ne contient que des valeurs "blabla" ... et que tu construit ta requête à partir de cette valeur . ??

        Je pense que si tu remplaces
        $datas = array(':capteur'=>$capteur);
        

        par :
        $datas = array(':capteur'=>$c);
        

        ça fonctionnera correctement....
        Ton array $caps ne servant à rien visiblement....
        0
      2. @jordane45J'allais le faire sur ma BDD.. je viens juste de modifier par $c

        Et tout marche...

        Franchement, je sais pas comment te remercier !... Si tu as des idées.. xD

        Depuis des jours je suis dessus...
        0