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 :

bindParam simplification d'écriture ? [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut bindParam simplification d'écriture ?
    Bonjour à tous,

    Je m'adresse à vous afin de me renseigner sur les possibilités de simplifier l'écriture de bindParam.

    Lorsque l'on lie un paramètre il faut qu'il ai été déclaré avant car sinon PHP me génère une erreur (en strict je ne sais pas si elle est levée autrement).
    J'ai bien essayé d'initialiser le paramètre directement dans bindParam mais celà génère également une erreur.

    Cela n'est pas trop gênant dans la cadre d'un ou deux paramètres pour la requête ( par exemple le paramètre d'un foreach que l'on déclare avant) mais devient vite brouillon quand on en utilise beaucoup plus.

    Faut-il donc de préférence remplacer bindParam par bindValue à l'intérieur de la boucle dans ce cas, ou bien y a t il une solution moins touffue pour écrire la requête ?

    Voici un exemple :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    $db = new db_user2();
     
    $sql = "SELECT pcr_results(     :id_request,:id_group,:id_task,
                                    :id_patient,:pcr_date,:failure,
                                    :gag,:pol,:env,:hubg,
                                    :type_sample)";
     
    $id_request=0;   $id_group=0;  $id_task=0;   $id_patient=0;
    $pcr_date='';   $gag='';   $pol='';  $env='';  $hubg='';  $type_sample=0;
     
    $db->beginTransaction();
     
    $result = $db->prepare($sql);
     
    $result->bindParam('id_request',$id_request,PDO::PARAM_INT);
    $result->bindParam('id_group',$id_group,PDO::PARAM_INT);
    $result->bindParam('id_task',$id_task,PDO::PARAM_INT);
    $result->bindParam('id_patient',$id_patient,PDO::PARAM_INT);
    $result->bindParam('pcr_date',$pcr_date,PDO::PARAM_STR);
    $result->bindParam('gag',$gag,PDO::PARAM_STR);
    $result->bindParam('pol',$pol,PDO::PARAM_STR);
    $result->bindParam('env',$env,PDO::PARAM_STR);
    $result->bindParam('hubg',$hubg,PDO::PARAM_);
    $result->bindParam('type_sample',$type_sample,PDO::PARAM_INT);
     
    foreach($_POST as $key => $value){
            if(!preg_match('/^([0-9]+)\-([0-9]+)\-([0-9]+)\-([0-9]+)#([a-z_]+)$/',$key,$matches)) trigger_error("Please contact the admin[h]",E_USER_ERROR);
     
                    if($matches[5]==='failure'){ // nasty trick to take every entry only once
                            $prefix = $matches[1]."-".$matches[2]."-".$matches[3]."-".$matches[4];
     
                            if( empty($_POST[$prefix."#failure"])) $result->bindValue('failure',$_POST[$prefix."#failure"],PDO::PARAM_NULL);
                            else $result->bindValue('failure',$_POST[$prefix."#failure"],PDO::PARAM_INT);
     
                            $id_request = $matches[1];
                            $id_group = $matches[2];
                            $id_task =  $matches[3];
                            $id_patient = $matches[4];
                            $pcr_date = $_POST[$prefix."#date"];
                            $gag = $_POST[$prefix."#gag"];
                            $pol = $_POST[$prefix."#pol"];
                            $env = $_POST[$prefix."#env"];
                            $hubg = $_POST[$prefix."#hubg"];
                            $type_sample = $_POST[$prefix."#type_sample"];
     
                            $result->execute();
                    } else continue;
     
    }
    if($db->commit()) echo "<meta http-equiv='refresh[..]
    Maintenant il est également possible que je passse complètement à côté de l'utilisation de bindParam ...

    Merci d'avance pour vos suggestions.


    Edit : Je précise tout de même qu'il est impossible d'initialiser bind param avec la variable d'un tableau exemple : bindParam('nom',table['index']) d'où la nécéssité de nommer chaque variable. (ou alors pareil je passe à côté de quelquechose...)

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je ne comprends rien a ton code,en effet pourquoi tout ces bindParam dans un select .
    Le select lit toutes les lignes trouvées directement par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $machin=$requte['nom du champ']

  3. #3
    Membre chevronné

    Avatar de nicosmash
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2012
    Messages : 395
    Points : 2 107
    Points
    2 107
    Par défaut
    Bonsoir,

    On peut tout mettre dans un tableau mais je préfère comme ceci car sinon niveau débogage c'est plus compliqué

    Pour ce qui est du bindParam et bindValue c'est différent :
    - bindParam
    - bindValue

    -------------------------------

    Lorsque l'on lie un paramètre il faut qu'il ai été déclaré avant car sinon PHP me génère une erreur (en strict je ne sais pas si elle est levée autrement).
    J'ai bien essayé d'initialiser le paramètre directement dans bindParam mais celà génère également une erreur.
    Tout simplement en vérifiant si la variable existe (un simple if) puis le paramètre s'il existe, sinon une variable par défaut.

  4. #4
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    @christele_r : "SELECT pcr_results " pcr_results est une fonction, d'où les paramètres derrière.


    @nicosmash : Donc en gros pas moyen de simplifier (le tableau ne me botte pas non plus du aux difficultés de déboguage)...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Pandora Voir le message
    @christele_r : "SELECT pcr_results " pcr_results est une fonction, d'où les paramètres derrière.
    Bonjour,
    Oui alors avec ce que tu avais posté, impossible de vraiment te répondre
    Contrairement à ce que tu vient de poster, si nous avions d'avantage de code je suis presque certaine que les binParam ne sont pas utils... postes voir ton code

  6. #6
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Je veux bien rajouter du code, mais tout est là, et je ne vois pas trop quoi ajouter pour que ce soit plus clair?

    Les seules choses qui ne sont pas écrites sont les vérifications des variables POST.

    C'est un script suite à un formulaire qui enregistre des résultats dans la base de données (postgres).


    L'entête de la fonction :
    -- Function: pcr_results(integer, integer, integer, integer, date, integer, character, character, character, character, integer)

  7. #7
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    @christele_r

    Je cherchais quoi ajouter en code pour éclaircir (ou pas) et donc je vais mettre le code originel avant que je ne le transforme pour PDO.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    $dbVerbindung = new db_user;
     
    $sql = '';
     
    foreach($_POST as $key => $value){
     
            // make sure the browser client didn't fiddle around & extract data
     
            if(!preg_match('/^([0-9]+)\-([0-9]+)\-([0-9]+)\-([0-9]+)#([a-z_]+)$/',$key,$matches)) trigger_error("Please contact the admin[h]",E_USER_ERROR);
     
                    if($matches[5]==='failure'){ // nasty trick to take every entry only once
     
                            $prefix = $matches[1]."-".$matches[2]."-".$matches[3]."-".$matches[4];
     
                            if( empty($_POST[$prefix."#failure"])) $_POST[$prefix."#failure"]='NULL';
                            else $_POST[$prefix."#failure"] = $_POST[$prefix."#failure"];
     
    //[..] autres tests sur POST
     
                            $sql .= "SELECT pcr_results(    ".$matches[1].",
                                                                    ".$matches[2].",
                                                                    ".$matches[3].",
                                                                    ".$matches[4].",
                                                                    '".$_POST[$prefix."#date"]."',
                                                                    ".$_POST[$prefix."#failure"].",
                                                                    '".$_POST[$prefix."#gag"]."',
                                                                    '".$_POST[$prefix."#pol"]."',
                                                                    '".$_POST[$prefix."#env"]."',
                                                                    '".$_POST[$prefix."#hubg"]."'::char,
                                                                    '".$_POST[$prefix."#type_sample"]."'
                                                                    );";
     
     
                    } else continue;
     
    }
     
     
    if($dbVerbindung->query($sql)) echo "<meta http

  8. #8
    Invité
    Invité(e)
    Par défaut
    Parfait et merci à toi,
    Donc je te confirmes qu'en PDO aucun bindParam n'est à utiliser.
    dans le cas de SELECT.
    Par contre avant un ajout ou modification OUI !
    Exemple:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
    // select==========
    $req = $bdd->prepare("SELECT * FROM une table ");
    $req->execute();
    while ($donnees = $req->fetch())
    {
    echo "<li>".$donnees['nom']." (".$donnees['prix']." EUR)</li>";
    }
    // ajout ===========
    $ajout = $bdd->prepare("INSERT  INTO ajax_tableur (lechamp) VALUES ( :nom)");
    $ajout->bindValue(':nom', $valeur, PDO::PARAM_STR);
    $ajout->execute();
    ?>

  9. #9
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Euh ...

    Je crois qu'il ne faut pas se focaliser sur le SELECT dans ma requête vois ca comme un insert.

    Ce select sert uniquement à appeler une fonction enregistrée dans postgresql.
    Cette fonction fait des insert/delete/select, et a donc besoin de paramètres pour fonctionner...


    Néanmoins pour la remarque sur le Select et le bindParam j'ai du mal à voir pourquoi il ne pourrait pas être utilisé conjointement.

    Le cas d'un Select à l'intérieur d'une boucle foreach doit fonctionner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach($var as $key=>$value){
             "SELECT x,y,z FROM table WHERE id = $value;
    }
    Et là on est sur un bindParam sur du Select non ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Mais oui j'ais bien compris
    Juste te rappeler que PDO c'est du pur POO et donc je te vois faire des classes de classes, tu pourrais même en rajouter un niveau, histoire de te perdre dans tes pointeurs.
    Maintenant essayant de répondre à ta question, (tu en fait ce que tu souhaites)
    Pour ma part je laisserais dans les fonctions tout ces traitements, quand ils sont requis, à leur place , et surtout pas "à priori".

    C'est à toi d'en juger ...

  11. #11
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    J'avoue que j'ai du mal à voir où tu veux en venir.


    La classe est juste là pour ajouter un gestionnaire d'erreur,un debuger pour activer hors production avec un define et les login/mdp de connexion.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            final public function beginTransaction(){
                    try{
                            if(DEBUG_QUERIES == 1) print_r("BEGIN_______________ <br/>\n");
                            return parent::beginTransaction();
     
                    } catch (PDOException $e) {
                            trigger_error(DB_ERROR." <br/> ".$e->getMessage(),E_USER_ERROR);
                            die();
                    }
            }

    Ok pour laisser les traitements dans ces fonctions, mais à ce moment, dans quel cas concret est-il justifié d'utiliser bindParam si dans ce genre de cas celà ne convient pas ?

    J'ai vraiment du mal à me faire une opinion ...

    Edit: des trucs...

  12. #12
    Invité
    Invité(e)
    Par défaut
    Ok je crois comprendre.
    Essayons de traiter un par un l'organisation, ensuite tu replacera tout ou tu le souhaites.

    PDO n'affiches ni les exceptions ni les erreurs. Il faut lors de la connexion le demander gentiment
    La syntaxe classique est
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
     try
          {
           $bdd = new PDO('mysql:host=localhost;dbname=TADATABASE', 'root', '');
           $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
          }
        catch(Exception $e)     {      die('Erreur : '.$e->getMessage());     }
    ?>
    Ensuite notes bien qu'en PDO aucune variable doit étre dans ton "prepare"
    Cette seule régle répond a ta question, car a chaque fois que tu vas utiliser une variable TU DOIS lui donner un pointeur :monpointeur
    Et alors là tu utilises avant ton exec un bindValue

    Alors contrairement a ce que je t'ais dis sur le SELECT, lorsque celui-ci utilises par exemple WHERE etc... alors oui tu as besoins du bindValue

    exemple
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    $ajout = $bdd->prepare("INSERT  INTO visiteurs (nom, prenom,mail,VisiteurMdpSha1,VisiteurOK,Avatar) VALUES ( :nom, :prenom,:mail,:VisiteurMdpSha1,:VisiteurOK,:Avatar)");
       $ajout->bindValue(':nom', $SonNom, PDO::PARAM_STR);
       $ajout->bindValue(':prenom', $SonPreNom, PDO::PARAM_STR);
       $ajout->bindValue(':mail', $SonMail, PDO::PARAM_STR);
       $ajout->bindValue(':VisiteurMdpSha1', $mdp_sha1, PDO::PARAM_STR);
       $ajout->bindValue(':VisiteurOK', $VisiteurOK, PDO::PARAM_STR);
       $ajout->bindValue(':Avatar', $avatar, PDO::PARAM_STR);
       $ajout->execute();
       echo "<br /> ".$SonNom." - ".$SonPreNom." est bien ajouté<br />";
    ?>

  13. #13
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Humm.

    J'ai l'impression qu'on est un peu à côté de la plaque.

    Je n'ai pas copié la classe de connexion entière car je n'en voit pas l'intérêt. Les exceptions fonctionnent bien et les erreurs sont gérées correctement.
    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
     
            /**
            * construct the PDO connexion
            */
            public function __construct(){
                    try{
                            parent::__construct('pgsql:host=127.0.0.1;dbname='.DATABASE_NAME,$this->user,$this->password);
                            $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('stmt'));
                            if(DEBUG_PDO == 1){
                                    $this->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
                            } else $this->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
     
                    } catch (PDOException $e){
                          trigger_error(DB_CONNECT_ERROR.'<br/>'.$e->getMessage(),E_USER_ERROR);
                            die();
                    }
            }
    Je ne crée pas un code nouveau, j'adapte juste une appli/site qui tourne en production depuis pas mal d'années et qui a besoin d'un coup de plumeau, donc au niveau de la structure je n'ai pas énormément de marge de manoeuvre et je peux difficilement tout changer.

    Ensuite notes bien qu'en PDO aucune variable doit étre dans ton "prepare"
    Cette seule régle répond a ta question
    Là j'ai du mal, je ne comprend pas le rapport, entre la rhétorique sur la bonne pratique de bindParam avec les variables dans le prepare ( et je me sens un peu bête du coup)

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Pandora Voir le message
    Ensuite notes bien qu'en PDO aucune variable doit être dans ton "prepare"
    Cette seule règle répond a ta question
    Là j'ai du mal, je ne comprend pas le rapport, entre la rhétorique sur la bonne pratique de bindParam avec les variables dans le prepare ( et je me sens un peu bête du coup)
    Comme déjà dit, tu fera comme bon te semble, j'ais fait de mon mieux,croyant t'éclairer mais OUI si tu mets une variable dans ton prépare tu auras en PDO une erreur, ce n'est pas de la rhétorique, c'est le B A BA de la syntaxe de PDO.

  15. #15
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Comme déjà dit, tu fera comme bon te semble, j'ais fait de mon mieux,croyant t'éclairer.
    Et je te remercie du temps consacré à essayer de m'éclairer, c'est toujours intéressant d'avoir d'autres opinions.

    Je vais passer le post en résolu sinon on va vraiment partir en hors sujet

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

Discussions similaires

  1. [XL-2010] Simplification d'écriture du code
    Par canary dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 02/01/2013, 15h56
  2. Héritage et simplification d'écriture
    Par franco01 dans le forum C++
    Réponses: 7
    Dernier message: 17/02/2006, 10h48
  3. [DOM] création et écriture
    Par phoebe dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 22/03/2004, 15h13
  4. [debugger] détection écriture mémoire
    Par tut dans le forum MFC
    Réponses: 3
    Dernier message: 07/01/2004, 10h17
  5. [Kylix] Simplifications de l'écriture Kylix/Pascal"
    Par Mr Vincent KLEIN dans le forum EDI
    Réponses: 1
    Dernier message: 11/03/2003, 11h07

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