SQL - Php - 2 Requêtes - Problème
Résolu
FayWennn
-
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 :
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
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
-
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.
-
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 -
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 -
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..-
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....
-