IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Variable - SQL


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2019
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 46
    Par défaut Variable - SQL
    Bonjour à tous,

    J'ai un problème de variable et je ne trouve pas le problème, si quelqu'un aurait une solution ?

    Le but est depuis une requêtes SQL, avec un paramètre en fin d'URL. De récupéré depuis une période (mois, jours,...) et que l’afficher.

    - J'ai activer les erreurs PDO,
    - J'essaie d'analyser les erreurs en l'URL pour retourner un message.

    Mais j'ai un problème de variable si vous avez la réponse merci de me l'indiquer.

    Merci d'avance

    Voici mon code :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    <?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(); 
     
    $periode = 'HOUR';
    if( !empty( $_GET['periode'] ) ) {
        switch( $_GET['periode'] ) {
            case 1:
                $periode = 'HOUR';
                break;
            case 2:
                $periode = 'DAY';
                break;
            case 3:
                $periode = 'WEEK';
                break;
            case 4:
                $periode = 'MONTH';
                break;
            case 5:
                $periode = 'YEAR';
                break;
        }
    }
     
    $sql = "SELECT timestamp,sensor,value from sensorparser Where timestamp > CURDATE() - INTERVAL 1 ".$periode;
     
    $res = $oDb->db_All($sql);
     
    $result = $res->query($sql);
    $result->setFetchMode(PDO::FETCH_OBJ);
    $i=0;
    $liste=array();
    while($l=$result->fetch())
    {
    	$courant = array(
    		'timestamp'=>("/Date(".strtotime($l->timestamp)."000)/"),
    	'sensor'=>$l->sensor,
    	'value'=>$l->value);
    $liste[$i]=$courant;
    $i++;
    }
     
     
    if(!empty($res)){
      $json = json_encode($res);
      echo strtr($json, ['filename' => 'fileName', 'folderdirectory' => 'folderDirectory', 'lastchange' => 'lastChange']);
    }else{
      echo "Paramètre inconnu ";
    }

    Databse

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    <?php
     
    class Database {
     
        private $host = "xxxxxxx";
        private $username = "xxxxx";
        private $password = "xxxxx";
        private $database = "xxxxxxxxxx";
     
       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();
    	}
     
    }
     
     
    ?>

    Voici le résultat :

    ( ! ) Fatal error: Uncaught Error: Call to a member function query() on array in C:\wamp64\www\ControleAmbiance\getTranslation.php on line 39
    ( ! ) Error: Call to a member function query() on array in C:\wamp64\www\ControleAmbiance\getTranslation.php on line 39
    Call Stack
    # Time Memory Function Location
    1 0.0013 407688 {main}( ) ...\getTranslation.php:0
    Et serait-il possible de retourner en JSON un message d’erreur avec une clé (par exemple ERREUR_PARAM) et une valeur significative de l’erreur détectée (par exemple paramètre inconnu) ? Et comment faire ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 416
    Par défaut
    Bonjour,
    D'après les erreurs il s'agit plus d'un problème PHP que SQL.
    De plus l'erreur semble concerner la lignes 37 et 39. Or dans tes deux (extraits ?) de code, ces lignes sont soit vides, soit en commentaire.
    Je pense que tu devrais donc déplacer ta demande dans la bonne section du forum.

    Tatayo.

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2019
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 46
    Par défaut
    Bonjour,

    Le problème viens du premier code que j'ai affiché, de la ligne 39.
    Avec un décalage les lignes correspondent à :
    39 -> $result = $res->query($sql);

    Pas de problème au niveau de ma BDD sur phpMyAdmin...

    Je ne comprends pas du tout pourquoi j'ai un problème..

    Concernant la connexion rien à redire les coordonner sont parfait, c'est obligé que ce soit un problème de variable ou de code...

    Merci d'avance

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 416
    Par défaut
    Ça ressemble tout de même à un problème PHP:
    Le premier code:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $res = $oDb->db_All($sql);
     
    $result = $res->query($sql);
    Le deuxième code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /**
    	 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();
    Visiblement db_all renvoie un tableau, le premier code tente de lancer query sur le résultat de db_all, et le message t'indique clairement que ce n'est pas possible
    Fatal error: Uncaught Error: Call to a member function query() on array in C:\wamp64\www\ControleAmbiance\getTranslation.php on line 39
    Donc le problème ne situe clairement pas dans la requête, mais bien dans le code, à moins que les commentaires ne soient pas à jour...

    Tatayo.

    P.S. je vois que la discussion a été déplacée dans la section PHP, donc mes "réflexions" sur le SQL n'a plus lieu d'être...

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    salut,

    regarde ce que renvoie ta fonction db_All : return $req->fetchAll(); et fetchAll() renvoie un array.
    Donc quand tu fais : $res = $oDb->db_All($sql); $result = $res->query($sql);, $res est un array, d'où l'erreur

  6. #6
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2019
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 46
    Par défaut
    Bonjour,

    Désolé tatayo pour la confusion du forum..

    rawsrc, je ne comprends pas trop votre solution,
    c'est déjà effectuer.. enfin je crois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $sql = "SELECT timestamp,sensor,value from sensorparser Where timestamp > CURDATE() - INTERVAL 1 ".$periode;
     
    $res = $oDb->db_All($sql);
     
    $result = $res->query($sql);
    $result->setFetchMode(PDO::FETCH_OBJ);
    $i=0;
    $liste=array();
    ...
    Pouvez-vous si possible reprendre mon code en le modifiant, si possible ?
    Je testerais juste après.

    Merci d'avance

  7. #7
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    je t'ai juste indiqué le pourquoi de l'erreur que tu as obtenu.
    J'ai repris ton code bien que je sois un peu largué dans ta logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    //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();
     
    $periods = [1 => 'HOUR', 'DAY', 'WEEK', 'MONTH', 'YEAR'];
    $periode = isset($_GET['periode']) ? (int)$_GET['periode'] : 1;
    $periode = $periods[$periode] ?? 'HOUR';
     
    $sql   = "SELECT `timestamp`, `sensor`, `value` FROM sensorparser WHERE `timestamp` > CURDATE() - INTERVAL 1 $periode";
    $data  = $oDb->db_All($sql);
    $liste = [];
    while ($data as $v) {
        $liste[] = [
            'timestamp' => ("/Date(".strtotime($v['timestamp'])."000)/"),
            'sensor'    => $v['sensor'],
            'value'     => $v['value']
        ];
    }
    // LÀ JE NE COMPRENDS PLUS RIEN : du coup $liste te sert à quoi ?
     
    if ( ! empty($data)) {
        $json = json_encode($data);
        echo strtr($json, ['filename' => 'fileName', 'folderdirectory' => 'folderDirectory', 'lastchange' => 'lastChange']);
    } else {
        echo "Paramètre inconnu ";
    }
    tu n'avais pas vu que tu envoyais deux fois la même requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $res = $oDb->db_All($sql);  // 1er envoi
    $result = $res->query($sql);  // 2ème envoi sur le tableau résultat de la 1ère requête

  8. #8
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2019
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 46
    Par défaut
    Mon objectif était de modifié mon timestamp en Date, pour que mon technicien quand il récupère la requête depuis Visual Studio= Date
    Un exemple : /Date"01299102" à la place de timestamp

    Depuis votre code :

    ( ! ) Parse error: syntax error, unexpected 'as' (T_AS) in C:\wamp64\www\ControleAmbiance\getTranslation.php on line 21
    Et il faut que j'analyse les paramètres reçus et retourner en JSON un message d’erreur avec une clé (par exemple ERREUR_PARAM) et une valeur significative de l’erreur détectée (par exemple paramètre inconnu).

  9. #9
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2019
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 46
    Par défaut
    Bonjour,

    Avez-vous trouvé des solutions concernant ce problème ?

    Merci d'avance

  10. #10
    Membre Expert
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    946
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 946
    Par défaut
    Bonjour

    Peut-être faut-il changer d'approche.

    Si j'ai bien compris, vous récupérez un timestemp dans une URL que vous cherchez à inclure en date dans la base de données. Est-ce bien cela?
    Vous cherchez donc à modifier la valeur timestemp en date par php avant l'insertion dans la base de données.

    Question 1 :
    êtes-vous sûr que l'insertion de la valeur timestemp récupérée dans la colonne date de la base de données, sans modification ne pose pas de problèmes?

    Question 2
    Avez-vous pensé à insérer la valeur timestemp récupéré dans une colonne Timestemp de la base de données et ensuite de mettre à jour votre colonne Date à partir de la colonne Timestemp? Peut-être est-ce plus facile en sql.

    Bonne continuation.

    Pierre

  11. #11
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2019
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 46
    Par défaut
    Alors, avant j'avais réalisé un code qui fonctionner très bien :

    http://82.233.223.249:8088/ControleA....php?periode=4

    J'ai voulus rajouté les erreurs PDO,

    Ce que j'ai essayer de faire, et là problème

    Par contre si l’on passe un paramètre erroné voire pas de paramètre alors qu’il est attendu rien en retour ne nous l’indique !!
    Il faut analyser les paramètres reçus et retourner en JSON un message d’erreur avec une clé (par exemple ERREUR_PARAM) et une valeur significative de l’erreur détectée (par exemple paramètre inconnu).
    Chaque type d’erreur devant être décrit le plus précisément possible.


    Dans ma page Database.php - php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    <?php
     
    class Database {
     
        private $host = "xxxxxx";
        private $username = "xxxxxx";
        private $password = "xxxxx";
        private $database = "xxxxx";
     
        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;
        }
     
    }
     
    ?>
    Code getTranslation.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    <?php
    include 'Database.php';
     
    $database = new Database();
    $con = $database->getConnection();
     
     
    $periode = 'HOUR';
    if( !empty( $_GET['periode'] ) ) {
        switch( $_GET['periode'] ) {
            case 1:
                $periode = 'HOUR';
                break;
            case 2:
                $periode = 'DAY';
                break;
            case 3:
                $periode = 'WEEK';
                break;
            case 4:
                $periode = 'MONTH';
                break;
            case 5:
                $periode = 'YEAR';
                break;
        }
    }
     
    $sql = "SELECT timestamp,sensor,value from sensorparser Where timestamp > CURDATE() - INTERVAL 1 ".$periode;
     
    $result = $con->query($sql)->fetchAll(PDO::FETCH_ASSOC);
     
    $result = $con->query($sql);
    $result->setFetchMode(PDO::FETCH_OBJ);
    $i=0;
    $liste=array();
    while($l=$result->fetch())
    {
    	$courant = array(
    		'timestamp'=>("/Date(".strtotime($l->timestamp)."000)/"),
    	'sensor'=>$l->sensor,
    	'value'=>$l->value);
    $liste[$i]=$courant;
    $i++;
    }
     
     
    header("content-type:application/json");
     
    $value = str_replace("filename", "fileName", json_encode($liste));
    $value = str_replace("folderdirectory", "folderDirectory", $value);
    $value = str_replace("lastchange", "lastChange", $value);
     
    echo $value;
     
    $database->closeConnection();
    $database = null;
    $con = null;
    exit();
    Merci d'avance

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. variables & sql
    Par ricoree78 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/09/2007, 15h47
  2. [SQL] $_POST avec une variable SQL
    Par heruwenli dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 31/05/2007, 16h38
  3. Variable sql => :1
    Par loupin dans le forum SQL
    Réponses: 2
    Dernier message: 02/05/2007, 22h34
  4. Réponses: 8
    Dernier message: 27/01/2007, 13h44
  5. Changer el type d'une variable sql sous postgre8/admin
    Par smag dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 24/08/2005, 12h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo