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

Résolu/Fermé
FayWennn - Modifié le 28 mars 2020 à 17:51
 FayWennn - 28 mars 2020 à 23:05
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
A voir également:

4 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
28 mars 2020 à 18:04
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
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
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
28 mars 2020 à 21:06
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
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
28 mars 2020 à 22:13
Il y a un point virgulequi a sauté juste avant le mot charset il faut juste le remettre
0
FayWennn > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
28 mars 2020 à 22:19
"mysql:host=".$this->host.";dbname=".$this->database .';charset=utf8', $this->username, $this->password


Résultat :

No result !
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > FayWennn
28 mars 2020 à 22:42
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
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
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
28 mars 2020 à 22:59
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
FayWennn > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
Modifié le 28 mars 2020 à 23:05
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