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

Résolu
FayWennn -  
 FayWennn -
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. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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
  2. FayWennn
     
    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. FayWennn
       
      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. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      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
  3. FayWennn
     
    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. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Il y a un point virgulequi a sauté juste avant le mot charset il faut juste le remettre
      0
      1. FayWennn > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         
        "mysql:host=".$this->host.";dbname=".$this->database .';charset=utf8', $this->username, $this->password


        Résultat :

        No result !
        0
      2. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > FayWennn
         
        Ben.. 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
  4. FayWennn
     
    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. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      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
      1. FayWennn > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         
        J'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