Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/05/2011, 19h10   #1
Nouveau Membre du Club
 
Inscription : février 2008
Messages : 169
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 169
Points : 37
Points : 37
Par défaut empêcher l'enregistrement dans ma bdd de données non valides

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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<p>
<?php
if (isset($_POST['numtel']))
{
    $_POST['numtel'] = htmlspecialchars($_POST['numtel']); // On rend inoffensives les balises HTML que le visiteur a pu rentrer
 
    if (preg_match("#^0[1-68]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']))
 
    {
        echo 'Le ' . $_POST['numtel'] . ' est un numéro <strong>valide</strong> !';
    }
    else
    {
 
       echo 'Le ' . $_POST['numtel'] . ' n\'est pas valide, recommencez !';
    }
}	
  ?>
 
<form method="post">
<p>
    <label for="nom">Votre nom ?</label> <input id="nom" name="nom" /><br />
    <label for="prenom">Votre prenom ?</label> <input id="prenom" name="prenom" /><br />
    <label for="numtel">Votre téléphone ?</label> <input id="numtel" name="numtel" /><br />
 
 
 <input type="submit" value="Envoyer" />
</p>
    </form>
 
	<?php
	// Connexion à la base de données
try
{
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
 
 
 
 
    // Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
    $req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['numtel']));
// Redirection du visiteur vers la page du minichat
 
 //*   header('Location: CodePHPTelephone.php');*//
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
?>
Sincères remerciements
Claudine
Claudine est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/05/2011, 20h52   #2
Membre du Club
 
Inscription : mai 2010
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 45
Points : 67
Points : 67
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.
nonolagalinette est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/05/2011, 21h03   #3
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Quest-ce que fait là ton enregistrement en bdd après le formulaire. Pourquoi est-il placé à cet endroit ?

Logiquement ce devrait être

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
if (isset($_POST['numtel']))
{
    if (preg_match("#^0[1-68]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']))
 
    {
            // Connexion à la base de données
     try
         {
          $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
          $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
 
          // Insertion du message à l'aide d'une requête préparée
          $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
          $req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['numtel']));
          // Redirection du visiteur vers la page du minichat
 
 //*   header('Location: CodePHPTelephone.php');*//
        }
        catch(Exception $e)
       {
        die('Erreur : '.$e->getMessage());
       }
    }
    else
    {
 
       echo 'Le ' . $_POST['numtel'] . ' n\'est pas valide, recommencez !';
    }
}	
  ?>
 
<form method="post">
<p>
    <label for="nom">Votre nom ?</label> <input id="nom" name="nom" /><br />
    <label for="prenom">Votre prenom ?</label> <input id="prenom" name="prenom" /><br />
    <label for="numtel">Votre téléphone ?</label> <input id="numtel" name="numtel" /><br />
 
 
 <input type="submit" value="Envoyer" />
</p>
    </form>
Et pas besoin de faire
Code :
1
2
 
$_POST['numtel'] = htmlspecialchars($_POST['numtel']);
puisque le preg_match fait le tri juste après.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 07/05/2011, 12h21   #4
Nouveau Membre du Club
 
Inscription : février 2008
Messages : 169
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 169
Points : 37
Points : 37
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']))
cette ligne me permet d'introduire les codes téléphoniques pour GSM(mobile) en belgique
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']))
N'est-il pas possible de reprendre les deux possibilités en une seule ligne de code? où bien dois-je prévoir deux colonnes séparées dans la table(nuumtelFixe, numtelMobile).
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
Claudine est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/05/2011, 14h51   #5
Membre du Club
 
Inscription : mai 2010
Messages : 45
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 45
Points : 67
Points : 67
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
nonolagalinette est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/05/2011, 17h30   #6
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Citation:
Envoyé par Claudine Voir le message
2)htmlspecialchars: le cours php pour débutant me dit de ne pas oublier de protéger avec cette expression.
UNIQUEMENT pour l'AFFICHAGE de code php donc quand tu fais un echo, soit echo htmlspecialchars($mavariable). Hors ici tu n'affiche rien.

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']))
Si tu veux contrôler les noms et prénoms (genre faut pas qu'il soient vides) tu peux faire :
Code :
if (isset($_POST['nom']) && trim($_POST['nom']) != '')
Alternativement pour filtrer, tu peux aussi regarder le lien de nonolagalinette mais je connais peu de gens (et peu d'exemples de code) qui utilisent ces machins là. A part le filtre FILTER_VALIDATE_EMAIL le reste est d'un intérêt relatif.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/05/2011, 18h18   #7
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
ABCIWEB, à quoi sert le trim dans cette ligne :
Code :
if (isset($_POST['nom']) && trim($_POST['nom']) != '')
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/05/2011, 09h13   #8
Nouveau Membre du Club
 
Inscription : février 2008
Messages : 169
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 169
Points : 37
Points : 37
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']) != '')
avec indication du message d'erreur 'veuillez indiquer votre nom ou votre prénom' en cas de champ vide dans le programme ci-dessous:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
<?php
 
if (isset($_POST['numtel']))
 
{
   if (preg_match("#^0[1-8]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $_POST['numtel']))
 
 
 
            // Connexion à la base de données
     try
         {
          $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
          $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
 
          // Insertion du message à l'aide d'une requête préparée
          $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
          $req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['numtel']));
          // Redirection du visiteur vers la page duformulaire//
 
  header('Location: CodePHPTelephone.php');
        }
        catch(Exception $e)
       {
        die('Erreur : '.$e->getMessage());
       }
    }
    else
    {
	   echo 'Le ' . $_POST['nom'] . ' n\'est pas indiqué, recommencez !';
     }
 
 
	 {
	 echo 'Le ' . $_POST['numtel'] . ' n\'est pas valide, recommencez !';  
 
    }
 
 
 
  ?>
 
<form method="post">
<p>
    <label for="nom">Votre nom ?</label> <input id="nom" name="nom" /><br />
    <label for="prenom">Votre prenom ?</label> <input id="prenom" name="prenom" /><br />
    <label for="numtel">Votre téléphone ?</label> <input id="numtel" name="numtel" /><br />
 
 
 <input type="submit" value="Envoyer" />
</p>
    </form>
Mes plus vifs remerciements
Claudine
Claudine est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/05/2011, 01h39   #9
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Voilà une méthode classique qui consiste à imbriquer le code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?php
$message = array();
 
if(isset($_POST['envoyer']))
{
    if (isset($_POST['nom']) && trim($_POST['nom']) != '')
    {
	    if (isset($_POST['numtel']) && trim($_POST['numtel']) != '')
	    {
	       if (preg_match("#^0[1-8]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $_POST['numtel']))
		{
 
		     // Connexion à la base de données
		     try
			 {
			      $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			      $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
 
			      // Insertion du message à l'aide d'une requête préparée
			      $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
			      $req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['numtel']));
			      // Redirection du visiteur vers la page duformulaire//
 
			      header('Location: CodePHPTelephone.php');
			}
		    catch(Exception $e)
		       {
			    die('Erreur : '.$e->getMessage());
		       }
		}
		else
		{
		     $message[] = 'Le ' . $_POST['numtel'] . ' n\'est pas valide, recommencez !';   
		}
	    }
	    else
	    {
		$message[] = 'Le champ téléphone est vide, remplissez-le !';  
	    }  
    }
    else
    {
	$message[] = 'Veuillez indiquer votre nom';
    }
}
?>
 
<form method="post">
<p>
    <label for="nom">Votre nom ?</label> <input id="nom" name="nom" /><br />
    <label for="prenom">Votre prenom ?</label> <input id="prenom" name="prenom" /><br />
    <label for="numtel">Votre téléphone ?</label> <input id="numtel" name="numtel" /><br />
 
 
 <input type="submit" name = "envoyer" value="Envoyer" />
 
</p>
</form>
<?php
if(isset($message) && count($message) > 0)
{
foreach($message as $value) echo '<p>'.$value.'</p>';
}
?>
(il reste le prénom à imbriquer)
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/05/2011, 01h45   #10
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Citation:
Envoyé par laurentSc Voir le message
ABCIWEB, à quoi sert le trim dans cette ligne :
Code :
if (isset($_POST['nom']) && trim($_POST['nom']) != '')
Et si tu regardais dans le manuel ? trim
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/05/2011, 02h12   #11
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Voici une autre méthode parfois plus facile à écrire et qui utilise moins l'imbrication :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
 
 
$message = array();
 
if (isset($_POST['envoyer']))
 
{
 
	if (!(isset($_POST['nom']) && trim($_POST['nom']) != ''))
	{
		$message[] = 'Veuillez indiquer votre nom';
	}
 
 
	if (!(isset($_POST['numtel']) && trim($_POST['numtel']) != ''))	 
	{
		$message[] = 'Veuillez indiquer un numéro de téléphone';
	}
	else
	{
		if (!(preg_match("#^0[1-8]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $_POST['numtel'])))
		{
			$message[] = 'Le ' . $_POST['numtel'] . ' n\'est pas valide, recommencez !';   
		}
	}
 
 
	if (!(isset($_POST['prenom']) && trim($_POST['prenom']) != ''))
	{
		$message[] = 'Veuillez indiquer votre prénom';
	}
 
 
	if (isset($message) && count($message) == 0)
	{
		 // Connexion à la base de données
		 try
			 {
			  $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			  $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
 
			  // Insertion du message à l'aide d'une requête préparée
			  $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
			  $req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['numtel']));
			  // Redirection du visiteur vers la page duformulaire//
 
				header('Location: CodePHPTelephone.php');
			}
		catch(Exception $e)
		   	{
				die('Erreur : '.$e->getMessage());
		   	}
	}
}
?>
<form method="post">
<p>
    <label for="nom">Votre nom ?</label> <input id="nom" name="nom" /><br />
    <label for="prenom">Votre prenom ?</label> <input id="prenom" name="prenom" /><br />
    <label for="numtel">Votre téléphone ?</label> <input id="numtel" name="numtel" /><br />
 
 
 <input type="submit" name = "envoyer" value="Envoyer" />
</p>
</form>
<?php
if(isset($message) && count($message) > 0)
{
foreach($message as $value) echo '<p>'.$value.'</p>';
}
?>
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/05/2011, 18h17   #12
Nouveau Membre du Club
 
Inscription : février 2008
Messages : 169
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 169
Points : 37
Points : 37
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 :
1
2
if (!preg_match("^[a-zçèéë]{2,20}$",$_POST['nom']))
	     die("le nom ne doit contenir que des lettres");
Que dire si je dois faire la même chose pour le prénom!
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
Claudine est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/05/2011, 17h46   #13
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Citation:
Envoyé par Claudine Voir le message
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.
Il y a un exemple qui utilise deux conditions - champ rempli et champ contrôlé par un regex (preg_match) - avec numtel :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
//...
	if (!(isset($_POST['numtel']) && trim($_POST['numtel']) != ''))	 
	{
		$message[] = 'Veuillez indiquer un numéro de téléphone';
	}
	else
	{
		if (!(preg_match("#^0[1-8]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $_POST['numtel'])))
		{
			$message[] = 'Le ' . $_POST['numtel'] . ' n\'est pas valide, recommencez !';   
		}
	}
//...
Il te suffit de prendre modèle dessus pour faire la même chose avec le nom et éventuellement le prénom (en remplaçant le filtre du preg_match et en n'en gardant qu'un car apparemment il n'y aura pas besoin de deux successifs pour faire ton contrôle) .

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.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 12/05/2011, 07h37   #14
Nouveau Membre du Club
 
Inscription : février 2008
Messages : 169
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 169
Points : 37
Points : 37
Bonjour ABCIWeb,
Merci à l'excellent pédagogue, tout fonctionne normalement.
Le
Code :
if (!preg_match("^[a-zçèéë]{2,20}$",$_POST['nom']))
ne fonctionne pas, il réclame un délimiteur de fin(^), de plus il n'accepte pas les crochets{2,20} ainsi que $
J'ai donc remplacé par:
Le
Code :
 if (!preg_match("^[A-Za-zçèéë]^",$_POST['nom']))
Ce code ne me paraît pas parfait car, il n'accepte pas de chiffres en début de frappe mais il accepte comme nom: jean456.
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
Claudine est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/05/2011, 19h22   #15
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Citation:
Envoyé par Claudine Voir le message
Bonjour ABCIWeb,
Merci à l'excellent pédagogue, tout fonctionne normalement.
Ben alors mets un point (votes pouce +) pour les messages qui t'ont aidés

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)
i c'est pour faire des recherches sur les minuscules et les majuscules
{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.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 13/05/2011, 09h16   #16
Nouveau Membre du Club
 
Inscription : février 2008
Messages : 169
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 169
Points : 37
Points : 37
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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php
$message = array();
 
if (isset($_POST['envoyer'])) 
{
 
    /* Récupération des valeurs des champs du formulaire */
    if (get_magic_quotes_gpc())
    {
 
      $nom	     	= stripslashes(trim($_POST['nom']));
 
      $prenom		= stripslashes(trim($_POST['prenom']));
      $numtel	= stripslashes(trim($_POST['numtel']));
    }
       else
       {
 
           $nom	        = trim($_POST['nom']);
 
           $prenom	    = trim($_POST['prenom']);
           $numtel      = trim($_POST['numtel']);
        }
//....
	    if (!(isset($_POST['nom']) && trim($_POST['nom']) != ''))
	    {
		     $message[] = 'Veuillez indiquer votre nom';
	    }
         else    
        { 
	      	      if (! preg_match('#^[a-zéèàçïêë]{3,12}$#i',$nom))	 
	         {
	              $message[] = 'Le ' . $_POST['nom'] . ' n\'est pas                   valide, recommencez !';   
 
             }
         }
//......
 
 
 
?>
<?php
//...
	      if (!(isset($_POST['numtel']) && trim($_POST['numtel']) != ''))	 
	      {
		      $message[] = 'Veuillez indiquer un numéro de téléphone';
	      }
	      else
	      {
		        if (!(preg_match("#^0[1-8]([-. ]?[0-9]{2}){4}$#", $_POST              ['numtel']) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#",              $_POST['numtel'])))
		      {
			       $message[] = 'Le ' . $_POST['numtel'] . ' n\'est pas                    valide, recommencez !';   
		      }
	      }
 
//...	
	      if (!(isset($_POST['prenom']) && trim($_POST['prenom']) != ''            ))
	      {
		            $message[] = 'Veuillez indiquer votre prénom';
	      }
	        else    
          { 
 
	           if (!preg_match('/^[\p{L} ]+$/u',$_POST['prenom'])) 
 
	         {
	              $message[] = 'Le ' . $_POST['prenom'] . ' n\'autorise                  que des lettres, recommencez !'; 
			  }  
	       }
	       if (isset($message) && count($message) == 0)
	      {
		       // Connexion à la base de données
		 try
			 {
			  $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			  $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
 
			  // Insertion du message à l'aide d'une requête préparée
			  $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
			  $req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['numtel']));
			  // Redirection du visiteur vers la page duformulaire//
 
				header('Location: ChampVVM.php');
			 }
		catch(Exception $e)
		   	 {
				die('Erreur : '.$e->getMessage());
		   	 }
}
}	
 
?>
<form method="post">
    <p>
        <label for="nom">Votre nom :</label>
 
         <input type="text" id="nom" name="nom" 
 
        value="<?php echo (isset($_POST['nom'])) ?$nom : '' ?>"  
 
        />
    </p>
    <p>
        <label for="prenom">Votre prenom :</label>
        <input type="text" id="prenom" name="prenom" 
        value="<?php echo (isset($_POST['prenom'])) ? $prenom : '' ?>" 
        />
    <p>
        <label for="numtel">Votre N°de téléphone :</label>
        <input type="text" id="numtel" name="numtel" 
        value="<?php echo (isset($_POST['numtel'])) ? $numtel : '' ?>" 
        />
    </p>
 
 
 <input type="submit" name = "envoyer" value="Envoyer" />
</p>
</form>
<?php
if(isset($message) && count($message) > 0)
{
foreach($message as $value) echo '<p>'.$value.'</p>';
}
?> __________________
Rappel utile pour les débutants: ces codes permettent de traquer les champs vides, invalides(rien que des lettres) pour les champs Nom et prénom, ainsi que des N° de téléphone ou GSM(Belge) et mise en mémoire des valeurs tapées dans les champs du formulaire.

Mes plus vifs remerciements à vous ABSCWEB
Claudine
Claudine est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/05/2011, 18h52   #17
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Voilà une version presque optimisée de ton code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php
 
if (isset($_POST['envoyer'])) 
{
 
	function Verif_magicquotes ($chaine)
	    {
	        if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);
 
	        return $chaine;
	    } 
 
 
	$message = array();
 
	$nom = isset($_POST['nom']) && trim($_POST['nom']) != '' ? Verif_magicquotes(ucfirst(trim($_POST['nom']))) : null;
 
	$prenom = isset($_POST['prenom']) && trim($_POST['prenom']) != '' ? Verif_magicquotes(ucfirst(trim($_POST['prenom']))) : null;
 
	$numtel = isset($_POST['numtel']) && trim($_POST['numtel']) != '' ? Verif_magicquotes(trim($_POST['numtel'])) : null;
 
 
 
	if (! isset($nom))
		{
			 $message[] = 'Veuillez indiquer votre nom';
		}
	else    
		{ 
			if (! preg_match('#^[a-zéèàçïêë]{3,12}$#i',$nom))	 
			 {
				  $message[] = 'Le '. $nom .' n\'est pas valide, recommencez !';   
			 }
		 }
 
 
 
	if (! isset($numtel))	 
		{
			$message[] = 'Veuillez indiquer un numéro de téléphone';
		}
	else
		{
			if (!(preg_match("#^0[1-8]([-. ]?[0-9]{2}){4}$#", $numtel) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $numtel)))
				{
					$message[] = 'Le '. $numtel .' n\'est pas valide, recommencez !';   
				}
		}
 
 
 
	if (! isset($prenom))
		{
			$message[] = 'Veuillez indiquer votre prénom';
		}
	else    
		{ 
			if (!preg_match('/^[\p{L} ]+$/u',$prenom)) 
				{
					$message[] = 'Le '.$prenom.' n\'autorise que des lettres, recommencez !'; 
				}  
		}
 
 
 
	if (isset($message) && count($message) == 0)
		{
			 // Connexion à la base de données
			 try
				 {
				  $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
				  $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
 
				  // Insertion du message à l'aide d'une requête préparée
				  $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
				  $req->execute(array($nom, $prenom, $numtel));
				  // Redirection du visiteur vers la page duformulaire//
 
					header('Location: ChampVVM.php');
				 }
			catch(Exception $e)
				 {
					die('Erreur : '.$e->getMessage());
				 }
		}
}	
 
?>
<form method="post">
    <p>
        <label for="nom">Votre nom :</label>
 
         <input type="text" id="nom" name="nom" 
 
        value="<?php echo (isset($_POST['nom'])) ? $nom : '' ?>"  
 
        />
    </p>
    <p>
        <label for="prenom">Votre prenom :</label>
        <input type="text" id="prenom" name="prenom" 
        value="<?php echo (isset($_POST['prenom'])) ? $prenom : '' ?>" 
        />
    <p>
        <label for="numtel">Votre N°de téléphone :</label>
        <input type="text" id="numtel" name="numtel" 
        value="<?php echo (isset($_POST['numtel'])) ? $numtel : '' ?>" 
        />
    </p>
 
 
 <input type="submit" name = "envoyer" value="Envoyer" />
</p>
</form>
<?php
if(isset($message) && count($message) > 0)
{
foreach($message as $value) echo '<p>'.$value.'</p>';
}
?>
Quand je dis presque c'est que si tu fais un rafraichissement de la page suite à une erreur dans le renseignement des champs, tu auras un message d'alerte du navigateur te disant qu'il faut re soumettre le formulaire pour afficher la page.

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.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 20h25   #18
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
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:
"Pour afficher cette page, les informations précédemment transmises par Firefox doivent être renvoyées... "
sera affiché dans un pop up javascript par le navigateur (ici Firefox) en cas de rafraîchissement de la page en cours, ou de retour arrière à l'aide du bouton du navigateur une fois le formulaire validé.

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']);
qui redirige vers la page en cours en cas d'erreur dans le formulaire.

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']
3/ enregistré les variables $_POST dans 4/ fais une redirection vers la page en cours si count($message) > 0

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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php
if (!session_id()) session_start();//déclare l'ouverture d'une session si aucune n'a été déclarée auparavant.
 
if (isset($_POST['envoyer'])) 
{
 
    function Verif_magicquotes ($chaine)// fonctin qui applique stripslashes si get_magic_quotes_gpc() est activé
    {
    if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);
 
    return $chaine;
    } 
 
 
    $message = array();// Pour enregistrer les messages d'information
    $_SESSION['post_form']['message'] =& $message;// avec & on assigne $message à $_SESSION['post_form']['message'] c.a.d. tout changement dans $message sera répercuté dans $_SESSION['post_form']['message']
 
    $_SESSION['post_form']['nom'] = $nom = isset($_POST['nom']) && trim($_POST['nom']) != '' ? Verif_magicquotes(ucfirst(trim($_POST['nom']))) : null;//ucfirst pour convertir le première lettre en majuscule
 
    $_SESSION['post_form']['prenom'] = $prenom = isset($_POST['prenom']) && trim($_POST['prenom']) != '' ? Verif_magicquotes(ucfirst(trim($_POST['prenom']))) : null;//ucfirst pour convertir le première lettre en majuscule
 
    $_SESSION['post_form']['numtel'] = $numtel = isset($_POST['numtel']) && trim($_POST['numtel']) != '' ? Verif_magicquotes(trim($_POST['numtel'])) : null;
 
 
 
 
    if (isset($nom))
        {
            if (! preg_match('#^[a-zéèàçïêë ]{3,12}$#i',$nom))     
                {
                    $message[] = 'Le nom "'.$nom.'" n\'est pas valide. Ce champ n\'autorise que des lettres. Minimum 3 lettres, maximum 12. Recommencez !';   
                }
        }
    else    
        {
             $message[] = 'Veuillez indiquer votre nom'; 
        }
 
 
 
    if (isset($prenom))
        {
            if (! preg_match('#^[a-zéèàçïêë ]{3,12}$#i',$prenom)) 
                {
                    $message[] = 'Le prénom "'.$prenom.'" n\'est pas valide. Ce champ n\'autorise que des lettres. Minimum 3 lettres, maximum 12. Recommencez !';   
                }  
        }
    else    
        { 
            $message[] = 'Veuillez indiquer votre prénom';
        }
 
 
 
    if (isset($numtel))     
        {
            if (!(preg_match("#^0[1-8]([-. ]?[0-9]{2}){4}$#", $numtel) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $numtel)))
                {
                    $message[] = 'Le numéro de télélphone "'.$numtel.'" n\'est pas valide, recommencez !';   
                }
        }
    else
        {
            $message[] = 'Veuillez indiquer un numéro de téléphone';        
        }
 
 
 
    if ($message && count($message) == 0)
        {
            //Effacement éventuel des variables de session (ou ne pas effacer si l'on veut garder les champs de formulaires remplis suite à une redirection sur cette même page)
            //unset($_SESSION['post_form']);
 
 
            // Connexion à la base de données
            try
                 {
                  $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
                  $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
 
                  // Insertion du message à l'aide d'une requête préparée
                  $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
                  $req->execute(array($nom, $prenom, $numtel));
 
 
                    header('Location: ChampVVM.php');
                    exit;
                 }
            catch(Exception $e)
                 {
                    die('Erreur : '.$e->getMessage());
                 }
        }
        else
        {
            header('Location: '.$_SERVER['PHP_SELF']);// redirige vers la page en cours en cas d'erreur (count($message) > 0)
            exit;
        }
}    
 
?>
 
<form method="post" action="#">
<div>
    <p>
        <label for="nom">Votre nom :</label>
        <input type="text" id="nom" name="nom" 
        value="<?php echo (isset($_SESSION['post_form']['nom'])) ? $_SESSION['post_form']['nom'] : '' ?>"  
        />
    </p>
    <p>
        <label for="prenom">Votre prenom :</label>
        <input type="text" id="prenom" name="prenom" 
        value="<?php echo (isset($_SESSION['post_form']['prenom'])) ? $_SESSION['post_form']['prenom'] : '' ?>" 
        />
    </p>
    <p>
        <label for="numtel">Votre N°de téléphone :</label>
        <input type="text" id="numtel" name="numtel" 
        value="<?php echo (isset($_SESSION['post_form']['numtel'])) ? $_SESSION['post_form']['numtel'] : '' ?>" 
        />
    </p>
 
 <input type="submit" name = "envoyer" value="Envoyer" />
 
</div>
</form>
 
<?php
if(isset($_SESSION['post_form']['message']) && count($_SESSION['post_form']['message']) > 0)
{
    foreach($_SESSION['post_form']['message'] as $value) echo '<p>- '.$value.'</p>';
}
?>
Remarque :

- J'aurais pu ne pas utiliser la variable "$nom" et travailler uniquement avec
Code :
$_SESSION['post_form']['nom']
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é à
Code :
$_SESSION['post_form']['message'] (
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;
etc. Mais il faut éviter de multiplier le nombre (espace de nom) de variables de sessions car elles sont communes non pas simplement au script en cours mais à tous les scripts du site qui les utilisent. Avec cette méthode de les mettre dans un tableau je n'ai utilisé qu'une seule variable : et donc il est plus facile d'éviter les éventuels conflits avec d'autres scripts du site qui auraient des noms de variables de session identiques.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/05/2011, 07h48   #19
Nouveau Membre du Club
 
Inscription : février 2008
Messages : 169
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 169
Points : 37
Points : 37
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
Claudine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 16h01   #20
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Actuellement une fois les tests vérifiés cela te dirige à cette ligne :
Code :
header('Location: ChampVVM.php');
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.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h58.


 
 
 
 
Partenaires

Hébergement Web