Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

GERER UN ENTREPOT VIA PHP 5 MYSQL VERSION OBJET ( PDO)


Information sur la source

Catégorie :Class et Objet ( POO ) Classé sous : php, mysql, entrepot, class, objet Niveau : Débutant Date de création : 31/03/2008 Date de mise à jour : 01/04/2008 18:43:14 Vu / téléchargé: 4 666 / 364

Note :
Aucune note

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note


Description

bonjour j'essaye de vers évoluer ma source gérer un entrepôt via php mysql en version objet

J'ai pour le moment créer un objet connexion grâce a pdo.

J'ai un peu du mal avec l'objet pour le moment, merci de vos conseils.

Ainsi je vous demande de ne pas noter ma source pour l'instant mais juste laisse des commentaires afin de savoir si je peux continuer de cette façon.

 

Conclusion

Merci de votre aide
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

31 mars 2008 15:49:40 :
oublie de la base
01 avril 2008 13:16:43 :
Suite à vos conseils je suis passe par la création d'un objet pdo afin de m'abstraire du système de base de donnée
01 avril 2008 18:43:14 :
modification de toute les requêtes en passant par pdo

Commentaires et avis

signaler à un administrateur
Commentaire de yoman64 le 31/03/2008 13:43:47

Salut,

Euh j'ai peut être mal vu, mais tu ne déclare même pas tes variables de classe... tu appeles $this->var sans arrêt, mais je ne vois null part ou tu les à déclarées...

Tant qu'à faire du php5 tu devrais déclarer la porté de tes méthodes (public,private) et de tes variables (si tu les déclarait...).

Ensuite attention, tu n'échappes pas les arguments que tu passe à MySql, donc l'injection est possible... (Peut être que tu le fais en dehors de la classe, j'ai pas regardé, après tout l'attrait de ta source a t'entendre c'était la classe).

Ta classe renvoit souvent du html ou du texte via des echo, c'est très mauvais, apprends à utiliser les exceptions ou gère les erreurs en dehors de ta classe.

Bref encore beaucoup de boulot, mais ne te décourage pas :)

signaler à un administrateur
Commentaire de coucou747 le 31/03/2008 14:17:37

tu devrais aussi separer les appels a mysql de tes classes (mettre ca dans une autre classe, faire de l'abstraction de databse)

une proposition d'amelioration interessante : la SPL te propose des interfaces et classes tres utiles qui te permettent de faire des itterators (tu peux faire ensuite un foreach sur des objets), des coutable (tu peux compter a l'aide de la fonction count, le nombre de choses que t'as dans ton objet), ou arrayacces (tu peux utiliser $objet[truc]) pour un entrepot, ca peut-etre assez utile.

http://fr.php.net/manual/nl/ref.spl.php

et pour eviter les includes, tu peux faire appel a une fonction autoload pour charger automatiquement les classes dont tu as besoin, quand tu en as besoin. Ca prend seulement quelques lignes et ca t'evite de t'embeter avec les chemins qui menent a tes classes

bonne continuation :)

signaler à un administrateur
Commentaire de neigedhiver le 31/03/2008 21:54:53

Salut,

Je rejoins a priori l'avis de Yoman64 et Coucou747.
Sauf concernant l'abstraction de base de données. A croire que si on n'utilise pas une classe d'accès au SGBDR abstraite qui permet d'utiliser MySQL aussi bien que PgSQL, ORacle, MSSql ou autre, c'est mal. Moi, je ne suis pas d'accord. Quand on travaille pour soi, qu'on n'utilise que MySQL, qu'on n'utilisera jamais rien d'autre que MySQL, qu'on ne publiera jamais son code source pour le partager, je ne vois vraiment pas l'intérêt d'utiliser une classe d'abstraction.

Pour en remettre une couche quant au HTML dans la classe : l'idéal est de séparer le traitement de l'affichage. C'est plus facile pour la maintenance et l'évolution du site. L'idéal pour cela étant d'utiliser un système de templates (entendre par là, une mise en forme automatisée des données d'après des gabarits, pas forcément utiliser Smarty ou autre moteur).
La logique veut qu'une classe de traitement de données va traiter les données, et uniquement ça. Leur affichage doit pouvoir se gérer séparément (ce qui permet de modifier la sortie, sans toucher au traitement, par exemple, produire du HTML, ou alors du XML pour utiliser sur un extranet, du PDF, et j'en passe).

Quant aux erreurs, jette un oeil aux exceptions et à trigger_error() : toujours pareil... Une classe, si elle ne peut pas travailler, va s'arrêter, et c'est le reste du programme qui se charge de gérer l'erreur. De ce côté là, t'es pas très loin de l'idée... Mais tu as encore du code redondant que tu pourrais factoriser. Pour cela, tu peux définir un gestionnaire d'erreurs (voir : set_error_handler() et set_exception_handler()). Ta classe se contente de générer une erreur (avec trigger_error si ce n'est pas une erreur fatale, ou throw new Exception si c'en est une) qui sera gérée par le gestionnaire : ça te permet de modifier plus tard la manière dont tu gères les erreurs (simple affichage, log dans un fichier, ...) sans avoir besoin de te retaper tout ton code pour changer 250 fois les mêmes lignes.

signaler à un administrateur
Commentaire de malalam le 31/03/2008 22:55:37 administrateur CS

Hello,

sans forcément exploiter une abstraction DB, je pense quand même que séparer la connexion des classes utilisatrices est une bonne idée. Créer une classe éventuellement statique gérant les connexions aide pas mal, ne serait-ce que ça. Et du coup ajouter une surcouche gérant les fonctions habituelles ET tant qu'à faire ça, en ajoutant de nouvelle ou facilitant certains aspects récurrents. Ca a l'avantage de, si un jour il passe des fonctions mysql_* à mysqli_* (désirant gérer les transactions, par exemple -mêm si on peut tjrs avec mysql_* hein...-, ce qui dans le cadre d'une gestion logistique est toujours une bonne idée...j'en sais quelquechose...), cela évitera de se retaper toutes les classes utilitaires à la main. On ne change que la classe connecteur.
Mais j'insiste sur le fait qu'une classe wrappant la db est très bien, surtout pour y ajouter des fonctionnalités toujours bienvenue.

Concernant la gestion des erreurs, je rejoins à peu près Neige sauf qu'une exception n'empêche pas de continuer un code (après le catch), et qu'un trigger_error() permet aussi de lever des erreurs fatales.

Concernant le code, tu sais qu'il existe une fonction mysql_insert_id() ? Parce que bon, créer une palette puis faire une requête allant chercher le MAX(id) ensuite pour récupérer l'id créé...sachant qu'en plus, ce ne sera pas forcément le bon, pour peu que 2 préparateurs créent une palette en même temps.
Je ne comprends pas ce que fait combo_nom_article() dans cette classe, par contre ?
Moi, je ferais plus de classes par la suite, si j'étais toi.  
T'as un entrepôt, ok. Tu as des emplacements dans cet entrepôt. L'entrepôt connait sa modélisation. Eviudemment, l'emplacement ne se connait que lui-même, et éventuellement la référence qu'il stocke.
Tu as des références : on les crée, et elles ont des "propriétés" : date de péremption peut-être ? Une unité de gestion forcément. Un comptage. Peut-être un seuil d'alerte, etc.
Tu as des approvisonnement : un appro contient x références, sur x palettes généralement (voire même, est livré par un transporteur et/ou un fournisseur). Un approvisionnement donne lieu à x réceptions...une réception, c'est une référence que l'on place sur n emplacements, mais que l'on compte auparavant (comptage exhaustif, par sondage, apparent...). Ah, et un emplacement a une hauteur, une profondeur, à minima, et on peut y placer un certain nombres de contenants : palettes dont les dimensions conviennent, colis, casiers etc...
etc etc...
A toi de trouver les bons objets à utiliser pour valider ton process, et surtout pour couvrir l'exhaustivité des besoins des gars de l'entrepôt (du préparateur au chef d'entrepôt). Mais à mon avis, tu t'es mal engagé avec cette classe qui recouvre trop de choses différentes, et trop peu de spécifiques à la fois.

signaler à un administrateur
Commentaire de neigedhiver le 31/03/2008 23:18:23

@Malalam :

"une exception n'empêche pas de continuer un code (après le catch)"

Certes... Mais je crois que je vais lancer un vrai débat sur la question...  Marcus Börger (un des auteurs de php) a dit :
"Respect these rules :
- Exceptions are exceptions
- Never use exceptions for control flow
- Never ever use exceptions for parameters passing"
Cf : http://somabo.de/talks/#20050401

Mais c'est pas vraiment l'endroit pour en parler... Cependant, c'est vraiment une question qu'on devrait aborder pour de vrai un de ces jours...

signaler à un administrateur
Commentaire de malalam le 31/03/2008 23:34:16 administrateur CS

Non, ne lançons pas le débat ici (manque un espace de discussion pérenne quand même, sur ce site!), mais Marcus est quand même plein de contradictions vu le fonctionnement des exceptions en php...et la façon dont elles sont utilisées dans certaines fonctions built-in de php.
Ceci dit, à de rares exceptions (si j'ose dire) près, c'est bien ainsi que je les utilise : le code s'arrête car il est tombé sur un os, et après quelques petites manipulations de sécurisation/log, on dégage.

signaler à un administrateur
Commentaire de coucou747 le 01/04/2008 15:38:59

ta source fait un peu vide maintenant... t'as mis une classe pdo, mais t'as vire le reste...

personellement, j'aurais imagine un truc genre :

Entrepot ---> arrayAcces
         ---> Itterator
         ---> Countable (c'est peut-etre pas vraiment utile ici)

ProduitNotFound ---> EntrepotException ---> Exception
QuantiteNegative ---> EntrepotException ---> Exception

Produit ---> SqlElement (si je mets sqlElement, c'est pour dire qu'on peut en ajouter, en supprimer, en mettre a jours, et que c'est directement relie a du sql, c'est donc pas une classe mais une interface qu'il faut faire ici)

et tu mets un array de Produit dans l'Entrepot (en private evidement)


si tu veux t'amuser avec une syntaxe marrante, tu peux mettre Produit implements coutable, ca te permettrait de faire un truc genre :

$a=Produit::GetById(15);
echo 'il y a '.count($a).' produits dans l\'entrepot.';

si tu veux lister les deplacements de produits (entrees, sorties) tu peux t'amuser a donner a produit le meme genre d'interfaces (itterator) et a ajouter trois classes pour ces entrees, sorties (une E, une S, et une interface ou abstraite).

signaler à un administrateur
Commentaire de malalam le 01/04/2008 16:45:30 administrateur CS

Hello,

à 16h45 (heure française), il manque des morceaux, non...?

signaler à un administrateur
Commentaire de fabienenvac le 01/04/2008 17:41:18

effectivement il manque des morceaux, la je suis entrain de tous transformer mes requêtes avec pdo.
je pense donc pouvoir mettre en ligne le reste d'ici ce soir et après réfléchir sur des objets propres a l'entrepôt.
Si qqn peut me donner un exemple afin de transmettre mon objet connexion cela serait appréciable.
merci

signaler à un administrateur
Commentaire de masternico le 07/04/2008 16:16:05

Salut,

Je suis d'accord avec malalam quand il parle de mysql_insert_id(), mais quand je fait des ajouts d'enregistrements dans une base de données avec liens multiples et opérateurs multiples, je préfère mettre un verrou en écriture sur les tables concernées('LOCK TABLES `articles` WRITE, `magasins` WRITE, `articles2magasins` WRITE'). Comme ça, je suis sûr de ne pas avoir de croisements de références et puis, le traitement des instructions est plus rapide en faisant comme ça.
Donc, au pire, ça bloque l'opérateur suivant pendant un quart de seconde mais ça simplifie la tâche de contrôle d'insertion.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

programmation objet et mysql en php [ par Assag ] Salut,je m'aprête à réécrire un gros site php en version objet. Mais on m'a dit que la prog. objet posait des problèmes avec MySQL, en gros, que les r Débute en MySQL [ par snoop47 ] Bonjour,Je suis un webmaster débutant et j'aimerais savoir comment et où vous avez appris vos bases en MySQL. Je connais le HTML et le PHP bien évidem Configuration de EasyPHP [ par perig ] Bonjours J'ai installé easy php mais je n'arrive pas a configurer ma bd pour pouvoir y accéder comment on fait?Mon code marche sur lycos mais pas chez PHP MYSQL [ par 206ruggeri91 ] Bonjour j ai un probleme, car j ai creer ma table mysql en php, mais je n arrive pas a y inserer les donnees avec mon appli, j evoulais savoir si que Retouches sur un scripts [ par apz ] salut,ce script php, un guestbook, est le livre d'or que je cherchais.mais voila il se base sur les Class, que je ne connais pas desormais.alors je vo php/mysql erreur incomprehenssible <help> [ par luccs ] bonjour, voila j ais fait un petit script qui va gentilment afficher les details d un fournisseur (lister dans une box)mais voila il plante quand l id indentification et connexion grâce à un formulaire [ par auremy ] Bonjour,J'ai crée un formulaire html qui permet à l'utilisateur de saisir son login et son mot de passe. La validation envoye ses informations à une p install mysql sous mandrake ! [ par fmazoue ] je crois avoir installé tout mes package !mysql fonctionne lorsque je l'utilise avec des prog en java ou avec des pages jsp !mais pour php celui ci ne Aide pour démarrer avec easy php et mysql [ par darkangelw40k ] Bonjour à tous, tout d'abord bravo pour ce site il est vraiment trés bien fait... Néanmoins, voici ma question, je souhaiterai faire fonctionner certa Php et Mysql [ par airtom24 ] Bonjour a tous,Je me suis mit depuis peu aux bdds, et j'ai une question pour vous :J'ai cree une bdd avec deux tables pour le moement ;-), j'arrive a


Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,39 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.