|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : février 2008 Messages : 7 ![]() |
Bonjour,
je débute en php et souhaiterais avoir quelques conseils et suggestions concernant mon formulaire d'inscription. J'ai quelques questions : 1. est il nécessaire d'échapper les variables issus d'un formulaire lorsque l'on utilise des requêtes préparées ? Ne serais ce pas doublon ? 2. Je n'ai pas echappé mes variables 'entier' avec intval notamment à cause de la variable code postal '$cp' ligne 17, qui est ensuite testé comme condition ligne 35 afin notamment de pouvoir obtenir le message d'erreur correspondant. Suis je obligé de l'échapper uniquement au moment de la condition ? Car si je l'échappe avant, ma condition sera tirs validée puisque 'intval' l'aura transformée en entier meme si cette dernière est à l'origine un string ? (serais dans ce cas égal à 0) 3. N' y at'il pas moins fastidieux que le 'try' et 'catch' de PDO pour capturer les erreurs et empêcher aux membres de voir des infos stratégiques en cas d'erreur de la db ? 4. LE PLUS IMPORTANT : AVEZ VOUS DES CONSEILS, REMARQUES ET SUGGESTIONS POUR AMELIORER LA LISIBILITE, LA SECURITE ET LES BONNES PRATIQUES A UTILISER POUR M'AMELIORER ? Merci d'avance à tous et longue vie à développez.com Code :
|
||
|
|
10
|
|
|
#2 | ||
![]() ![]() Développeuse PHP/Java Inscription : avril 2007 Messages : 3 664 ![]() |
Citation:
Citation:
Sinon au niveau structure : au lieu de faire tes tests dans des ifs imbriqués, tu peux tout tester dans des ifs successifs et renseigner un booléen $en_erreur. Ensuite, tu encadres tes requêtes avec un if qui teste ton booléen $en_erreur. (le même principe que ton booléen $form en fait)
__________________
Modératrice PHP Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) |
||
|
|
00
|
|
|
#3 | |||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Citation:
PDO échappe les variables mais ça ne te protège pas contre les XSS, pour ça il y a les filtres et strip_tags. Les filtres sont un must have en qualité de sécurisation des entrées sorties (à mettre des deux cotés donc pour se prémunir des attaques). Citation:
Citation:
Citation:
Une exception est par définition exceptionnelle: on ne la lance que quand il n'y a plus rien d'autre à faire. L'exemple type est le cas de comportement incorrect au niveau d'un constructeur, vu qu'il ne renvoie rien, comment notifier le bloc parent qu'il y a eu un erreur ? On lève une exception. Dans tous les cas il faut tout vérifier et ne JAMAIS faire de "or die". Cette pratique à été introduite dans beaucoup de scripts PHP par des développeurs incompétents et malheureusement dans énormément de tutoriaux. Il y a toujours quelque chose à faire en cas d'erreur critique (à minima mettre une info dans un fichier de log avant de sortir). Citation:
Note:
Dans tous les cas, teste, teste et teste encore, c'est en essayant et en ratant inlassablement qu'on apprends le plus.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|||||
|
00
|
|
|
#4 | |||||||
|
Invité de passage
![]() Inscription : février 2008 Messages : 7 ![]() |
Bonsoir tout le monde, et merci pour ces deux réponses. C sympa
Sur vos conseils,j'ai lu la doc PDO, et j'ai appris pas mal de choses. J'ai également regardé du coté des filtres et strip_tags et je pense en avoir compris l'intérêt. Citation:
D'ailleurs a ce propos, auriez vous une structure en tête pour récupérer tous les messages d'erreurs et les afficher en entête de formulaire lors de saisies erronées ? Je ne trouve pas très élégant de créer une variable par erreur et afficher toutes ces variables au dessus du formulaire avec des if à gogo. Pas de possibilité d'utiliser un tableau associatif d'erreurs ou quelque chose du genre ? Citation:
Dans ce cas, il vaut mieux utiliser les filtres et strip_tags ? Pas certain d'avoir saisi. Citation:
Citation:
Je verifie si "$mon_objet->execute()" renvoie "true" ? et si ce n'est pas le cas, que dois je faire ? je balance un message d'erreur ou lève une exception ? Citation:
Je me documente sur les iterator et je reviendrais aux questions, si j'ai un soucis. Donc probablement bientôt Pour le pattern MVC, c'est en cours, je ne voulais pas tout faire d'un coup. :lil: Citation:
![]() Citation:
![]() Pour le singleton, et le fait que j'ai ouvert une connexion à la db plusieurs fois. Nous sommes d'accord que le singleton permet de n'instancier qu'une seule fois la classe. (en gros de s'assurer qu'une seule connexion à la db est ouverte.) Cependant je pensais que le closecursor permettait de fermer la connexion. Hors je m'aperçois que cela n'a absolument rien à voir. Donc question : 1. Dois t'on obigatoirement fermer la connexion à une db ? Si oui, en fin de script ? Et comment ? En tuant l'objet $connexion ? Si c'est en tuant l'objet, le simple fait d'aboutir à la fin du script, ferme donc automatiquement la connexion ? 2. Le closecursor sert concrètement a quoi ? j'ai lu la doc PDO et j'ai compris que c'est lorsque l'on n'a pas récupéré l'intégralité de la réponse d'une requete et que l'on souhaite exécuter une seconde requete. Dans mon script, cela veut il dire qu'étant donné que j'ai dans ma requete un WHERE qui limite ma réponse à une seule ligne, l'intégralité de la réponse est récupérée et que dans ce cas, je n'ai pas besoin de fermer le curseur pour exécuter la requête suivante ? Questions subsidiaires : 1. Quelle différence entre PDO::exec et PDO::query ? En tout cas, un grand merci de prendre de votre temps pour éclairer ma lanterne. |
|||||||
|
|
00
|
|
|
#5 | ||||||||||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Citation:
Citation:
Code :
Citation:
Citation:
Pour comprendre le mécanisme des itérateurs en PHP, je te renvoie à la doc. Citation:
La gestion des exceptions en PHP est très similaire à celle de Java, à l'exception ( Citation:
Citation:
Citation:
Appeler cette méthode est inutile si on n'a pas mis l'attribut PDO::MYSQL_ATTR_USE_BUFFERED_QUERY à false dans PDO donc par défaut c'est inutile. Citation:
PDO::query renvoie un PDOStatement. Donc exec est adapté aux INSERT, UPDATE, DELETE et query aux SELECT. Je te recommande l'usage systématique de PDO::prepare
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||||||||||||
|
00
|
|
|
#6 | ||
|
Invité de passage
![]() Inscription : février 2008 Messages : 7 ![]() |
Ok merci pour ces réponses. Je commence à comprendre.
Par contre concernant PDO::FETCH_CLASS Code :
L'intérêt est donc de pouvoir appeler les méthodes de la classe 'Article'. Dans ce cas, 4 questions : 1. peux tu me confirmer que dans ce cas au préalable tu auras probablement un include('Article.class.php'); dans lequel une classe 'Article' sera déclarée ? 2. Si tel est le cas, comment récupère ton les résultats de la requete au sein de la classe ? D'apres ce que je lis dans la doc de PDO, il va renvoyer des variables avec les intitulés des colonnes de la table. Donc si je comprends, on récupère au sein de la classe des variables du type: $id $titre $auteur ,etc. correspondant aux noms des champs de la table articles ? 3. enfin ce système ne pose t'il pas de pbl avec l'utilisation d'un constructeur ? Car si FETCH_CLASS instancie la classe articles et que pour x raisons, son constructeur l'instancie histoire d'avoir un objet tout prêt des qu'on l'appel (j'ai cru voir ça quelque part), cela ne pose t'il pas de soucis ? Ou je suis complètement à coté de la plaque ? 4. enfin si on récupère au sein de la classe des variables en fonction des noms de colonnes, je suppose qu'il est mal venu de les récupérer directement au sein de nos attributs. En gros faire un =, mais qu'il vaut mieux passer par la méthode _setAttribut implémentée plus bas dans la classe? C'est peut être la qu'intervient la notion d'hydratation des objets ? Me trompe-je Je ne sais pas si je suis complètement a coté de la plaque donc pas tapper si je raconte n'importe quoi ... ![]() sam |
||
|
|
00
|
|
|
#7 | |||||||||||||||||||||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Citation:
Citation:
Citation:
Voici le prototype de setFetchMode à utilise dans ce cas: - bool PDOStatement::setFetchMode ( int $PDO::FETCH_CLASS , string $classname , array $ctorargs ) (voir http://php.net/manual/fr/pdostatement.setfetchmode.php) Citation:
Ils sont directement utilisables avec l'opérateur -> comme pour n'importe quelle instance. Citation:
Exemple Considérons le jeu de données suivant: Code :
Code :
Voici donc comment s'utilise le mode FETCH_CLASS: Code :
Code :
Code :
Code :
Pour aller plus loin Nous pouvons construire des classes de modèles implémentant un CRUD (Create, Retrieve, Update, Delete), ce sont des méthodes capables de faire respectivement des créations, réccupération, mise-à-jour et suppression de données, tout cela encapsulé dans une seule classe. Voici un exemple de classe de modèle générique (extrait du framework Axiom): Code :
Code :
Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|||||||||||||||||||||||
|
00
|
|
|
#8 | |
|
En attente de confirmation mail
![]() Inscription : juin 2002 Messages : 6 164 ![]() |
Citation:
Tout l'opposé, ou presque, (attributs publics sinon __set requise) de FETCH_INTO où, du fait de son fonctionnement, __set ne sera exécutée qu'une seule fois pour chaque attribut inexistant. Chacun de ces modes a ses avantages et ses inconvénients (FETCH_CLASS permet, en outre, plus de choses). À noter, que par défaut (sans l'option PDO::FETCH_PROPS_LATE - introduit en 5.2.0), les propriétés de la classe sont initialisées avec les valeurs de la base avant l'appel du constructeur (donc, dans ces circonstances, le constructeur pourrait, volontairement ou non, écraser les valeurs issues de la base). |
|
|
|
00
|
|
|
#9 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Merci pour la correction
J'utilise massivement le mode FETCH_INTO (quitte à utiliser clone par derrière) alors je ne l'avais jamais remarqué ce comportement.Il est vrai également que la doc n'est pas toujours très explicite à ce sujet...
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
00
|
|
|
#10 | ||
|
Invité de passage
![]() Inscription : février 2008 Messages : 7 ![]() |
Ouch la réponse !!!
C plus un forum, c'est un live tuto ![]() Je comprends mieux le fonctionnement. Je vais prendre un peu de temps a vraiment essayer de bien décortiquer les classes d'Axiom que tu as fourni. Je reviens aux questions si besoin. Ca risque ... Deja une : La diff entre FETCH_CLASS et FETCH_INTO signifie donc qu'avec INTO, il n'y aura jamais qu'une seule et unique instance qui sera mis a jour successivement par les résultats successifs de la requête. Si tel est le cas, si on appele ensuite une méthode de cette instance, celle ci se fera avec la dernière ligne de données que lui aura renvoyé la requêtes ? Au fait concernant la notion d'hydratation, c'est dans le tuto sur la POO de vyk12 sur le siteduzero. Concretement il s'agit d'une fonction "hydrate()" qui est appelée directement depuis le constructeur de la classe et qui va appeler automatiquement les setters en fonction du nom des attributs passés en paramètres lors de l'instanciacion de la classe. Je pense que ca revient à peu près au même qu'un FETCH_CLASS sauf que l'attribution des valeurs aux attributs se fait via un tableau associatif. J'ai testé la fonction, alors je met mon script : (soyez indulgents) Celle ci impose de fait une convention de nommage des setters, ce qui n'est peut être pas plus mal. Code :
|
||
|
|
00
|
|
|
#11 |
![]() ![]() Développeuse PHP/Java Inscription : avril 2007 Messages : 3 664 ![]() |
L'avantage de la méthode d'hydratation, c'est qu'on peut aussi s'en servir pour faire une mise à jour d'un objet existant (par exemple, dans le cas d'un formulaire modifiant un enregistrement existant)
Au passage, vu que tu as normé tes setters, autant aussi normer les getters en getMachin()
__________________
Modératrice PHP Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur) Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com