IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Boucle de récupération de champ POST php en PDO ? [PDO]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 48
    Par défaut Boucle de récupération de champ POST php en PDO ?
    Bonjour,

    Voilà je décide de me lancer sur PDO.

    Pour le moment je réadapte mes sites et tout semble fonctionner.

    Je pense avoir bien compris le système.

    Je trouve par contre que niveau écriture cela va allonger mon code.. ouioui je chipote mais bon

    Je cherche une solution pour traiter simplement mes formulaires en POST qui peuvent être a rallonge.

    Pour le moment avec mysql j'utilisais cette fonction qui me faisait gagner pas mal de lignes d'écritures et donc de temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(list($champ,$value)=each($_POST)) {  $$champ = mysql_real_escape_stirng(trim($value)); }
    Je souhaite maintenant passer le tout à PDO et donc idéalement avec des requêtes préparées pour bien sécuriser le tout. Le but serait de faire quelque chose dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(list($champ,$value)=each($_POST)) { $sql->bindParam(":$champ", $value); }
    Seulement j'ai une erreur : Invalid parameter number: number of bound variables does not match number of tokens

    J'imagine que le problème vient du fait que tous les éléments en POST sont enregistrés dans l'objet SQL alors que je ne les utilise pas tous ?

    Est-ce possible ? Est-ce bien d'utiliser ce système ? Vaut-il mieux tout saisir ? Comment faites vous avec des formulaires vraiment long... (plus de 50 éléments).

    Du coup second question.. vaut il mieux utiliser les requêtes préparées pour toutes requêtes même les plus simples ?

    Merci.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    L'interêt d'une requête préparée ne se juge pas en termes de complexité de la requête.
    Tu ne peux effectivement pas "bind" toutes les données de POST.
    Tu peux avoir un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $postvars = array('toto', 'titi');
    foreach ($postvars as $var) {
           $sql->bindParam(":$var", $_POST[$var]);
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 48
    Par défaut
    Merci pour le retour.

    Ok pour le tableau mais finalement j'ai plusieurs instructions sur les pages de traitement et du coup quoi qu'il arrive j'aurai plusieurs objet $sql donc ingérable.

    Le but de bindParam étant de sécuriser les données tout en spécifiant le type de celle-ci pour ensuite attraper avec catch les erreurs possible, je pense qu'il est finalement mieux de tout saisir non ? sauf si j'ai qu'un objet $sql et que toutes les données sont de mêmes types dans ce cas j'exclue les input qui ne m'intéresse pas dans un tableau.. pour aller plus vite :p

    Et pour un DELETE unique si l'id a supprimer provient d'un formulaire il est mieux de passer via une requête préparée et bindparam/bindvalue que de faire un simple exec ?

    Merci encore.

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Nan pdo ça ne rallonge pas, au contraire cela peut te faire gagner beaucoup de temps par rapport à mysql, et en même temps tu gagne en sécurité.

    La voix royale pour simplifier l'écriture est de faire des requêtes préparées et de passer un tableau dans le execute. Petite astuce on peut utiliser aussi la structure tableau pour construire le formulaire, et dans ce cas cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php 
    if(isset($_POST['identifiants'])){
    	try{
    		$sql = "INSERT INTO membres (mail, adresse, tel)  VALUES (:mail, :adresse, :tel)";
    		$query = $connexion->prepare($sql);
    		$query->execute($_POST['user']);
    	}
    	catch (PDOException $e){
    		echo $e->getMessage();// uniquement en développement
    	}
    }
    ?>
    <form action="#" method="post">
        <input type = "submit" name = "identifiants" value = "envoyer"/>
        adresse<input type="text" name="user[adresse]" value="" />
        mail<input type="text" name="user[mail]" value="" />
        tel<input type="text" name="user[tel]" value="" />   
    </form>

    Après rien ne t'empêche de compléter le tableau (ou de contrôler ses éléments)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php 
    if(isset($_POST['identifiants'])){
            $user = $_POST['user'];
            $user['droits'] = 1;
    	try{
    		$sql = "INSERT INTO membres (mail, adresse, tel, droits)  VALUES (:mail, :adresse, :tel, :droits)";
    		$query = $connexion->prepare($sql);
    		$query->execute($user);
    	}
    	catch (PDOException $e){
    		echo $e->getMessage();// uniquement en développement
    	}
    }
    ?>
    Quand même plus simple qu'avec mysql, non ?

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 48
    Par défaut
    Bonjour,

    Merci pour la réponse

    Oui à priori je vais gagner en temps d'exécution surtout pour les requêtes qui se répètent. Pour le moment j'avance sur des requêtes unique donc en terme de saisi je trouve cela plus long.

    Avant j'avais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
    // l'id est récupérédans une boucle de Post
    while(list($champ,$value)=each($_POST)) { $$champ = htmlspecialchars(trim($value)); }
    $sql = mysql_query("DELETE FROM ma_base WHERE id='$id'");
     
    // UN autre exemple
    $select_id_process = mysql_query("SELECT * FROM doc ORDER BY id_process DESC LIMIT 0,1");
    ?>
    Et maintenant j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    // l'id est récupérédans une boucle de Post
    while(list($champ,$value)=each($_POST)) { $$champ = (trim($value)); }
    $delete = $pdo->prepare("DELETE FROM ma_base WHERE id=:id"); 
    $delete->bindPAram(':id',$id);
    $delete->execute();
     
    // Conversion de l'autre exemple
    $select_id_process = $pdo->prepare("SELECT * FROM doc ORDER BY id_process DESC LIMIT 0,1");
    $select_id_process->execute();
    ?>
    Donc un chouille plus long en terme d'écriture.. ici on n'a qu'une valeur à récupérer mais quand il s'agit d'un long formulaire je peux en effet appliquer le tableau qui est une très bonne idée.

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Dans quasiment dans tous les cas tu peux gagner une ligne en évitant le bindParam (comme montré dans mes exemples) en passant un tableau dans le execute.

    Et puis avec ta première syntaxe mysql tu as une faille de sécurité (injection sql possible dans ton delete).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [8] Récupération valeur champs type file créer en flash avec PHP
    Par sooprano dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 21/04/2011, 13h06
  2. Récupération des champs dynamique js en php
    Par sfarouk dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 12/03/2011, 17h48
  3. php et récupération des champs du formulaire
    Par kadiato dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 07/05/2009, 16h45
  4. [AJAX] [AJAX/PHP] récupération de paramètres POST
    Par TheLostMind dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/12/2008, 08h08
  5. [PHP-JS] Récupération de champs après onchange
    Par didi dans le forum Langage
    Réponses: 6
    Dernier message: 03/05/2008, 09h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo