Optimisation

Eléphant du PHP | 55 Messages

15 déc. 2011, 19:46

Bonsoir,

J'ai une table avec -/+ 15 champs et j'ai plusieurs formulaires sur mon application qui alimente, mette à jour, etc...
Alors comme je suis fainéant :) j'ai coder ceci.
foreach($_POST AS $key => $val)
   {
     /*
     Recup le nom des champs.
     */
     $champ  .= $key;
     $champ  .= ",";

     /*
     Recup les valeurs.
     */
     $insert[]  = $val;

     /*
     Création des ?,? dans VALUES.
     */
     $valeur .= '?,';
   }

   /*
   Supprime la dernière , des données.
   */
   $ch   = substr( $champ, 0, -1 );
   /*
   Supprime la dernière , des données.
   */
   $post = substr( $valeur, 0, -1 );

  try
  {

   	$stmt = SPDO::getInstance()->prepare('UPDATE  matable  ( '.$ch.' ) VALUES ( '.$post.' )') ;

    //$stmt->debugDumpParams();

   	$stmt->execute($insert);
  }
  catch(Exception $e)
 {
    die('Erreur : '.$e->getMessage());
 } 
Précision le nom des champs de mes formulaires correspond aux noms de mes champs dans la table.
Ça fonctionne nickel, mais je ne suis pas certain que cela soit très sécuriser bien que PDO protège normalement mes champs.

Mais mon plus grand soucis est pour un UPDATE je ne voie pas comment lui passer l'identifiant de l'article à mettre à jour. :oops:

Votre avis ?

D'avance merci
8-)
http://lilou141203.labrute.com : merci de vous battre contre ma p'tite brute! :P

ViPHP
xTG
ViPHP | 7331 Messages

15 déc. 2011, 20:37

Il faut faire un cas spécial, une clé avec un marqueur qui te permettra de savoir que c'est à mettre dans la clause WHERE.
Du genre si tu nommes un champ hidden "where_id" en cherchant where_ dans chaque clé de ton tableau $_POST tu pourras filtrer et opérer les changements adéquats.

Eléphanteau du PHP | 49 Messages

16 déc. 2011, 17:38

Comme tu dis, ce n'est vraiment pas sécurisé comme manière de faire...

Eléphant du PHP | 55 Messages

16 déc. 2011, 18:13

Comme tu dis, ce n'est vraiment pas sécurisé comme manière de faire...
Et dans un cas pareil comment ferais-tu ?
8-)
http://lilou141203.labrute.com : merci de vous battre contre ma p'tite brute! :P

Eléphanteau du PHP | 49 Messages

16 déc. 2011, 18:49

Dans la logique de ton script, c'est ta requête SQL qui va t'indiquer la validité des valeurs saisies par l'utilisateur, en fonction de son plantage ou non.
Logiquement, tu exécutes ta requête uniquement si un minimum de tests sons OK. Le minimum syndical serait au moins de contrôler les colonnes à updater : si je modifie dans firebug le nom d'un champ, il va essayer d'updater dans la colonne correspondante (je transforme le name="nom" en name="toto" et donc il va essayer d'updater dans la colonne toto)

Si aimes automatiser, une méthode rapide :
- Mettre le nom de tes champs de formulaire dans un array => $sMesChamps = ('nom', 'prenom','age');
- Si formulaire posté, tu parcours ton array et pour chaque entrée, tu récupères la valeur du $_POST correspondant, que tu mets dans une variable.
- Ta requête est donc écrite en 'dur' => $stmt = SPDO::getInstance()->prepare('UPDATE matable ( nom, prenom, age ) VALUES ($sNom, $sPrenom, $sAge) ;

Tu vois?

PS : j'ai pris nom, prenom et age pour illustrer