Méthode logique de contrôle avant traitement

Eléphanteau du PHP | 40 Messages

02 déc. 2015, 02:21

Bonjour,

Débutante dans le monde du développement, je me lance !

Dans mon formulaire j'ai mis un script pour contrôler la saisie en javascript seulement si on désactive le javascript de son navigateur le contrôle ne se fait plus et c'est là mon interrogation. Comment faire, javascript ou non, pour contrôler côté serveur les données saisies dans mon formulaire.

Exemple : vérifier, côté php, que le numéro d'abonné est bien un nombre sur 8 caractères et que le champ trucmuche est bien renseigné...au final faire ce que faisait le javascript et traiter les erreurs.

On le fait au moment du if (isset($_POST["submit"])) en mettant une série de conditions ? Avant ? Après ?

Je pensais utiliser PDO pour se faire. L'idée c'est de dire si tu es malveillant et que tu n'as pas saisi ce qui est attendu je n'exécute rien et ça renvoie un booléen. J'ai un peu du mal à voir où je dois faire mon contrôle.

Avez-vous un exemple précis ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 déc. 2015, 10:16

Bonjour Clair3 et bienvenue sur PHPfrance !
On le fait au moment du if (isset($_POST["submit"])) en mettant une série de conditions ? Avant ? Après ?
Cette commande permet de savoir si un formulaire a été envoyé, par conséquent si tu fais tes tests de validation avant, ils vont se faire même lorsqu'aucune donnée n'aura été envoyé, ce qui n'est pas très utile, il faut donc faire les tests après.

Il est effectivement indispensable de contrôler en PHP les variables qui te sont envoyés par un utilisateur, notamment pour des raisons de sécurité.

Il y a 2 solutions, qui sont complémentaires :
A) PHP dispose notamment de la fonction filter_var() ainsi qu'une liste de filtres prédéfinis pour contrôler les types de variables les plus courantes.
Il existe deux types de filtres :
- des filtres de validation qui vont renvoyer true ou false pour te dire si la variable correspond bien à ce que tu attends.
Par exemple : FILTER_VALIDATE_EMAIL > renverra true si la donnée passée en paramètre ressemble bien à une adresse e-mail, ou false sinon
- des filtres de nettoyage qui vont renvoyer la variable que tu as passé en paramètre débarrassée de tous les caractères qui ne correspondent pas au format que tu attends.

Il y a pas mal d'exemple dans la documentation que je t'encourage à tester pour comprendre le fonctionnement.


B) La 2ème solution, utile si tu veux faire des tests + précis, c'est de passer par des expressions régulières, mais c'est un peu + compliqué à mettre en oeuvre si tu n'as jamais fait de regex.
Voici par exemple ce qu'il faut faire pour vérifier qu'un "numéro d'abonné est bien un nombre sur 8 caractères "
if (preg_match("`[0-9]{8}`i", $numero_abonne) {
     // Numéro d'abonné valide
}else{
     // Numéro d'abonné invalide
}
Rédiger des expressions régulières n'est pas toujours aussi aisé, il y a un site qui est pas mal pour tester : https://regex101.com/r/hX1mD2/1
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 40 Messages

02 déc. 2015, 13:59

Bonjour Arthur,

Merci, quel accueil :)

Je ne connaissais pas tout ça et ça va beaucoup m'aidé.

Apparemment avec PDO il y a moyen de savoir ce qu'on insère ou plutôt ce qui est attendu avec par exemple des PDO::PARAM_INT

Mon idée était de contrôler les infos avec cette méthode et de récupérer si la requête à insérer quelque chose ou non (puisque la requête sera valide et les paramètres bons). Comment faire ce contrôle de "L'ajout a réussi"

Pour faire simple est-ce qu'il y a moyen de savoir, contrôler la valeur de $pdo->execute() , si quelque chose a été inséré, selectionné, supprimé...

Arrêtez-moi si mon raisonnement n'est pas bon ou si ce n'est pas faisable.

Encore merci bonne journée !

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 déc. 2015, 23:29

Effectivement, il est possible avec bindParam() de préciser le type de données à insérer : numérique, texte, booléen
Mais... c'est tout... :-) il n'y a pas d'autre contrôle sur les caractères précisément attendus ni la longueur

Or si tu veux réellement contrôler tes données (par exemple pour une adresse e-mail, ou dans ton exemple, une suite de 8 chiffres) et afficher un message d'erreur explicite à tes utilisateurs, il faut passer par l'une des solutions évoquées plus haut
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 40 Messages

03 déc. 2015, 10:52

Bonjour,

Il y a t-il un moyen de contrôler si l'insert a fonctionné ?

D'un point de vue algorythme/logique comment et où intervient le filter_vars ?

Super le site regex101, merci j'adore !!

Claire

Mammouth du PHP | 2703 Messages

03 déc. 2015, 13:13

"PDO::exec — Exécute une requête SQL et retourne le nombre de lignes affectées"

on controle
si c'est tout bon, on execute la requete.
si ce n'est pas bon, on avertit l'utilisateur sans rien executer.

Mammouth du PHP | 2278 Messages

05 déc. 2015, 13:06

Le filter_var intervient dans le script qui récupére les données.
Il existe aussi un contrôle au moment de la saisie comme expliqué en détail chez http://www.alsacreations.com/tuto/lire/ ... email.html
Il a le mérite d'être au standard HTML 5 et l'inconvénient d'être ignoré par certains navigateurs.
Enfin, on peut mettre là où on le juge utile <input type = "text" name = "par_exemple" required= "required" value ="" />
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 40 Messages

13 déc. 2015, 04:51

Bonjour,
Je reviens vers vous pour l'histoire des filtres.
Soit j'ai mal regardé ou alors il y a une limite aux filtres de nettoyage.
Je cherche un filtre var_filter qui garde que les lettres et supprime tout le reste de façon à pouvoir stocker les noms avec des quotes.
Le filtre FILTER_SANITIZE_STRING m'encode les quotes du coup je stocke des entités html dans ma base, pas terrible... c'est ce qui se fait habituellement ?
Et à contrario, il me stocke aussi les guillemets alors que je n'en veux pas...
Clair3

Je suis une couche tard je sais mais client oblige :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

13 déc. 2015, 11:07

Il existe différents flags qui permettent d'adapter les filtres, notamment pour l'encodage des guillemets : http://php.net/manual/fr/filter.filters.sanitize.php

Mais si tu veux quelque chose sur mesure, alors il faut passer par des regex et preg_replace() pour obtenir précisément ce que tu veux. http://php.net/manual/fr/function.preg-replace.php
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 40 Messages

14 déc. 2015, 23:23

Merci beaucoup je pense que je vais utiliser le site regex101.com.

Vous stockez comment les quotes et caractères spéciaux dans vos bases ? Avec des entités ? C'est ce qui se fait communément ?

Autrement quelle regex peut couvrir l'ensemble des noms, prénoms occidentaux ?

a-zA-Z, si je veux toutes les lettres accentuées + le tiret du 6 et l'apostrophe, j'ai oublié un cas ?

Eléphanteau du PHP | 40 Messages

16 déc. 2015, 10:53

Bonjour, personne pour répondre à mes petites questions ?

Eléphanteau du PHP | 40 Messages

20 déc. 2015, 18:09

Bonjour,

Vraiment personne :( ?