PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 26-05-2010 13:57:32

Yannick
Membre
Inscription : 22-09-2009
Messages : 42

PDO, mysql_real_escape_string et boucle sur les champs de formulaire

Bonjour à tous,
Juste une question en passant concernant PDO.

Pour me faciliter la vie avec l'insertion de données de formulaire dans la dB, j'ai décidé d'utiliser
le truc suivant qui consiste à :

1) lire le champs d'une table ($tbl)
2) comparer ces champs avec les champs du formulaire ($_POST)
3) insérer dans la dB la valeur des champs communs avec PDO

function getMatchingFields( $tbl ) {
        $fields = getFieldsName( $tbl );            
            foreach( $_POST as $k => $v ) {            
                if (in_array( $k , $fields ) && isset ( $v ) ) {            
                    $matchingFields[$k] = $v;            
                }        
            }        
            return $matchingFields;        
        }

puis

public function insert( $tbl , array $matchingFields ) {      
    foreach ( $fields as $k => $v ) {            
            $key      .=  $k.',';
              $value  .=   "'".$v."',";
    }
    $keys    =  substr($key,0,-1);
    $values    =  substr($value,0,-1);
    $query = "INSERT INTO $tbl ( $keys ) VALUES ( $values )";
      if ( !$stmt->execute() ) {return false;}
         else {return true;}      
}

Maintenant le bénéfice n'en est plus un à l'heure d'échapper les caractères comme apostrophe par exemple.
En effet, je ne sais plus où mettre les paramètres attachés ( bound parameters)...

$stmt->bindParam(1, $keys);
$stmt->bindParam(2, $values);

Avez-vous une idée de comment conserver les bénéfices de  la boucle sur les champs et de la sécurisation des données
offerte par PDO et les paramètres attachés?

merci pour vos lumières et à bientôt.

Yannick

Hors ligne

#2 27-05-2010 07:35:16

Alnoss
Modérateur absent
Lieu : 06 - PACA
Inscription : 11-05-2009
Messages : 541
Site Web

Re : PDO, mysql_real_escape_string et boucle sur les champs de formulaire

Yannick a écrit :

Maintenant le bénéfice n'en est plus un à l'heure d'échapper les caractères comme apostrophe par exemple.

Ne trouverais-tu pas ton bonheur dans un petit addslashes() ?


MERCI de lire le mode d'emploi avant de poster !!

Hors ligne

#3 27-05-2010 14:04:00

Yannick
Membre
Inscription : 22-09-2009
Messages : 42

Re : PDO, mysql_real_escape_string et boucle sur les champs de formulaire

Oui, j'y ai pensé d'emblée, mais ceci ne permet pas de profiter de la sécurité apportée par PDO + tu te retrouves avec des antislashes un peu partout dans ta dB et ensuite tu dois les stripslasher...

Raaaahh, le web c'est quand même un métier!

Hors ligne

#4 27-05-2010 14:19:52

Alnoss
Modérateur absent
Lieu : 06 - PACA
Inscription : 11-05-2009
Messages : 541
Site Web

Re : PDO, mysql_real_escape_string et boucle sur les champs de formulaire

Yannick a écrit :

Le web c'est quand même un métier!

Beaucoup trop l'oubli !

Bon, je pense aussi que tu avais pensé à un bon vieux mysql_real_escape ....... et bien rassure toi : en pdo, ça marche aussi

Il faut alors remplacer par $instancePDO->quote($variable);

Attention, il faut faire des petites modifs (minimes), en effet la méthode quote() ajoute elle même les simple quotes,
donc là où tu avais avant:


$sql="select champ1 from table where cond='".mysql_real_escape_string($var)."'";
 

il faut mettre :


$sql="select champ1 from table where cond=".$instancePDO->quote($var);
 

MERCI de lire le mode d'emploi avant de poster !!

Hors ligne

#5 27-05-2010 15:38:17

Yannick
Membre
Inscription : 22-09-2009
Messages : 42

Re : PDO, mysql_real_escape_string et boucle sur les champs de formulaire

Pas mieux...

J'essaie maintenant de faire une boucle sur bindParam, mais il n'insert qu'une seule et même valeur pour tous les champs.

De retour à la mine.

Hors ligne

#6 27-05-2010 16:01:29

Yannick
Membre
Inscription : 22-09-2009
Messages : 42

Re : PDO, mysql_real_escape_string et boucle sur les champs de formulaire

Eurêka, il fallait attacher une valeur (bindValue) et pas un paramètre bien sûr (bindParam).

( J'en ai profité pour réécrire un petit peu la façon de transformer mon tableau $fields en une chaîne ).

Voici :

  public function insert( $tbl , array $fields )
    {
           
      $keys = array_keys($fields);
      $keys = implode(",", $keys);  // on récupère les champs
     
      $placeholders = substr( str_repeat( '?,' , sizeof($fields) ), 0 , -1 );  // on crée autant de placeholders ? qu'il y a de champs
     
        $query = "INSERT INTO $tbl ($keys) VALUES ($placeholders)";
      $stmt  = $this->_dbc->prepare($query);
     
      $i = 1;
      foreach ($fields as $k => $v) {
          $stmt->bindValue($i++,$v); // on attache aux placeholders créés une valeur
      }
     
      if ( !$stmt->execute() ) {
            return false;
        }
      else {
        return true;
      }
       
    }

Plus besoin de stripslashes, quote ou mysql_real_escape!

Dernière modification par Yannick (27-05-2010 16:03:56)

Hors ligne

Pied de page des forums