Bonjour à tous,
Ceci est mon premier Post sur le forum, excusez-moi si la question a déjà été posée, mais je ne l'ai pas trouvée.
J'essaie de construire une requête muti-critères optionnels dont pour l'un d'eux la sélection doit s'opérer sur base d'une liste de valeurs (d'où l'utilisation de la clause IN).
La liste des valeurs est le résultat d'une sélection précédente, et cette liste est stockée dans une variable "$DossiersSelected".
Mon problème est que lors de l'interprétation je ne retrouve pas les valeurs de la variable dans la requête mais le terme ARRAY.
Ma question est donc : Est-il possible, dans ce type de requête, d'utiliser une variable ou la liste des valeur relatives à la clause IN doivent-elles être fixes et codées telles quelles ?
D'avance Merci
Philippe
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104 if(!empty($_POST)) { // Détermination de la requête à la Data Base $field1 = htmlentities($_POST['Ident']); $field2 = htmlentities($_POST['Label']); $field3 = htmlentities($_POST['DocumentEncryption']); $field4 = htmlentities($_POST['DocumentStatus']); $field5 = htmlentities($_POST['DocumentType']); $field6 = htmlentities($_POST['DocumentSubType']); $field7 = htmlentities($_POST['DocumentOwner']); $field8 = htmlentities($_POST['DocumentIdent']); $field9 = htmlentities($_POST['DocumentLocation']); // Preparation de la sélection $Sel = ""; if(!empty($_POST['Ident'])) // on demande la liaison aux dossiers { // vérification que le dossier existe et récupération du label $Req = "SELECT * FROM Dossiers where Ident = :Ident"; $Stmt = $bdd->prepare($Req); $Stmt->bindParam(':Ident', $field1); $Data =$Stmt->execute(); $Data = $Stmt->fetch(); if(!empty($Data)) $_SESSION['Dossier'][0] = $field1; // Initialisation de la pile de recherche $_SESSION['Dossier' else $message .= " Sorry but the input for dossier ".$field1. " is not recognized by the system "; // $Data empty donc dossier inconnu dans le système } echo "Child Dossier ",$_POST['ChildDossier'] ; if ($_POST['ChildDossier']==1) // la demande concerne tous les dossiers "child" ( ceux dont le dossier parent == $_POST['Ident']) { // vérification que des dossiers "child" existent et récupération de leurs Ident $ReqChild = "SELECT Ident FROM Dossiers where DossierParent = :Ident"; $Stmt = $bdd->prepare($ReqChild); $Stmt->bindParam(':Ident', $field1); $DataChild =$Stmt->execute(); $DataChild = $Stmt->fetchall(); if(!empty($DataChild)) // construire une array $_SESSION['Dossier'] avec tous Ident et Label des dossiers "child" de ce dossier. l'élément "0" de l'array est $_POST['Ident'] { foreach ($DataChild as $RowDossier) { $_SESSION['Dossier'][] =$RowDossier['Ident'] ; $Stmt = $bdd->prepare($ReqChild); $Stmt->bindParam(':Ident', $RowDossier['Ident']); $DataSubChild =$Stmt->execute(); $DataSubChild = $Stmt->fetchall(); if(!empty($DataSubChild)) { foreach ($DataSubChild as $RowSubDossier) $_SESSION['Dossier'][] = $RowSubDossier['Ident']; } } $DossiersSelected = array_unique($_SESSION['Dossier']) ; $Sel .= " Ident = any ( select DocumentIdent from Dossiers_Documents where DossierIdent in ".$DossiersSelected." )" ; } else $message .= " Sorry but you request all the child dossiers but there isn't any in the system "; } // Constitution de la requête suite if(!empty($_POST['DocumentEncryption'] )) $Sel .= " AND DocumentEncryption = " ."'" . $field3."'"; if(!empty($_POST['DocumentStatus'])) $Sel .= " AND DocumentStatus = "."'" . $field4. "'"; if(!empty($_POST['DocumentType'])) $Sel .= " AND DocumentType = "."'" . $field5. "'"; if(!empty($_POST['DocumentSubType'])) $Sel .= " AND DocumentSubType >= "."'" . $field6. "'"; if(!empty($_POST['DocumentOwner'])) $Sel .= " AND DocumentOwner = "."'" . $field7. "'"; if(!empty($_POST['DocumentIdent'])) $Sel .= " AND DocumentIdent = "."'" . $field8. "'"; if(!empty($_POST['DocumentLocationr'])) $Sel .= " AND DocumentLocation = "."'" . $field9. "'"; // suppression éventuelle du premier "AND" dans la chaîne des critères de sélection cas où Ident Dossier n'est pas utilisé $n = strpos($Sel, "AND"); $n = strpos($Sel, "AND");if(!empty($n) and $n<35) $Sel = substr_replace($Sel,"",$n,3); // exécution de la requête SQL de recherche parmi les Documents sur base des critères sélectionnés if($Sel !=="") { $Req = "Select * from Documents where ".$Sel ; echo $Req; $Stmt = $bdd->prepare($Req); $_SESSION['Data'] =$Stmt->execute(); $_SESSION['Data'] = $Stmt->fetchall(); // Documents sélectionnés $DocumentNbr = count($_SESSION['Data']); if($DocumentNbr !==0) { lstDocument($_SESSION['Data'],$DocumentNbr); } else $message .= "Your selection doesn't give any results"; } else // il n'y a aucune sélection alors que le bouton submit a été cliqué { $message .= "Please fill in at least one criteria"; } }
Partager