[PHP5] PACKAGE USERS - GESTION UTILISATEURS - LES ITERATEURS EN PHP

Naixn Messages postés 455 Date d'inscription mardi 17 septembre 2002 Statut Membre Dernière intervention 22 juillet 2007 - 24 nov. 2006 à 14:14
Azorkast Messages postés 1 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 29 janvier 2011 - 29 janv. 2011 à 11:34
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/40450-php5-package-users-gestion-utilisateurs-les-iterateurs-en-php

Azorkast Messages postés 1 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 29 janvier 2011
29 janv. 2011 à 11:34
Merci bcp pour ce code !
franco_se Messages postés 151 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 30 juillet 2018 2
14 sept. 2008 à 16:45
Hello

Dans le cadre d'un projet, j'utilise ton script. Mais j'ai un probleme assez enervant: j'utilise des tableaux pour la config et non du xml ( en fait un fichier YAML convertit en array ).
J'ai structuré mon tableau pour coller au xml d'exemple :

Array
(
[USER] => Array
(
[ID] => Array
(
[BDD_NAME] => id
[TYPE] => int
)

[EMAIL] => Array
(
[BDD_NAME] => email
[TYPE] => string
[MANDATORY] =>
[IDENT] =>
[DEDOUBLE] =>
)

[PASSWORD] => Array
(
[BDD_NAME] => password
[TYPE] => string
[MANDATORY] =>
[IDENT] =>
)

[NOM] => Array
(
[BDD_NAME] => login
[TYPE] => string
)

)

[SESSION] => Array
(
[0] => ID
[1] => EMAIL
)

Mais je m'arrive pas a modifier le script pour utiliser un tableau et non un xml .....
Pourrais-tu m'aider ?
Merci
soundpanther Messages postés 68 Date d'inscription vendredi 27 juillet 2007 Statut Membre Dernière intervention 31 janvier 2009
4 mai 2008 à 17:12
j'aime bien
slyfog Messages postés 4 Date d'inscription jeudi 8 septembre 2005 Statut Membre Dernière intervention 21 juillet 2007
21 juil. 2007 à 19:13
Hum... si on pousse un peu plus loin, même avec cette modif on peux pas mettre de chaine vide dans la bdd, si on a un tel besoin il faut alors carrément virer le if ^^
slyfog Messages postés 4 Date d'inscription jeudi 8 septembre 2005 Statut Membre Dernière intervention 21 juillet 2007
21 juil. 2007 à 18:57
Salut, bravo pour cette class et merci malalam de nous faire découvrir la puissance des itérateurs.
J'ai trouvé un petit défaut, lors de la creation/modification d'un utilisateur le script teste si la chaine qu'on lui fournie n'est pas vide avec un !empty(), et comme le 0 est considéré comme vide, ça ne les prend pas en compte, ce qui peut etre assez gênant dans certains cas...

Si d'autres ont rencontré le même problème voici la modif pour que ça fonctionne, ligne 456 et 513 remplacer :
if (!empty ($aValues[$sKeyName]))
par :
if ($aValues[$sKeyName] != '')
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
23 mai 2007 à 19:40
Parce que je n'y ai pas du tout pensé...
franco_se Messages postés 151 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 30 juillet 2018 2
2 mai 2007 à 19:13
comme d'ab malalam nous pond ici un pur bonheur ! :D
mais j'avais une question, somme toute conne mais ....... pourquoi , parti comme tu étais ds cette classe, tu n'as pas aussi geré la deconnection ("propre" ) du membre ? ......
( j'avais prevenu, elle est conne )
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 nov. 2006 à 08:23
De toute façon, si ce package est utilisable tel quel sans problème, comme je l'ai dit, j'en utilise une version plus complexe et complète. Il mérite qu'on l'adapte, le cas échéant. Mais ce n'est pas nécessaire.
Pour te donner une idée, dans ma version, entre autre, j'ai largement complexifié le getter de la classe abstraite pour pouvoir accéder plus facilement à tout.
De plus, un exemple d'amélioration rapide et pratique, qui ne nécessite pas d'ajout de code du tout : je travaille avec une classe de traitement de formulaire, à qui on passe notamment un masque. Par exemple, basiquement, pour traiter un email, je lui balancerais le masque "EMAIL" (y a d'autres options, mais on s'en fout là). Du coup, j'ai stocké les masques relatifs à chaque propriété de mon utilisateur : EMAIL pour l'email, TEXT pour le nom et le prénom, CODE_POSTAL pour le code postal etc...
C'est ainsi très facile à récupérer, cela fait partie de la configuration du site, et je n'ai pas à ajouter de code, juste à ajouter une description à mon fichier XML.
bj33 Messages postés 145 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 1 mai 2012
27 nov. 2006 à 18:59
<< malalam

>> tu as une erreur parce que tu es en short_open_tags à On.

non, non, ils sont bien à off.configuration php 5 recommandée strictement appliquée.pour php 4, c'est plus laxiste mais je ne teste que mes scripts avec php 4.

>> tu as cette erreur parce que tu as utilisé ZEND Studio

éffectivement, çà ne change rien à la source générée.c'est juste génant avec la plupart des ide qui renvoi une erreur qui n'en ai pas une.j'ai aussi testé avec maguma, même combat.mais c'est juste un détail, c'est un bug connu de zend mais aussi d'autres.

>> J'espère que c'est plus clair.

je commence à voir la lumière ;) ma culture "scriptique" n'est pas aussi vaste que la tienne mais en travaillant dessus je devrais pouvoir en tirer des enseignements et peut être
l'utiliser pour ma future zone membre.ton concept n'est pas simple, je vais donc travailler les scripts.

merci beaucoup d'avoir pris le temps d'écrire toutes ces lignes d'explications.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 nov. 2006 à 14:26
Au passage, le code inutilisé, ce sont les unset () et return false après les throw new Exception () dans les deux méthodes citées. Suffit de les virer.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 nov. 2006 à 14:23
Hello Bj,

merci, déjà :-)

L'en-tête XML du XHTML : tu as une erreur parce que tu es en short_open_tags à On. Il faut qu'il soit à Off.
ceci dit, chez un -mauvais- hébergeur, quand on ne peut pas modifier le php.ini, effectivement, il faut faire un echo :-)
Je travaille avec mes propres serveurs, donc je n'ai pas ce problème, ils sont bien configurés ;-)

Mais je sais que tu as cette erreur parce que tu as utilisé ZEND Studio, et son analyseur de code...et je n'ai jamais réussi à le mettre en short_open_tags à Off, celui-là. Mais c'est une mauvaise configuration du moteur interpréteur PHP de Zend, sur ce coup.

Pour la classe DB, c'est fort possible : j'ai récupéré un vieux bout de classe qui trainait, sans chercher à comprendre : le but n'est pas de montrer une classe DB, et la plupart des utilisateurs utiliseront la leur. Ce n'est pas la classe que j'utilise, parce que la mienne est faire pour mssql, à dire vrai. Bref, elle est juste là pour l'exemple. Il faut instancier la sienne.

Le fichier XML...bon...
Il décrit les champs que l'on utilise.
Il faut comprendre que ce package est un package que j'utilise dans mon taf. Mais il est simplifiée (bah oui...ma version est plus poussée vu que je la "vends", lol). Je suis parti du constat que dans certains types de sites que je devais développer, la gestion utilisateur était sensiblement toujours la même.
Sauf que les champs différaient un peu.
Dans un site, je vais avoir besoin uniquement d'un email, dans d'autres, des coordonnées postales, d'autres encore, de quelques champs supplémentaires.
Par contre, chaque fois, j'ai une table utilisateurs, et le besoin de pouvoir identifier un utilisateur, en créer un, vérifier qu'il n'y ait pas de doublon, ou encore, en modifier un.
Et évidemment, de récupérer les données utilisateur.
Du coup, j'au créé ce module.
Les itérateurs me permettent surtout de parcourir mon utilisateur, et de récupérer ce que je veux facilement : soit tout, soit uniquement les valeurs, soit uniquement les noms des champs, juste l'email, etc...
J'ai ajouté les méthodes pourt faire du get, du set, de l'update, etc.
Et j'avais besoin d'une classe DB, et que ma classe user soit capable d'attaquer la table utilisateurs, quels que soient le nom des champs, ou leur nombre. Ou leurs spécifités.
Et enfin, d'une classe SESSION, avec la même problématique : on a pas toujorus besoin des mêmes variables de session.

En décortiquant ça, j'en suis arrivé à cette classe, et à ce fameux fichier de configuration XML.
Il décrit la structure de l'utilisateur, que ce soit pour ses propriétés, ou celles de la session.

Dans les deux cas, j'ai un champ obligatoire: ID. Forcément.
Et pour les champs propriétés de l'utilisateur, 2 descriptions obligatoires :
BDD_NAME qui est le nom dans la table utilisateur, du champ en question.
ex:




La seconde, c'est le type. Dans ce package simplifié, j'en utilise 2 seulement : string et int (c'est surtout pour faire des INSERT ou des UPDATE...pour savoir si oui ou non, j'ai besoin de quotes.

Ensuite, j'ai défini des descriptions dont je peux avoir besoin :
IDENT indique que la propriété est utilisée pour l'identification.
Dans mon exemple, ce sont les propriétés EMAIL et PASSWORD.
Bref, pour identifier un mec, je dois faire le match sur ces 2 champs.

Et enfin, MANDATORY indique qu'une propriété est obligatoire pour la création d'un utilisateur (à priori, les champs décrits comme IDEBT sont aussi MANDATORY).

En clair, ce fichier XML est le descriptif de mon utilisateur, pour un site donné.
Si on a ça comme table utilisateur :
user_id, user_nom, user_prenom, user_cp, user_ville, user_email, user_pwd, et que dans ma session on a besoin de son ID, de son Email, et de son nom + prénom, que le compte
est identifié via email et pwd, et que tous les champs sont nécessaires, on aura un truc du genre :
<root>



<TYPE value="int" />

<NOM>

<TYPE value="string" />
<MANDATORY />
</NOM>


<TYPE value="string" />
<MANDATORY />


<CODE_POSTAL>

<TYPE value="string" />
<MANDATORY />
</CODE_POSTAL>
<VILLE>

<TYPE value="string" />
<MANDATORY />
</VILLE>


<TYPE value="string" />

<MANDATORY />



<TYPE value="string" />

<MANDATORY />


<SESSION>


<NOM />

</SESSION>
</root>

J'espère que c'est plus clair.
bj33 Messages postés 145 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 1 mai 2012
27 nov. 2006 à 13:35
salut malalam

heu...superbe!

je ne comprend pas tout mais je vais décortiquer, c'est sur.

une petite suggestion, dans exemple.php, le prologue xml est écrit en html directement, ce qui créer une erreur.

echo '<?xml version="1.0" encoding="iso-8859-1"?>'."\n";
?>
<!DOCTYPE html PUBLIC "-//W3C//

comme çà y en à plus

j'ai aussi çà :

Code inaccessible dans la fonction query() (ligne 44)
Code inaccessible dans la fonction connect() (ligne 22)

dans le fichier mysql.cls.php

je ne comprend pas trop comment fonctionne le fichier xml.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
24 nov. 2006 à 15:27
Bah le but est double :
- essayer de comprendre parfaitement cette *** de SPL...parce que je sens bien que c'est très puissant...mais ça reste très complexe à utiliser quand même, là. Et je sais déjà ce que je veux en faire en plus, un gros, gros projet...
- montrer aux autres ce qu'on peut faire avec (en suivant mon évolution dessus évidemment), parce que les tuto présents sur le web sont pour le moment très basiques.

Et merci ;-)
Naixn Messages postés 455 Date d'inscription mardi 17 septembre 2002 Statut Membre Dernière intervention 22 juillet 2007
24 nov. 2006 à 15:18
Ok, c'est bien ce que je pensais :)

Bon boulot quoiqu'il en soit. C'est marrant que tu t'amuses à appliquer les itérateurs un peu partout en tout cas :)

Bonne continuation ;)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
24 nov. 2006 à 14:48
Hello,

à dire vrai, j'ai pris une classe incomplète pour la DB, vu que ce n'était pas du tout le sujet de ce package. J'ai juste réécrit rapidement ce qui me manquait. Je mise plutôr sur le fait que les gens vont utiliser leur propre classe de DB.
Mais pour te répondre : j'ai 2 classes : une pour mysql, et une pour mssql en réalité. Là, je n'ai mis que mysql.
Le constructeur de la classe parente est automatiquement utilisé, vu que les filles n'en ont pas.
Le singleton est optionnel, simplement, je le règle si je veux un singleton. En général, je n'en veux pas, car j'utilise souvent plusieurs serveurs de bdd (à mon taf en tous cas).
Mais il est là, juste au cas où...j'aurais pu l'utiliser ici en effet. Mais bon...je t'ai dit, la classe est juste là comme support au package, parce qu'il me fallait bien une classe DB.
Ce n'est même pas la classe DB que j'utilise généralement, mais la mienne est exclusivement mssql.
Naixn Messages postés 455 Date d'inscription mardi 17 septembre 2002 Statut Membre Dernière intervention 22 juillet 2007
24 nov. 2006 à 14:14
Hé bé, c'est un truc bien complet.
J'ai pas testé, parceque 1/ je sais que ça marche 2/ Flemme de créer une table MySQL, mais sinon ça m'a l'air bien complet.

Juste deux remarques, notemment au niveau de dbfactory :
1/ Même pas utilisé les réflexions, tssss :p
2/ Je ne vois pas du tout à quoi te sert ton __construct ? Vu qu'il est protégé, et que tu utilise le singleton, il ne peut donc être qu'appelé par des classes filles, mais... Tu ne te serts ni de la fonction dbfactory::singleton(), ni de parent::__construct dans la classe qui étend dbfactory.

D'ailleurs, je remarque aussi qu'en fait tu n'utilises même pas la méthode singleton : ta fonction dbfactory::factory() te retourne à chaque fois une nouvelle instance de la classe, même si une instance a déjà été créée.

Après, si c'est volontaire, à savoir que tu utilises une classe générique pour différentes utilisations, alors là je comprends mieux. Mais il est vrai que je ne suis pas habitué à voir du code non utilisé dans des trucs d'exemples XD.
Rejoignez-nous