Bonjour ,
je développe depuis un moment maintenant, une application web pour les employés de ma boite . Cette apllication a pour but de télécharger un fichier texte avec des messages (logs) qui sont stockés sur une base de données.
pour pouvoir telecharger ce fichier texte,il faut remplir plusieurs informations , dans ces informations il faut renseigner des filtres composer d'une chaine de caractères qui permettent de rétrécir la recherche. A ce jour j'ai uniquement des filtres qui permetent de Sortir tous les messages avec la chaine de caractères renseigner on peut avoir jusqu'à 5 FILTRES. Ici seulement les filtres nous interressent ($condition = operateur ogique ET & OU ) du coup on ne s'ocupe pas de ($codesgtqs,$type,$date1,$date2)
Ma fonction qui permet de sortir uniquement les messages qui contient la chaine de caractères renseigner dans le filtre
Maintenant je dois faire des filtres ou la chaine de caractères renseigner ne doit pas apparaitre dans le fichier texte de fin.
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 public function getMessageListFiltered($codesgtqs,$type,$date1,$date2,$condition,array $pattern,){ if((!empty($pattern) &&($condition == 'AND' || $condition == 'OR')) ){ $tab=array_values($pattern); $query="SELECT m.id,m.ne_id,m.date,m.type,m.log FROM message m JOIN ne n ON n.id=m.ne_id WHERE codesgtqs=? AND type=? AND date BETWEEN ? AND ? AND ("; for($i=0;$i<count($tab);$i++){ $str=preg_replace('/\\\\/','\\\\\\',mb_strtoupper($tab[$i],'UTF-8')); $str=preg_replace('/%/','\%',$str); $str=preg_replace('/_/','\_',$str); $tab[$i]="%".$str."%"; if($i==count($tab)-1){ $query.="upper(log) LIKE ?)"; }else{ $query.="upper(log) LIKE ? $condition "; } } $query.=" ORDER BY date;"; $stmt= $this->_db->prepare($query); $stmt->bindParam(1,$codesgtqs); $stmt->bindParam(2,$type); $stmt->bindParam(3,$date1); $stmt->bindParam(4,$date2); for($i=0;$i<count($tab);$i++){ $stmt->bindParam($i+5,$tab[$i]); } $data=array(); if($stmt->execute()){ while(($row=$stmt->fetch())!==false){ $data[]=new Message($row); } } return $data; } return null; }
Exemple de requete SQL demander :
SELECT m.log FROM message m JOIN ne n on n.id=m.ne_id WHERE n.codesgtqs='AB17' AND m.type='UNS' AND date BETWEEN '2013-06-01' AND '2013-06-28' AND (m.log LIKE '%DAL%' OR m.log LIKE '%FAL%')AND (m.log NOT LIKE '%!!%' AND m.log NOT LIKE '%IND%');
seulement la partie en gras de la requete nous interresse DAL et FAL sont des exemple de chaine de caractères renseigner pour les filtres "contient" .
!! et IND sont des exemple de chaine de caractères pour les filtres "ne contient pas" cette requete fonctionne , seulement je dois l'integrer dans la fonction du dessus.
j'ai commencer par faire ceci: Mais ca ne fonctionne pas ...
Le code en gras represente les modifications de la fonction .
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 public function getMessageListFiltered($codesgtqs,$type,$date1,$date2,$condition,array $pattern,$operateur2,array $pattern2){ if((!empty($pattern) &&($condition == 'AND' || $condition == 'OR')) || (!empty($pattern2) &&($operateur2 == 'AND' || $operateur2 == 'OR'))){ $tab=array_values($pattern); $tab2=array_values($pattern2); $query="SELECT m.id,m.ne_id,m.date,m.type,m.log FROM message m JOIN ne n ON n.id=m.ne_id WHERE codesgtqs=? AND type=? AND date BETWEEN ? AND ? AND ("; for($i=0;$i<count($tab);$i++){ $str=preg_replace('/\\\\/','\\\\\\',mb_strtoupper($tab[$i],'UTF-8')); $str=preg_replace('/%/','\%',$str); $str=preg_replace('/_/','\_',$str); $tab[$i]="%".$str."%"; if($i==count($tab)-1){ $query.="upper(log) LIKE ?)"; }else{ $query.="upper(log) LIKE ? $condition "; } } $query.="AND ("; for($i=0;$i<count($tab2);$i++){ $str=preg_replace('/\\\\/','\\\\\\',mb_strtoupper($tab2[$i],'UTF-8')); $str=preg_replace('/%/','\%',$str); $str=preg_replace('/_/','\_',$str); $tab[$i]="%".$str."%"; if($i==count($tab2)-1){ $query.="upper(log) NOT LIKE ?)"; }else{ $query.="upper(log) NOT LIKE ? $operateur2 "; } } $query.=" ORDER BY date;"; $stmt= $this->_db->prepare($query); $stmt->bindParam(1,$codesgtqs); $stmt->bindParam(2,$type); $stmt->bindParam(3,$date1); $stmt->bindParam(4,$date2); for($i=0;$i<count($tab);$i++){ $stmt->bindParam($i+5,$tab[$i]); } for($i=0;$i<count($tab2);$i++){ $stmt->bindParam($i+5,$tab2[$i]); } $data=array(); if($stmt->execute()){ while(($row=$stmt->fetch())!==false){ $data[]=new Message($row); } } return $data; } return null; }
voila (desolé pour les fautes d'orthographe.)
Partager