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. 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..
    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....
    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...
  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
    1. Modérateur
      Il y a un point virgulequi a sauté juste avant le mot charset il faut juste le remettre
    2. @jordane45
      "mysql:host=".$this->host.";dbname=".$this->database .';charset=utf8', $this->username, $this->password


      Résultat :

      No result !
    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 ?
  3. 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..
    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
    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 !";
      }
      
  4. 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.