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

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;
		}
Maintenant je dois faire des filtres ou la chaine de caractères renseigner ne doit pas apparaitre dans le fichier texte de fin.
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 ...


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;
		}
Le code en gras represente les modifications de la fonction .
voila (desolé pour les fautes d'orthographe.)