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 :

Traitement des données d'une BDD


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 19
    Points
    19
    Par défaut Traitement des données d'une BDD
    Bonjour,

    Une question que je me pose : est-il préférable d'utiliser l'identifiant d'un enregistrement d'une table jointe pour faire un traitement PHP, ou vaut-il mieux utiliser son nom (libellé) ?

    Je m'explique avec un exemple simple : on a un produit, stocké dans une table "produit" et un produit a une famille, stockée dans une table "famille". On a ainsi la clé étrangère "id_famille" dans la table "produit".

    Première solution, que j'ai pris l'habitude de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Si la famille est "Tablette"
    if ($id_famille == 3) {traitement}
    L'autre solution, avec jointure SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($nom_famille == "Tablette") {traitement}
    Les deux solutions ont des avantages et inconvénients :
    - La première évite de faire la jointure SQL entre les 2 tables, puisque l'identifiant de la table "famille" est présent en clé externe dans la table "produit".
    - La première évite d'impacter le code PHP si les noms de famille sont souvent modifiés dans la BDD, c'est surtout pour cette raison que j'utilise cette solution.
    - La seconde est plus lisible et évite de mettre un commentaire pour expliquer que l'identifiant 3 de la table "famille" est 3.

    Quelle solution utilisez-vous ? et pourquoi ?

    Merci d'avance pour vos réponses

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ou avec une constante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($id_famille == ID_TABLETTE) {traitement}
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 105
    Points : 4 455
    Points
    4 455
    Par défaut
    Perso, je n'utilise jamais une structure type
    if ($categorie) { /*traitement*/ }
    si tu as 50 catégories

    utilisation de constantes : jamais car avec cette solution il est (presque)impossible d'ajouter une nouvelle catégorie sans toucher au code (au code existant*)

    Donc je vais plus privilégier une solution type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $traitement='\\categories\\traitements\\'.$categorie;
    try{
        $monTraitement = new $traitement($data);
    } catch (Exception $e) {
        $traitement='\\categories\\traitements\\generique';
        $monTraitement = new $traitement($data);
    }
    $monTraitement->run();
    echo $monTraitement->render();
    ici, j'ai un traitement générique, et pour un traitement particulier, je n'ai qu'a créer une classe particulière.

    *merci Sabo pour la précision.
    $moi= ( !== ) ? : ;

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je ne vois pas la différence dans le fait de devoir retoucher au code.

    Dans tous les cas, si on ajoute une catégorie et qu'elle est dans le cas standard, il n'y aura rien à faire. Et si elle n'est pas dans le cas standard, il faudra écrire du code.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 105
    Points : 4 455
    Points
    4 455
    Par défaut
    me suis mal exprimé Sabo

    On a pas a retoucher a ce code,
    c'est un fonctionnement type Contrôleur

    Pour moi, plus simple car pas prise de tête, même pas a relire mon code, pas a chercher ou sont les constantes, pas de modification du code existant (donc pas de création de nouveau bug).
    Bien sur, il faut relire quand même du code au moins une classe abstraite de Traitement.
    $moi= ( !== ) ? : ;

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 224
    Points
    20 224
    Par défaut
    La seconde solution est clairement mauvaise :
    • La données est susceptible de changer
    • Sujet aux erreurs de type, casse, etc. ...
    • il faudra tout réecrire le jour ou tu aura des catégories multilangue


    La solution de sabotage est probablement la meilleur alternative.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Déjà merci beaucoup pour vos réponses
    Soit je me suis mal exprimé, soit je n'ai pas tout compris :

    - sabotage : l'utilisation des constantes PHP ne me semble pas adapté, parce ce qu'elles ne seraient donc accessibles que par des développeurs web. Dans la plupart de mes projets, j'ai besoin aussi que des logiciels, des interfaces web ou des utilisateurs aient accès directement à ces identifiants via la BDD. Certes, ces identifiants de familles ne sont pas destinés à changer (les noms de famille peuvent changer par contre), donc on pourrait les assimiler à des constantes, voilà pourquoi je privilégie la première solution.

    - papajoker : si j'avais eu 50 familles, j'aurai fait un switch en groupant les familles par traitement commun, par défaut j'aurai pu aussi faire un traitement générique. Mais je ne vois pas vraiment le rapport avec ma question...
    Dans la solution que tu proposes et si on reprend mon exemple, tu aurais un traitement "\\categories\\traitements\\tablette" ou "\\categories\\traitements\\3" ? Si un jour "tablette" est renommé "tablette tactile" dans la BDD, comment fais-tu pour identifier le traitement sans toucher le code ?

  8. #8
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 224
    Points
    20 224
    Par défaut
    j'ai besoin aussi que des logiciels, des interfaces web ou des utilisateurs aient accès directement à ces identifiants via la BDD
    Et donc dans tes autres interface/logiciel tu doit aussi implémenter le même test j'imagine. Qu'est ce qui t'empèche d'utiliser des constantes dans tes autres soft ?

    Après tu peux tout à fait rajouter un champs unique dans ta base qui va servir d'identifiant textuel. Il peut même être utilisé dans tes url
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par grunk Voir le message
    Et donc dans tes autres interface/logiciel tu doit aussi implémenter le même test j'imagine. Qu'est ce qui t'empèche d'utiliser des constantes dans tes autres soft ?
    Exact, je comprends mieux la réponse de sabotage du coup : en mettant une constante sur l'identifiant dans le code, ça m'évite de mettre le commentaire, pourquoi pas... Ca permet également de la réutiliser dans plusieurs pages. C'est une pratique courante ?

    Par contre, j'y vois un inconvénient : en cas d'importante BDD, ça va faire un gros fichier de constantes à charger à l'ouverture...

    Citation Envoyé par grunk Voir le message
    Après tu peux tout à fait rajouter un champs unique dans ta base qui va servir d'identifiant textuel. Il peut même être utilisé dans tes url
    Ca me semble être la meilleure solution.

  10. #10
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 105
    Points : 4 455
    Points
    4 455
    Par défaut
    Citation Envoyé par vince-nantes Voir le message
    - papajoker : si j'avais eu 50 familles, j'aurai fait un switch en groupant les familles par traitement commun, par défaut j'aurai pu aussi faire un traitement générique. Mais je ne vois pas vraiment le rapport avec ma question...
    Dans la solution que tu proposes et si on reprend mon exemple, tu aurais un traitement "\\categories\\traitements\\tablette" ou "\\categories\\traitements\\3" ? Si un jour "tablette" est renommé "tablette tactile" dans la BDD, comment fais-tu pour identifier le traitement sans toucher le code ?
    Je répondais a Sabotage, donc pour moi il est clair que je suis a 99% pour id mais ...
    comme je pense poo avant procédural :

    Je vais + essayer de faire une class service qui elle fonctionne dans les 2 sens id<=>label
    Service indépendant, et tres souple pour répondre aux besoins.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $result=$serviceFamille->load($id, 'traitement'); // mon code precédent
    $id= $serviceFamille->papier;
    echo $serviceFamille->get(44);
    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
    class ServiceFamille {
    	private $alias;
    	public function init($file,$requeteSql){
    		// charger par fichier conf, bd , methode add ....
    		$this->alias=array(
    			'2'=>'Pierre',
    			'18'=>'Fusil',
    			'44'=>'Papier'
    		);
    	}
    	public function add($alias,$value) { $this->alias[$key]=$value; }
    	public function get($alias) { return $this->alias[$alias]; }
    	public function __get($name) { if (in_array(strtolower($name), $this->$alias)) return 44; }
     
    	public function load($alias,$class='traitement',$data=null){
    		$classe= '\\lib\\'.$this->alias[$alias].'\\'.$class.'';
    		return new $classe($data);
    	}
    }
    $moi= ( !== ) ? : ;

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Merci à vous 3 pour vos réponses, ça répond à ma question. Je mets en résolu.

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

Discussions similaires

  1. importation des données vers une BDD Mysql
    Par moabomotal dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/12/2006, 21h03
  2. Affichage des données d'une bdd dans un formulaire
    Par Shekhmet dans le forum Langage
    Réponses: 5
    Dernier message: 04/04/2006, 19h27
  3. [Formulaires] Traitement des données dans une autre page...
    Par sekiryou dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/03/2006, 09h08
  4. [PHP-JS] Traitement des données dans une autre page...
    Par sekiryou dans le forum Langage
    Réponses: 5
    Dernier message: 04/03/2006, 09h06
  5. Réponses: 1
    Dernier message: 28/09/2005, 15h35

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