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...)