|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Nouveau Membre du Club
![]() Inscription : février 2008 Messages : 169 ![]() |
Bonjour à tous,
Je suis débutant en php et j'essaie de contrôler les données fournies par un formulaire et tout spécialement le numéro de téléphone avant enregistrement dans la bdd. Malheureusement, je constate qu'il enregistre les numéros valides mais également invalides. Une âme généreuse et indulgente pourrait-il consulter mon code et m'indiquer par exemple si le numtel n'est pas valide que faut-il faire et où insérer ? Code :
Claudine |
||
|
|
10
|
|
|
#2 |
|
Membre du Club
![]() Inscription : mai 2010 Messages : 45 ![]() |
Bonsoir,
A première vue, quand la valeur est invalide, le programme continue quand même après le if. Il faudrai placer le bloc try qui s'occupe de l'insersion dans le if après la ligne 10. ou alors terminer le script quand une valeur est invalide. En effet, si une ligne invalide est entrée, on sort du if puis on fait l'insersion dans la base quand même. Après pour garantir l'insertion correcte dans tous les scripts, le meilleur moyen est de mettre une contrainte de table au niveau de la abse de données. C'est à dire que la table n'acceptera de faire l'insertion que si le numero est valide par exemple. Ainsi si ton programme php tente d'insérer une valeur non valide, le sgbd renverra une erreur. Par contre je ne sais pas si les contraintes de table existent sous mysql, peut être regarder du côté des trigger sinon. |
|
|
10
|
|
|
#3 | ||||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Quest-ce que fait là ton enregistrement en bdd après le formulaire. Pourquoi est-il placé à cet endroit ?
Logiquement ce devrait être Code :
Code :
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
||||
|
|
20
|
|
|
#4 |
|
Nouveau Membre du Club
![]() Inscription : février 2008 Messages : 169 ![]() |
Bonjour à tous,
Vous êtes sympa les gars! Voilà 15 jours de temps perdu et grâce à vous, le problème est résolu. Cependant, je me pose deux questions: 1) Code :
if (preg_match("#^0[1-68]([-. ]?[0-9]{2}){4}$#", $_POST['numtel'])) exemple: 0477 06 05 87 Mais, je dois modifier ce code pour pouvoir introduire les N° de téléphone fixe Belge par le code suivant Exemple: 02 385 06 32 ou encore 015 20 85 33 Code :
if (preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $_POST['numtel'])) 2)htmlspecialchars: le cours php pour débutant me dit de ne pas oublier de protéger avec cette expression. Pourriez-vous m'expliquer car je ne comprend pas très bien l'utilité de cette expression? Sincères remerciements pour votre aide précieuse Claudine |
|
|
10
|
|
|
#5 |
|
Membre du Club
![]() Inscription : mai 2010 Messages : 45 ![]() |
htmlspecialchar empêche un utilisateur de mettre du code html à la place de son nom ou de son prénom.
Si jamais par exemple il est possible pour les visiteurs de voir les derniers inscrits, quelqu'un pourrait s'inscrire sous le nom "<script>un méchant script ...<script>". Ce code serait vu et donc affiché sur le navigateur de tes visiteurs. Un bon point déjà, tu utilise PDO, tu ne risque donc pas d'injections SQL. Par contre tu doit vérifier pour chaque champ si il est valide, le nom et le prénom aussi. Dans le doute mieux vaut le faire systématiquement, d'ailleurs si le risque n'est pas présent au moment ou tu code, ça peut le devenir quand ton site évolue. Le mieux est d'utiliser les filtres : http://fr.php.net/manual/fr/book.filter.php |
|
|
10
|
|
|
#6 | |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Citation:
Concernant tes expressions régulières c'est l'une ou l'autre, donc cela peut s'écrire comme cela : Code :
if (preg_match("#^0[1-68]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $_POST['numtel'])) Code :
if (isset($_POST['nom']) && trim($_POST['nom']) != '')
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
|
10
|
|
|
#7 |
|
Débutant
Laurent Webmaster Inscription : octobre 2006 Messages : 2 873 ![]() |
ABCIWEB, à quoi sert le trim dans cette ligne :
Code :
if (isset($_POST['nom']) && trim($_POST['nom']) != '') |
|
|
10
|
|
|
#8 | ||
|
Nouveau Membre du Club
![]() Inscription : février 2008 Messages : 169 ![]() |
Bonjour ABCIWEB
Merci pour ces derniers conseils et tout fonctionne à merveille. Mais dès que je veux introduire le contrôle des champs vides pour les champs nom et prénom, plus rien ne fonctionne(même plus les numtel) avec messages successifs d'erreur. Je patauge et suis proche du découragement, à croire que je ne peux rien faire seul. Puis-je vous demander une fois de plus d'introduire la ligne de code proposée Code :
if (isset($_POST['nom']) && trim($_POST['nom']) != '') Code :
Claudine |
||
|
|
10
|
|
|
#9 | ||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Voilà une méthode classique qui consiste à imbriquer le code :
Code :
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
||
|
|
10
|
|
|
#10 | |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Citation:
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
|
10
|
|
|
#11 | ||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Voici une autre méthode parfois plus facile à écrire et qui utilise moins l'imbrication :
Code :
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
||
|
|
10
|
|
|
#12 | ||
|
Nouveau Membre du Club
![]() Inscription : février 2008 Messages : 169 ![]() |
Bonjour ABCIWEB,
je tiens à vous remercier pour cet exemple qui fonctionne très bien. Mais une fois de plus, moins d'imbrication ou pas, j'essaie depuis ce matin d'y ajouter une ligne de code pour empêcher l'introduction de chiffres dans le nom (en plus du champ vide)et tout est boulversé avec erreur de tout genre. Exemple: Code :
De plus, est-il possible de garder en mémoire les valeurs tapées lorsque le formulaire réapparait car c'est fastidieux de toujours recommencer. J'y ai ajouter : mais rien n'y fait. Je suis probablement irrécupérable! Pitié pour un vrai débutant ou plus tôt incompétent! Puis-je une fois de plus, vous demander votre aide? Mille remerciements Claudine |
||
|
|
10
|
|
|
#13 | |||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Citation:
Code :
Essaies de faire marcher cela ensuite on verra pour éviter de re remplir le formulaire en cas d'erreur.
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|||
|
|
20
|
|
|
#14 |
|
Nouveau Membre du Club
![]() Inscription : février 2008 Messages : 169 ![]() |
Bonjour ABCIWeb,
Merci à l'excellent pédagogue, tout fonctionne normalement. Le Code :
if (!preg_match("^[a-zçèéë]{2,20}$",$_POST['nom'])) J'ai donc remplacé par: Le Code :
if (!preg_match("^[A-Za-zçèéë]^",$_POST['nom'])) Comment puis-je obtenir un nom composé uniquement de lettres(alpha) avec en plus une majuscule comme première lettre.? Voulez-vous m'aider une fois de plus? J'ai réussi (avec l'aide du forum) à mémoriser les champs du formulaire et je compte bien publier(pour les novices comme moi) l'ensemble quand j'estimerai que c'est valable. Un grand merci pour votre aide précieuse Claudine |
|
|
10
|
|
|
#15 | |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Citation:
Concernant ton regex, le motif pour trouver que des lettres y compris des lettres accentuées (rajoutes celles dont tu as besoin et qui ne sont pas dans ma liste à la suite des premières déjà indiquées) est : Code :
preg_match('#^[a-zéèàçïêë]{3,8}$#i',$nom) {3,8} c'est pour dire entre 3 et 8 caractères et si l'expression est entourée par ^ et $, le masque concerne la chaine de caractère complète. Tu as un tuto ici Bon il te manque la première lettre en majuscule, mais ça tu n'es pas obligée de le considérer comme une faute puisque tu peux très bien le faire automatiquement en php avec la fonction ucfirst
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
|
20
|
|
|
#16 | ||
|
Nouveau Membre du Club
![]() Inscription : février 2008 Messages : 169 ![]() |
Bonjour ABCIWEB,
Formidable, excellents conseils qui m'ont permis de mieux comprendre le fonctionnement. Quand à: je vous cite:Bon il te manque la première lettre en majuscule, mais ça tu n'es pas obligée de le considérer comme une faute puisque tu peux très bien le faire automatiquement en php avec la fonction ucfirst La nuit porte conseils mais malheureusement je n'y suis pas arrivé! Mais comment faire passer nom et prénom dans cette fonction avant d'enregistrer dans la base de données? $nom= valeur du formulaire? et où situer ce code dans le programme ci-dessous? Code :
Mes plus vifs remerciements à vous ABSCWEB Claudine |
||
|
|
10
|
|
|
#17 | ||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Voilà une version presque optimisée de ton code :
Code :
Pour éviter cela il faut enregistrer les messages d'erreurs et le contenu du post dans une variable de session, et faire une redirection sur la page en cours à l'aide d'un header (si les champs ne sont pas correctement remplis). Bon ce sera l'objet de mon prochain message, en attendant je te laisse comprendre celui-ci EDIT : à y regarder de plus près je me demande pourquoi le filtre du preg_match pour le prénom est différent de celui pour le nom ? EDIT2 : Il y avait une erreur car tu enregistrais les $_POST non modifiés dans ta bdd, alors qu'il faut enregistrer les valeurs modifiées soit $nom, $prenom et $numtel. Je n'avais pas vu cette erreur car je ne teste pas l'enregistrement en Bdd
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
||
|
|
00
|
|
|
#18 | |||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Avec le code précédent, après l'affichage d'un message d'erreur généré par notre code (ex: champ non convenablement rempli etc.), un message du genre
Citation:
Ce problème vient du fait de l'affichage direct de la page suite à un post (après l'affichage d'un message d'erreur généré par notre code). Pour contourner ce problème on utilise maintenant un header Code :
header('Location: '.$_SERVER['PHP_SELF']); Et pour garder en mémoire (suite à cette redirection) le contenu des champs du formulaire et nos messages d'alerte, on enregistre ces variables dans des variables de session. Le code précédent et celui ci-dessous sont très proches puisque j'ai simplement : 1/ déclaré l'ouverture d'une session (pour faire fonctionner mes variables de sessions) 2/ assigné $message à Code :
$_SESSION['post_form']['message_form'] 5/ Utilisé pour afficher les valeurs correspondantes dans le code html. Après une erreur dans le renseignement des champs du formulaire, vous pouvez désormais rafraîchir la page sans soucis ou utiliser la touche retour arrière du navigateur une fois le formulaire validé. Code :
- J'aurais pu ne pas utiliser la variable "$nom" et travailler uniquement avec mais j'ai gardé cette façon de faire pour garder plus d'analogie avec le précédent code et aussi pour qu'il soit plus facile à lire (idem pour $prenom et $numtel). Et c'est pour cette même raison de lisibilité que $message à été assigné à plutôt que de traîner dans tout le code php cette variable à rallonge). J'aurais pu également utiliser une variable de session pour chaque variable ex : Code :
$_SESSION['nom'] = $nom; $_SESSION['prenom'] = $prenom;
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|||
|
|
10
|
|
|
#19 |
|
Nouveau Membre du Club
![]() Inscription : février 2008 Messages : 169 ![]() |
Bonjour ABCIWEB,
Quel travail et grand merci pour les explications que je vais étudier de très près. Voulez-vous regarder où se situe le problème qui bloque l'envoi à la bdd. Je m'explique: Si je complète le formulaire avec des données valables, dès que je clic sur envoyer, il me réaffiche le formulaire comme si il avait erreur et sans messages d'erreur(ce qui est normal) et si je clique une fois de plus sur envoyer rien ne se passe. Il reste bloqué sur ce formulaire. En résumé: il me redirige vers la page en cours en cas d'erreur alors qu'il n'y a pas d'erreur! Sincères salutations Claudine |
|
|
00
|
|
|
#20 |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Actuellement une fois les tests vérifiés cela te dirige à cette ligne : donc vers ChampVVM.php. Changes le nom de ce fichier si tu souhaites qu'il te redirige ailleurs.
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com