8791 sujets

Développement web côté serveur, CMS

Hello à tous,

Petite question sur les requêtes préparées car la redondance des variables m'interrogent sur la meilleure manière de gérer tout ça.

Je cherche la meilleure méthodologie pour gérer le passage de champ vide dans un formulaire en champ NULL dans la bdd en utilisant les requêtes préparées.

Voici un exemple, :variable3 et :clef_etrangere sont facultatives et typées comme NULL dans la bdd.


$req=$bdd->prepare("INSERT INTO product VALUES(" :variable1, :variable2, :variable3, :clef_etrangere)");
$req->execute(array(
 ':variable1'=>$variable1,
':variable2'=>$variable2,
':variable3'=>$variable3,
':clef_etrangere'=>$clef_etrangere
  )) or die ('erreur sql :'.print_r($req->errorInfo()));


Pour ma part je serai tenté d'écrire la requête avec toutes variables en attribuant la valeur NULL aux champs vides mais ça bug pour la clef étrangère à cause de la norme SQL.

Sinon on écrit la requête avant son appel par l'objet $bdd en incluant que les variables nécessaires mais cela oblige aussi de traiter le array des marqueurs nominatifs ou alors on laisse toutes les variables dans le array, mais dans tous les cas je trouve cette solution très fastidieuse à mettre en place.

Voilou j'espère qu'un développeur php pourra m'éclairer. Merci par avance. Smiley cligne

@++
Modifié par AspiGeek (30 Sep 2010 - 11:47)
Salut,

Plutôt que de remplir tes variables dans la méthode execute(), tu as pensé à utiliser la méthode bindValue() ? Elle pourrait t'être utile.
Merci pour l'idée, c'est vrai que cette solution est meilleure que le array même si ce n'est pas fait pour ça.
Par contre ça nécessite toujours de faire des tests aussi bien sur la requête que sur les marqueurs.

J'ai beau cherché, je ne trouve pas car en fait beaucoup de développeurs ne s'embêtent pas et type tous leurs champs comme "Not NULL" alors forcément c'est plus simple mais dans mon cas je dois faire des moyennes donc c'est mort.

Mais je crois avoir trouvé... je pense construire un tableau de variables et d'en extraire les indexs sur la requete sql et de le balancer également dans le execute, ça me semble pas mal ça Smiley smile

Edit: Bon bah c'est pas mal du tout avec un array, pour ceux que ça intéresse voici mon test, il faut juste que le nom des champs de la bdd correspondent à celui du formulaire.


include_once('connection.inc.php');
$champs=array('champForm1','champForm2','champForm3','etc');

if(!empty($_POST)){
  foreach($champs as $champ){
    if(!empty($_POST[$champ])){
      $variable[$champ]=htmlspecialchars($_POST[$champ]);
      $variable_keys=array_keys($variable);
    }
  }
  
  $req=$bdd->prepare("INSERT INTO product(id_product,".implode(',',$variable_keys).") VALUES('',:".implode(',:',$variable_keys).")");
  $req->execute($variable) or die ('erreur sql :'.print_r($req->errorInfo())) ;
}


En gros vous rajoutez vos noms de champs de formulaire uniquement dans le 1er array et le tour est joué, après je pense récupérer les erreurs sql pour savoir si le champs doit être rempli, si le typage est correct etc...

De toute façon je me suis toujours posé la question du traitement en amont des requetes en php.

Voilou Smiley smile
Modifié par AspiGeek (30 Sep 2010 - 11:45)