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 "name" et pas la clé ; quelle conception ?


Sujet :

Langage PHP

Vue hybride

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 508
    Billets dans le blog
    1
    Par défaut afficher le "name" et pas la clé ; quelle conception ?
    Bonsoir,

    je cherche une bonne conception pour répondre au besoin, sans générer une usine à gaz (car ça, c'est là où j'arriverai sans vos conseils ).
    Le but est d'afficher les données relatives à une liste de tickets. Ces données sont stockées dans une bdd MySQL. Donc afficher le contenu de la table qui contient les données, c'est simple :
    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
     
     
    <?php
    echo "<table><tr>";
    foreach(($this['columnName']) as $colName) // $this['columnName']=list of the column's names
        {
            echo "<th>".$colName['COLUMN_NAME']."</th>";
        }
    echo "</tr>";
     
    foreach($this['ret'] as $line) // $this['ret'] is the result (FetchAll) of $sql="SELECT * from `tickets`";
    {
         echo "<tr>";
        foreach ($line as $cellLine)
        {
            echo "<td>" . $cellLine . "</td>";
        }
        echo "</tr>";
    }
    echo "</table>";
     
    ?>
    Mais le souci est que par souci d'optimisation de la mémoire de la bdd, pour certaines données (priority et status), on a pas stocké les noms mais des clés (donc des chiffres à la place des noms). Donc pour ces données, si on affiche le contenu de la table, on affichera la clé à la place du nom.

    pour info :
    tickets.sql :
    Code sql : 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
    DROP TABLE IF EXISTS `tickets`;
    CREATE TABLE IF NOT EXISTS `tickets` (
      `id` smallint(11) NOT NULL AUTO_INCREMENT,
      `id_SESA` int(6) DEFAULT NULL,
      `product_name` varchar(25) COLLATE utf8_bin DEFAULT NULL,
      `assigned_group` varchar(30) COLLATE utf8_bin DEFAULT NULL,
      `submitted_date` datetime NOT NULL,
      `last_resolved_date` datetime NOT NULL,
      `summary` varchar(200) COLLATE utf8_bin NOT NULL,
      `priority_key` smallint(2) NOT NULL,
      `status_key` smallint(3) NOT NULL,
      `region` varchar(10) COLLATE utf8_bin DEFAULT NULL,
      `country` varchar(10) COLLATE utf8_bin DEFAULT NULL,
      `submitter_SESA` int(6) NOT NULL,
      `customer_SESA` int(6) NOT NULL,
      `organization` varchar(30) COLLATE utf8_bin DEFAULT NULL,
      `incident_type` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      `reported_source` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `Prioritytype` (`priority_key`),
      KEY `Statustype` (`status_key`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    priority.sql :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DROP TABLE IF EXISTS `priority`;
    CREATE TABLE IF NOT EXISTS `priority` (
      `id` smallint(2) NOT NULL AUTO_INCREMENT,
      `name` varchar(6) COLLATE utf8_bin NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      UNIQUE KEY `name` (`name`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    status.sql :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DROP TABLE IF EXISTS `status`;
    CREATE TABLE IF NOT EXISTS `status` (
      `id` smallint(3) NOT NULL AUTO_INCREMENT,
      `name` varchar(13) COLLATE utf8_bin NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      UNIQUE KEY `name` (`name`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    Le but est évident : pour chaque ticket, afficher la liste des valeurs, mais en mettant les noms à la place des clés.
    A mon avis, il faut la bonne requête SQL qui donnera ça. Mais incapable de la trouver. Pouvez-vous m'aider ?

  2. #2
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Par convention, les clés étrangères ont le même nom dans toutes les tables.
    Et apparemment, si tu étais vraiment en POO, tu gérerais cette fonctionnalité dans ton modèle


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM tickets t LEFT JOIN priority p ON t.priority_key = p.id
    LEFT JOIN status s ON t.status_key = s.id

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 508
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    je ne m'attendais pas à une réponse si rapide !
    Quand tu parles de modèle, fais-tu allusion à l'architecture MVC ?

    J'ai tenu compte des conventions :

    priority.sql :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE `priority` (
      `priority_key` smallint(2) NOT NULL,
      `priority` varchar(6) COLLATE utf8_bin NOT NULL DEFAULT ''
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    status.sql :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE `status` (
      `status_key` smallint(3) NOT NULL,
      `status` varchar(13) COLLATE utf8_bin NOT NULL DEFAULT ''
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    d'où la requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM tickets t LEFT JOIN priority p ON t.priority_key = p.priority_key
    LEFT JOIN status s ON t.status_key = s.status_key
    pourquoi LEFT ?

    dans l'affichage, il faudra que j'élimine les colonnes *_key

  4. #4
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Oui, je fais allusion à l'architecture MVC.
    pourquoi LEFT ?
    Pour récupérer tous les enregistrements de la table "tickets" qui n'auraient pas de correspondance dans les tables jointes.
    dans l'affichage, il faudra que j'élimine les colonnes *_key
    Dans ma construction, la requête retourne "*", rien ne t'empêche de limiter les champs retournés (c'est même conseillé).
    Dans ta boucle, tu affiches les champs nécessaires voilà tout.

  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 : 50
    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 Laurent,

    présente plutôt comme ça le rendu :
    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
    <?php
     
    $head = [];
    foreach ($this('columnName') as $col) {
        $head[] = "<th>{$col['COLUMN_NAME']}</th>";
    }
     
    $rows = [];
    foreach ($this('ret') as $data) {
        $rows[] = '<tr>';
        foreach ($data as $value) {
            $rows[] = "<td>{$value}</td>";    
        }
        $rows[] = '</tr>';
    }
    ?>
    <table>
      <thead>
        <tr><?= implode('', $head) ?></tr>      
      </thead>
      <tbody>
        <?= implode('', $rows) ?>
      </tbody>   
    </table>
    N'oublie pas que quand tu fais appel à PHPEcho ainsi $this('ret') (comme une fonction) toutes les valeurs contenues dans le tableau des valeurs ayant 'ret' pour clé sont échappées récursivement avant d'être renvoyées par la fonction. Sont échappées toutes les clés et toutes les valeurs, ainsi tu peux tout utiliser dans un affichage sans te soucier de l'échappement.

    L'autre notation $this['ret'] (notation tableau) te renvoie les données bruts et la il faut que tu penses à les échapper. C'est utile par exemple quand tu dois faire un test de comparaison dans ton rendu, quand tu ne sais pas si la donnée va être modifiée par l'échappement avec htmlspecialchars, il est préférable de la conserver brut. C'est très rare, mais ça peut arriver.
    Dans ce cas de figure tu devrais faire ainsi :
    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
    <?php
     
    $head = [];
    foreach ($this['columnName'] as $col) {
        $head[] = "<th>{$this('hsc', $col['COLUMN_NAME'])}</th>";
    }
     
    $rows = [];
    foreach ($this['ret'] as $data) {
        $rows[] = '<tr>';
        foreach ($data as $value) {
            $rows[] = "<td>{$this('hsc', $value)}</td>";
        }
        $rows[] = '</tr>';
    }
    ?>
    <table>
      <thead>
        <tr><?= implode('', $head) ?></tr>
      </thead>
      <tbody>
        <?= implode('', $rows) ?>
      </tbody>
    </table>
    Dans ton rendu, sépare plus tes traitements de l'affichage à proprement parler

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 508
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    j'ai mis un temps fou à répondre...
    @ ma5tr3, all is OK

    @ rawsrc : j'ai du mal à faire marcher ton code qui est bogué :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $rows = [];
    foreach ($this('ret') as $data) {
        $rows[] = '<tr>';
        foreach ($data as $value) {               // foreach attend un array mais $data est une string de longueur nulle et rien à voir avec un élément du tableau $this('ret')
            $rows[] = "<td>{$value}</td>";    
        }
        $rows[] = '</tr>';
    }
    Comme je n'arrive pas à déboguer, peux-tu le faire ?

Discussions similaires

  1. Afficher double quote " dans un echo
    Par Xenon03 dans le forum Langage
    Réponses: 3
    Dernier message: 02/09/2009, 10h36
  2. afficher des quotes dans un champ de formulaire
    Par benkunz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 07/10/2007, 14h45
  3. Afficher les pseudos qui ne commencent pas par une lettre.
    Par asoka13 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/07/2007, 17h30
  4. Réponses: 3
    Dernier message: 26/07/2006, 20h41

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