SQL - Php - 2 Requêtes - Problème [Résolu]

Signaler
-
 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

Messages postés
28930
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 mai 2020
2 467
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://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs


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

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..
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
Messages postés
28930
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 mai 2020
2 467
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 !";
}
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
Messages postés
28930
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 mai 2020
2 467
Il y a un point virgulequi a sauté juste avant le mot charset il faut juste le remettre
>
Messages postés
28930
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 mai 2020

"mysql:host=".$this->host.";dbname=".$this->database .';charset=utf8', $this->username, $this->password


Résultat :

No result !
Messages postés
28930
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 mai 2020
2 467 > 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 ?
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..
Messages postés
28930
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 mai 2020
2 467
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....
>
Messages postés
28930
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
29 mai 2020

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...