par
moogli » 07 mai 2014, 09:55
salut,
Tu ne vérifie pas la présence de "société" ou "tel2" dans le tableau post tu t'expose à une erreur. (si les champs ne sont pas présent il y aura une erreur, il faut toujours vérifier la présence d'un champs avant de l'utiliser).
pour info PDO::PARAM_STR est inutile c'est le cas par défaut
Perso j'utiliserais un tableau dans lequel j'ajouterais les messages d'erreurs et ensuite, dans le else, un simple affichage du tableau.
Il y a moyen de faire quelque chose de plus générique afin d’alléger, un peu le code).
par exemple
<?php
/**
* Vérifie que le champs indiqué existe et ne soit pas vide (ni null, ni égal à false, zéro ou équivalent
* (plus d'info dans la doc de empty)
*
* @param $field
*
* @return bool
*/
function ckeckNotNullPostField($field) {
$retour = false;
if (!empty($_POST[$field])) {
$retour = true;
}
return $retour;
}
/**
* @return string
*/
function checkForm() {
if (ckeckNotNullPostField('nom')) {
$erreur = 'Vous devez renseigner votre nom';
}
if (ckeckNotNullPostField('prenom')) {
$erreur = 'Vous devez renseigner votre prénom';
}
if (ckeckNotNullPostField('adresse')) {
$erreur = 'Vous devez renseigner votre adresse';
}
if (ckeckNotNullPostField('cp')) {
$erreur = 'Vous devez renseigner votre code postal';
}
if (ckeckNotNullPostField('ville')) {
$erreur = 'Vous devez renseigner votre ville';
}
if (ckeckNotNullPostField('tel1')) {
$erreur = 'Vous devez renseigner votre numéro de téléphone';
}
if (ckeckNotNullPostField('mail')) {
$erreur = 'Vous devez renseigner votre email';
}
if (ckeckNotNullPostField('mdp')) {
$erreur = 'Vous devez renseigner un mot de passe';
return $erreur;
}
return $erreur;
}
if (isset($_POST['inscription'])) {
$erreur = checkForm();
// pas d'erreur
if (empty($erreur)) {
try {
$resultat = Cnx::connectCnx()->prepare('INSERT INTO users (societe, nom, prenom, adresse, cp, ville, tel1, tel2, mail, mdp)
VALUES(:societe, :nom, :prenom, :adresse, :cp, :ville, :tel1, :tel2, :mail, :mdp)');
$resultat->bindParam(':societe', $_POST['societe']);// Attention tu ne sais pas si ce champs existe
$resultat->bindParam(':nom', $_POST['nom']);
$resultat->bindParam(':prenom', $_POST['prenom']);
$resultat->bindParam(':adresse', $_POST['adresse']);
$resultat->bindParam(':cp', $_POST['cp'], PDO::PARAM_INT);
$resultat->bindParam(':ville', $_POST['ville']);
$resultat->bindParam(':tel1', $_POST['tel1'], PDO::PARAM_INT);
$resultat->bindParam(':tel2', $_POST['tel2'], PDO::PARAM_INT); // Attention tu ne sais pas si ce champs existe
$resultat->bindParam(':mail', $_POST['mail']);
$resultat->bindParam(':mdp', $_POST['mdp']);
$resultat->execute();
echo 'Enregistrement réussi';
exit; // brutal non ? afficher un beau message dans une page complète avec possibilité de continuer a
// naviguer sur le site c'est mieux ;)
} catch (PDOException $e) {
echo '<div class="error">Erreur SQL : ' . $e->getMessage().'</div>';
}
} else {
echo '<div class="error">';
foreach ($erreur as $e) {
echo $e, '<br />';
}
echo '</div>';
}
}
les deux fonctions peuvent être déportées dans un fichier "librairie" sachant que la première est réutilisable.
Tu me diras, ben mes if avait le même résultat.
effectivement mais la tu va pouvoir modifier les règles de vérificatio des champs, pour tous le monde, au même en droit c'est quand même plus simple

tu veux pouvoir tester des nombres qui peuvent être zéro ? tu ajoute un paramètre facultatif (isNumber par exemple) qu iest booleen (par défaut false) et plutôt que de faire un brutal empty, tu vérifie le isNumber et si true tu utilise isset et is_numeric, un test si différent,test de '' etc.
l'autre fonction c'est simplement pour dégager du code "utilitaire" de la gestion proprement dite du formulaire, cela évite 25 lignes de code qui au final n'apporte pas grand chose à la compréhension (même si c'est utile).
Bémols dans ce que je te propose : il faudrait passer le tableau $_POST en paramètre des fonctions afin d'être vraiment générique
@+
salut,
Tu ne vérifie pas la présence de "société" ou "tel2" dans le tableau post tu t'expose à une erreur. (si les champs ne sont pas présent il y aura une erreur, il faut toujours vérifier la présence d'un champs avant de l'utiliser).
pour info PDO::PARAM_STR est inutile c'est le cas par défaut ;)
Perso j'utiliserais un tableau dans lequel j'ajouterais les messages d'erreurs et ensuite, dans le else, un simple affichage du tableau.
Il y a moyen de faire quelque chose de plus générique afin d’alléger, un peu le code).
par exemple
[php]<?php
/**
* Vérifie que le champs indiqué existe et ne soit pas vide (ni null, ni égal à false, zéro ou équivalent
* (plus d'info dans la doc de empty)
*
* @param $field
*
* @return bool
*/
function ckeckNotNullPostField($field) {
$retour = false;
if (!empty($_POST[$field])) {
$retour = true;
}
return $retour;
}
/**
* @return string
*/
function checkForm() {
if (ckeckNotNullPostField('nom')) {
$erreur = 'Vous devez renseigner votre nom';
}
if (ckeckNotNullPostField('prenom')) {
$erreur = 'Vous devez renseigner votre prénom';
}
if (ckeckNotNullPostField('adresse')) {
$erreur = 'Vous devez renseigner votre adresse';
}
if (ckeckNotNullPostField('cp')) {
$erreur = 'Vous devez renseigner votre code postal';
}
if (ckeckNotNullPostField('ville')) {
$erreur = 'Vous devez renseigner votre ville';
}
if (ckeckNotNullPostField('tel1')) {
$erreur = 'Vous devez renseigner votre numéro de téléphone';
}
if (ckeckNotNullPostField('mail')) {
$erreur = 'Vous devez renseigner votre email';
}
if (ckeckNotNullPostField('mdp')) {
$erreur = 'Vous devez renseigner un mot de passe';
return $erreur;
}
return $erreur;
}
if (isset($_POST['inscription'])) {
$erreur = checkForm();
// pas d'erreur
if (empty($erreur)) {
try {
$resultat = Cnx::connectCnx()->prepare('INSERT INTO users (societe, nom, prenom, adresse, cp, ville, tel1, tel2, mail, mdp)
VALUES(:societe, :nom, :prenom, :adresse, :cp, :ville, :tel1, :tel2, :mail, :mdp)');
$resultat->bindParam(':societe', $_POST['societe']);// Attention tu ne sais pas si ce champs existe
$resultat->bindParam(':nom', $_POST['nom']);
$resultat->bindParam(':prenom', $_POST['prenom']);
$resultat->bindParam(':adresse', $_POST['adresse']);
$resultat->bindParam(':cp', $_POST['cp'], PDO::PARAM_INT);
$resultat->bindParam(':ville', $_POST['ville']);
$resultat->bindParam(':tel1', $_POST['tel1'], PDO::PARAM_INT);
$resultat->bindParam(':tel2', $_POST['tel2'], PDO::PARAM_INT); // Attention tu ne sais pas si ce champs existe
$resultat->bindParam(':mail', $_POST['mail']);
$resultat->bindParam(':mdp', $_POST['mdp']);
$resultat->execute();
echo 'Enregistrement réussi';
exit; // brutal non ? afficher un beau message dans une page complète avec possibilité de continuer a
// naviguer sur le site c'est mieux ;)
} catch (PDOException $e) {
echo '<div class="error">Erreur SQL : ' . $e->getMessage().'</div>';
}
} else {
echo '<div class="error">';
foreach ($erreur as $e) {
echo $e, '<br />';
}
echo '</div>';
}
}[/php]
les deux fonctions peuvent être déportées dans un fichier "librairie" sachant que la première est réutilisable.
Tu me diras, ben mes if avait le même résultat.
effectivement mais la tu va pouvoir modifier les règles de vérificatio des champs, pour tous le monde, au même en droit c'est quand même plus simple ;)
tu veux pouvoir tester des nombres qui peuvent être zéro ? tu ajoute un paramètre facultatif (isNumber par exemple) qu iest booleen (par défaut false) et plutôt que de faire un brutal empty, tu vérifie le isNumber et si true tu utilise isset et is_numeric, un test si différent,test de '' etc.
l'autre fonction c'est simplement pour dégager du code "utilitaire" de la gestion proprement dite du formulaire, cela évite 25 lignes de code qui au final n'apporte pas grand chose à la compréhension (même si c'est utile).
Bémols dans ce que je te propose : il faudrait passer le tableau $_POST en paramètre des fonctions afin d'être vraiment générique :)
@+