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

Langage PHP Discussion :

afficher le contenu d'une table MySql avec PhpEcho


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut afficher le contenu d'une table MySql avec PhpEcho
    Bonjour,

    pour afficher des données simples, aucun souci avec PhpEcho. Par contre, échec pour afficher le contenu d'une table MySql.

    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
    public function Display_Billet($Val){
    		  // rendu du corps de la page
    		  $Bil = new PhpEcho([DIR_ROOT, 'view Billet.php']);  
     
    		  // données attendues par le fichier vue
    		  // tu peux extraire ces données d'une base de données, à toi de voir
    		  // du moment que les variables attendues par la page HTML sont bien définies
    		  var_dump($Val[0]['contenu']);echo "model/Billet contenu=".$Val[0]['contenu']."<br/>";
    		  $Bil['titre'] =   $Val[0]['titre'];
    		  $Bil['date_creation'] =  $Val[0]['date_creation'];
    		  $Bil['contenu'] =  $Val[0]['contenu'];
     
    		  // insertion du corps de la page dans le layout
    		  $page = new PhpEcho([DIR_ROOT, 'view Layout.php']); 
    		  $page['body'] = $Bil;//var_dump($Bil);
     
    		  // renvoi de la page au navigateur
    		  echo $page;
    	}
     
    	public function Read_Billet($Id){
    		$pdo=new MYPDO();   // creation of an object for DB (instantiation of MYPDO)
    		//extraire données de la bdd(titre, date, contenu)
    		$Req='select * from `billets` where id=:id';
    		$var=$pdo->select($Req,[':id'=>$Id]);
    		$this->Display_Billet($var);
    		return($var);
    	}  
     
    	public function Read_All_Billets(){
     
    		$pdo=new MYPDO();   // creation of an object for DB (instantiation of MYPDO)
    		$ret=[];
    		$Req='select id from `billets`';
    		$var=$pdo->select($Req,[]);//var_dump($var);
    		foreach($var as $id) 
    		{
    				$ret[]=$this->Read_Billet($id['id']);
    		}
    		return($ret);
    	}
    La méthode Read_All_Billets appelle la méthode Read_Billet qui appelle la méthode Display_Billet. Cette dernière fait appel à PhpEcho pour afficher le contenu d'une table MySql retourné par Read_Billet. Le souci est que l'affichage est partiel et notamment la colonne contenu de la table n'est pas affiché. Pourtant, la valeur existe bien, comme l'atteste le echo de la ligne 8. Si je remplace $Val[0]['contenu'] par le mot 'test' dans la ligne 11, le mot 'test' est bien affiché, mais pas le contenu de la colonne de la table. Pourquoi ?

    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    salut,

    poste le code de MYPDO et la structure de ta table billet (copie colle la DDL, de préférence).
    Ensuite je te conseille très fortement de respecter les standards en matières de codage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function displayBillet($val)
    public function readBillet($id)
    public function readAllBillets()
    L'accolade ouvrante d'une fonction doit toujours être sur la ligne suivant sa déclaration.
    Tu dois aussi choisir quelle notation tu préfères pour tes variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $idBillet
    $id_billet // ma préférence
    Et une fois ces choix arrêtés, tu t'y tiens PARTOUT.

    Enfin, remplace tes tabulations par 4 espaces.

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    OK pour les standards de codage et le DDL de la table billets :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DROP TABLE IF EXISTS `billets`;
    CREATE TABLE IF NOT EXISTS `billets` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `titre` varchar(255) COLLATE utf8_bin NOT NULL,
      `contenu` text COLLATE utf8_bin NOT NULL,
      `date_creation` datetime NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    et ceci ça dit quoi :
    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
    public function renderBillet($data)
    {
        // rendu du corps de la page
        $block = new PhpEcho([DIR_ROOT, 'view Billet.php']);
     
        // données attendues par le fichier vue
        // tu peux extraire ces données d'une base de données, à toi de voir
        // du moment que les variables attendues par la page HTML sont bien définies
        $block['titre'] = $data['titre'];
        $block['date_creation'] = $data['date_creation'];
        $block['contenu'] = $data['contenu'];
        return $block;
    }
     
    public function renderPage(array $data)
    {
        $rows = [];
        foreach ($data as $d) {
            $rows[] = (string)$this->renderBillet($d);
        }
     
        $page = new PhpEcho([DIR_ROOT, 'view Layout.php']);
        $page['body'] = implode('', $rows);
     
        // renvoi de la page au navigateur
        echo $page;
    }
     
    public function readAllBillets()
    {
        $pdo  = new MYPDO();
        $sql  = 'SELECT * FROM `billets`';
        return $pdo->select($sql);
    }

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    D'abord, ça a dit que j'ai mis pas mal de temps à trouver comment utiliser ce code.

    Pour finir, j'ai créé la méthode suivante dans la classe Billet :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function Display_All_Billets()
    {
        $this->renderPage($this->readAllBillets());
    }
    (en plus des méthodes que tu proposes) et dans index.php, je l'ai déclarée aussi :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $actions = [
    	'liste_billets' => ['class' => 'model\Billet', 'fonction' => 'Read_All_Billets'],
        'achat_billet'  => ['class' => 'model\Billet', 'fonction' => 'AchatBillet'],
        'display_billets' => ['class' => 'model\Billet', 'fonction' => 'Display_All_Billets']
    ];

    Malheureusement, l'URL http://localhost/phpecho-billet2/?action=display_billets produit exactement la même chose que j'avais avant ; il y a 2 billets dans la table billets. Pour le premier sont affichés titre et date et pour le second que la date, mais jamais le contenu.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Je voyais plutôt un truc dans ce genre :
    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
    61
    <?php
     
    declare(strict_types=1);
     
    namespace model;
     
    use vendor\PhpEcho\PhpEcho;
    use classes\MYPDO;
     
    class Billet
    {
        /**
         * Rendu HTML d'un billet
         *
         * @param array $data
         * @return PhpEcho
         */
        public function renderBillet(array $data): PhpEcho
        {
            return new PhpEcho([DIR_ROOT, 'view Billet.php'], [
                'titre' => $data['titre'],
                'date_creation' => $data['date_creation'],
                'contenu' => $data['contenu']
            ]);
        }
     
        /**
         * Rendu HTML de la page
         *
         * @param array $data
         * @return PhpEcho
         */
        public function renderPage(array $data): PhpEcho
        {
            $rows = [];
            foreach ($data as $d) {
                $rows[] = $this->renderBillet($d); // rendu HTML pour chaque billet
            }
            return new PhpEcho([DIR_ROOT, 'view Layout.php'], ['body' => implode('', $rows)]);
        }
     
        /**
         * Renvoi au navigateur la page avec tous les billets
         *
         * @param array $data
         */
        public function displayPage()
        {
            echo $this->renderPage($this->readAllBillets());
        }
     
        /**
         * @return mixed
         */
        public function readAllBillets()
        {
            $pdo  = new MYPDO();
            $sql  = 'SELECT * FROM `billets`';
            return $pdo->select($sql);
        }
    }
    et pour le tableau des actions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $actions = [
        'liste_billets' => ['class' => 'model\Billet', 'fonction' => 'displayPage']
    ];
    tu peux très bien poser une convention de nommage :
    toutes les fonctions commençant par render ⇒ elles renvoient une instance de PhpEcho, et toutes les fonctions commençant par display ⇒ elles envoient les données directement au navigateur.
    Ainsi, tu peux séparer la construction de tes blocs de vue du rendu d'une page avec un layout.

    Je te rappelle que je n'ai pas accès à ton environnement de développement donc je joue pour pas mal aux devinettes : adapte mon code, mais la trame est là.

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Tu te débrouilles bien aux devinettes car ça a l'air bon.
    Par contre, j'ai une erreur dont je n'arrive pas à me défaire :
    Fatal error: Uncaught Error: Class 'model\Billet' not found in C:\wamp64\www\phpecho-billet2\index.php on line 52
    La ligne 52 de index.php est $class = new $class_name; dans le système de routage basique.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    bah oui parce que j'ai fait une boulette :
    remplace namespace model\Billet; par juste namespace model;.

    Je ne sais pas si tu réalises qu'avec ce découpage tu te rapproches dangereusement d'un MVC assez propre.

  9. #9
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Merci ; j'ai corrigé tes 2 boulettes (celle-là et le bug pour appeler la méthode select (j'ai du remplacer 2 fois $pdo->select($sql) par $pdo->select($sql,[]) )) mais le problème décrit dans le post #5 reste...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    ça veut juste dire que ton extraction de données pose problème.
    Tu ne veux vraiment pas poster le code source de la classe MYPDO ?

  11. #11
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 382
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    oups, tu me l'avais demandé hier au post #2 et j'ai zappé...

    MYPDO.php :
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    <?php
     
    declare(strict_types=1);
     
    //namespace classes\MYPDO;
    namespace classes;
     
    /**
     * TUTORIAL DVP SUR LE CONCEPT MVC : MODÈLE-VUE-CONTRÔLEUR
     * @link https://www.developpez.net/forums/blogs/32058-rawsrc/b7786/developpement-selon-l-approche-mvc-modele-vue-controleur-retour-theorie/
     * @link https://www.developpez.net/forums/blogs/32058-rawsrc/b7804/developpement-selon-lapproche-mvc-modele-vue-controleur-cas-pratique/
     */
    class MYPDO
    extends \PDO
    {
        /**
         * @var \PDO
         */
        private static $pdo = null;
     
        public function __construct()
        {
            if (self::$pdo === null) {
                self::connect();
            }
            return self::$pdo;
        }
     
        /**
         * @param  string scheme     Ex: mysql pgsql...
         * @param  string $host      Adresse IP du serveur
         * @param  string $database  Nom de la base de données
         * @param  string $user      Nom de l'utilisateur
         * @param  string $pwd       Mot de passe de la connexion
         * @param  string $port      Numéro du port pour la connexion
         */
        private static function connect(string $scheme = DB_SCHEME, string $host = DB_HOST, string $database = DB_NAME,
                                        string $user = DB_USER, string $pwd = DB_PWD, string $port = DB_PORT)
        {
     
            $dsn = "{$scheme}:host={$host};dbname={$database};";
     
            if ((int)($port)) {
                $dsn .= "port={$port};";
            }
     
            try {
                self::$pdo = new \PDO($dsn, $user, $pwd, [
                    \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
                    \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
                    \PDO::ATTR_EMULATE_PREPARES   => false
                ]);
            } catch (\PDOException $e) {
                throw $e;
            }
        }
     
        /**
         * @param  mixed $sql
         * @param  mixed $values    [:tag => value] si pas de values, mettre [] en argument
         * @param  mixed $types     [:tag => PDO::PARAM_XXX] si tag absent alors PDO::PARAM_STR
         * 
         * @return array            null si erreur
         */
        public function select($sql, array $values, array $type = []): ?array
        {
            try {
                $stmt = self::$pdo->prepare($sql);
                foreach ($values as $tag => $v) {
                    $stmt->bindValue($tag, $v, $type[$tag] ?? \PDO::PARAM_STR);
                }
                $exec = $stmt->execute();
                return $stmt->fetchAll(\PDO::FETCH_ASSOC);
            } catch (\PDOException $e) {
                error_log('PDO::select - '.$e->getMessage());
                return null;
            }
        }
     
    }
    C'est 100% ton code (rien changé)
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

Discussions similaires

  1. Afficher le contenu d'une table MySQL
    Par kada76 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 09/08/2016, 11h57
  2. [Oracle] afficher le contenu d'une table oracle avec php
    Par bsidy1 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 09/12/2008, 09h25
  3. [MySQL] Afficher le contenu d'une table MYSQL selon un critère bien défini
    Par Webnadou dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/09/2007, 21h38
  4. [Prototype] Afficher le contenu d'une table MySQL
    Par Claire.Heitz dans le forum Bibliothèques & Frameworks
    Réponses: 4
    Dernier message: 22/08/2007, 00h10
  5. Réponses: 2
    Dernier message: 09/11/2006, 09h59

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