C'est bien ce qui etait ecrit dans mon code non ?
Version imprimable
C'est bien ce qui etait ecrit dans mon code non ?
Salut,
C'est exactement ce qui est écrit dans ton code mais j'essaye de comprendre donc j'y apporte des modifications.
En faisant quelques modifications je parvient à obtenir la requête.
La ligne modifiée est :
sachant que la variable $box est obtenue à partir de :Code:$where[] = '(article LIKE "%'.$box.'%" OR Resume LIKE "%'.$box.'%")';
La requête obtenue est:Citation:
$box = $donnees['article'];
Il n'y a pas d'incrémentation des variables car la requête est lancée en dehors de la boucle.Code:SELECT Id, article, Resume, FROM boutique WHERE (article LIKE "%cravate%" OR Resume LIKE "%cravate%") AND (article LIKE "%cravate%" OR Resume LIKE "%cravate%") AND (article LIKE "%cravate%" OR Resume LIKE "%cravate%") AND (article LIKE "%cravate%" OR Resume LIKE "%cravate%") AND (article LIKE "%cravate%" OR Resume LIKE "%cravate%") AND (article LIKE "%cravate%" OR Resume LIKE "%cravate%")
Le résultat de la recherche cravate s'affiche correctement dans le tableau.
Bonjour,
1/ je reviens sur l'expression donnée par sabotage :
qui doit être corrigé en :Code:
1
2
3
4
5 foreach($expressions as $expression) { $where[] = '(article LIKE ? OR Resume LIKE ?)'; $param[] = $expression; $param[] = $expression; }
Explication :Code:
1
2
3
4
5 foreach($expressions as $expression) { $where[] = '(article LIKE ? OR Resume LIKE ?)'; $param[] = '%'.$expression.'%'; $param[] = '%'.$expression.'%'; }
on a 2x $param[] = '%'.$expression.'%'; car dans le $where[] on a 2 "?", qui prennent la même valeur : '%'.$expression.'%' !
2/
Ni "box", ni "article" ne sont des noms pertinents dans le cas présent !Citation:
$box = $donnees['article'];
Il ne faut pas t'étonner de faire des confusions...... :koi:
3/
Comment veux-tu qu'on corrige ton code si tu ne le montres pas ?? :roll:
4/ Que donne var_dump($box); ??
:sm: non mais corrigez moi ne vous genez pas.
Voici le code pour aider, il ne doit pas être très claire mais je débute.
Code:
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129 <?php if($reponse -> rowCount() > 1) { echo '<table style="width:451px"> <tr> <td style="background-color:#000000;border:1px #000000 solid;text-align:center;vertical-align:top;width:150px;height:13px"><span style="color:#FFFFFF;font-family:Arial;font-size:12px;">Article</span></td> <td style="background-color:#000000;border:1px #000000 solid;text-align:center;vertical-align:top;width:214px;height:13px"><span style="color:#FFFFFF;font-family:Arial;font-size:12px;">Résumé</span></td> <td style="background-color:#000000;border:1px #000000 solid;text-align:center;vertical-align:top;width:65px;height:13px"><span style="color:#FFFFFF;font-family:Arial;font-size:12px;">Disponibilité</span></td> <td><img src="../images/option.gif" width="13" height="13"> </td> </tr>'; } else { echo 'pas de données'; } $reponse = $session->query("SELECT article FROM list WHERE id_session = '$mon_id'"); while ($donnees = $reponse->fetch()) { $recherche[] = $donnees['article']; $box = $donnees['article']; var_dump($box); } $expressions = array(); //On determine le type de recherche if(isset($_GET['type'])) { if($_GET['type']=='un')//Un des mots { $type = 1; } elseif($_GET['type']=='tout')//Tout les mots { $type = 2; } else//L'expression exacte { $type = 3; } } else { //type par defaut: L'expression exacte $req_type = $session->query("SELECT type FROM membres WHERE id = $mon_id "); $result_type = $req_type -> fetch(); $type = $result_type['type']; } $operateur = ($type == 1) ? ' OR ' : ' AND '; if ($type == 1 || $type == 2) { // pour les type 1 et 2 on découpe chaque mot foreach($recherche as $mots) { $expressions = array_merge($expressions, explode(' ', $mots)); } } else { // pour le type 3 on cherche le texte entier $expressions = $recherche; } //On determine si on doit surligner les mots dans les resultats if(!isset($_GET['surligner']) or $_GET['surligner']!='true') { $surligner = false; } else { $surligner = true; } var_dump($expressions); foreach($expressions as $expression) { $where[] = '(article LIKE ? OR Resume LIKE ?)'; $param[] = '%'.$expression.'%'; $param[] = '%'.$expression.'%'; } $req = 'SELECT Id, article, Resume, Disponibilte FROM list WHERE ' . implode($operateur, $where); echo $req; $sth = $bdd->prepare($req); $sth->execute($param); while($dnn = $sth->fetch()) { ?> <tr> <td style="background-color:#DCDCDC;border:1px #C0C0C0 solid;text-align:left;vertical-align:top;height:12px"><span style="color:#000000;font-family:Arial;font-size:11px;"><div onClick="window.open('../description.php?Id=<?php echo $dnn['Id'] ?>','','width=600,height=200')"><?php if($surligner)//Si il faut surligner les mots, on les surligne { if($type==3) { echo substr((preg_replace('#('.preg_quote($rec).')#i', '<strong>$1</strong>', $dnn['article'])),0,70);//On surligne l'expression exacte } else { echo substr((preg_replace('#('.str_replace(' ','|',preg_quote($rec)).')#i', '<strong>$1</strong>', $dnn['article'])),0,70);//On surligne les mots cles de la recherche } } else { echo substr(($dnn['article']),0,70);//On ne surligne pas } ?></div></span></td> <td rowspan=2 style="background-color:#DCDCDC;border:1px #C0C0C0 solid;text-align:left;vertical-align:top;height:12px"><span style="color:#000000;font-family:Arial;font-size:11px;"><?php if($surligner)//Si il faut surligner les mots, on les surligne { if($type==3) { echo substr((preg_replace('#('.preg_quote($rec).')#i', '<strong>$1</strong>', $dnn['Resume'])),0,70),'...';//On surligne l'expression exacte } else { echo substr((preg_replace('#('.str_replace(' ','|',preg_quote($rec)).')#i', '<strong>$1</strong>', $dnn['Resume'])),0,70),'...' ;//On surligne les mots cles de la recherche } } else { echo substr(($dnn['Resume']),0,67),'...';//On ne surligne pas } ?></span></td><td style="background-color:#DCDCDC;border:1px #C0C0C0 solid;text-align:center;vertical-align:top;height:12px"><span style="color:#000000;font-family:Arial;font-size:10px;"><?php echo $dnn['Disponibilite']; ?></span> </td></tr> </table>
Pour la modification :
SELECT Id, article, Resume, Disponibilite FROM list WHERE (article LIKE ? OR Resume LIKE ?) AND (article LIKE ? OR Resume LIKE ?)Code:
1
2
3
4
5
6
7
8
9 foreach($expressions as $expression) { $where[] = '(article LIKE ? OR Resume LIKE ?)'; $param[] = '%'.$expression.'%'; $param[] = '%'.$expression.'%'; } $req = 'SELECT Id, article, Resume, Disponibilite FROM liste WHERE ' . implode($operateur, $where); echo $req;
La commande var_dump($box) renvoi:
Code:
1
2
3 array (size=2) 0 => string 'pantalon gris' (length=13) 1 => string 'cravate' (length=7)
Bonjour,
quelques améliorations du code :
1/ Remplace :
Par : (voir switch() PHP)Code:
1
2
3
4
5
6
7
8
9
10
11
12 if($_GET['type']=='un') { $type = 1; } elseif($_GET['type']=='tout') { $type = 2; } else { $type = 3; }
Code:
1
2
3
4
5
6
7
8
9
10
11 switch($_GET['type']) { case 'un': // Un des mots $type = 1; break; case 'tout': // Tout les mots $type = 1; break; default: // expression exacte $type = 3; }
2/ Tu es bien gentil, mais tu ne nous montres pas le résultat de :
3/ Mets des commentaires dans ton code (= explication de l'action de chaque ligne de code !).Code:var_dump($expressions);
Car je ne suis pas sûr que tu comprennes tout ce que tu fais... ni l'enchainement LOGIQUE des actions à faire...:roll:
Notamment : à quoi diable peut bien servir cette requête ??? :koi: (effectuée AVANT le traitement de la recherche de critères...)
Code:
1
2
3
4
5
6
7 $reponse = $session->query("SELECT article FROM list WHERE id_session = '$mon_id'"); while ($donnees = $reponse->fetch()) { $recherche[] = $donnees['article']; $box = $donnees['article']; var_dump($box); }
Salut,
Merci pour l'optimisation du code.
La requête en question (B1) recherche la liste des mots clés enregistrés dans une table en fonction des utilisateurs.
Dans le code initiale (voir début du post), tout le reste du code est intégré dans B1. La seconde requête B2 récupère chaque valeur de B1 pour l'injecter dans B2.
Le résultat de B1 (var_dump($expressions);) dans notre exemple est :
Pantalon gris est injecté dans la requête B2, un résultat est affiché dans une ligne du tableau s'il trouve un résultat. Cravate est ensuite envoyé dans B2 et retourne un résultat dans la seconde ligne du tableau si un résultat est trouvé.Code:
1
2
3 array (size=2) 0 => string 'pantalon gris' (length=13) 1 => string 'cravate' (length=7)
La modification au code fut effectuée suite aux conseils de sabotage pour ne pas imbriquer les deux boucles et permettre plus facilement d'agir sur le nombre de ligne à afficher dans le tableau.
Vois-tu, je modifie le code à la volée pour tenter de résoudre mon problème en fonction de vos conseils. Il ne faut pas hésiter à demander ce dont vous avez besoin pour comprendre.
Il y a de nombreuses options ajoutés car j'ai récupéré ce code sur le Net (affichage gras, recherche sur un mot ou expression) mais se sont des détails. Ce qui m'intéresse c'est la structure à mettre en place pour la gestion des deux requêtes qui doivent au final autoriser le traitement par page.
Le code commenté :
Code:
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130 <?php //S'il y a ou pas des résultats à afficher if($reponse -> rowCount() > 1) { echo '<table style="width:451px"> <tr> <td style="background-color:#000000;border:1px #000000 solid;text-align:center;vertical-align:top;width:150px;height:13px"><span style="color:#FFFFFF;font-family:Arial;font-size:12px;">Article</span></td> <td style="background-color:#000000;border:1px #000000 solid;text-align:center;vertical-align:top;width:214px;height:13px"><span style="color:#FFFFFF;font-family:Arial;font-size:12px;">Résumé</span></td> <td style="background-color:#000000;border:1px #000000 solid;text-align:center;vertical-align:top;width:65px;height:13px"><span style="color:#FFFFFF;font-family:Arial;font-size:12px;">Disponibilité</span></td> <td><img src="../images/option.gif" width="13" height="13"> </td> </tr>'; } else { echo 'pas de données'; } //recherche des mots clés enregistr $reponse = $session->query("SELECT article FROM list WHERE id_session = '$mon_id'"); while ($donnees = $reponse->fetch()) { //tableau des données de la recherche $recherche[] = $donnees['article']; } $expressions = array(); //On determine le type de recherche if(isset($_GET['type'])) { if($_GET['type']=='un')//Un des mots { $type = 1; } elseif($_GET['type']=='tout')//Tout les mots { $type = 2; } else//L'expression exacte { $type = 3; } } else { //type par defaut: L'expression exacte $req_type = $session->query("SELECT type FROM membres WHERE id = $mon_id "); $result_type = $req_type -> fetch(); $type = $result_type['type']; } $operateur = ($type == 1) ? ' OR ' : ' AND '; if ($type == 1 || $type == 2) { // pour les type 1 et 2 on découpe chaque mot foreach($recherche as $mots) { $expressions = array_merge($expressions, explode(' ', $mots)); } } else { // pour le type 3 on cherche le texte entier $expressions = $recherche; } //On determine si on doit surligner les mots dans les resultats if(!isset($_GET['surligner']) or $_GET['surligner']!='true') { $surligner = false; } else { $surligner = true; } var_dump($expressions); foreach($expressions as $expression) { $where[] = '(article LIKE ? OR Resume LIKE ?)'; $param[] = '%'.$expression.'%'; $param[] = '%'.$expression.'%'; } //recherche dans la liste des articles à partir d'un mot clé $req = 'SELECT Id, article, Resume, Disponibilte FROM list WHERE ' . implode($operateur, $where); $sth = $bdd->prepare($req); $sth->execute($param); //Boucle pour afficher les résultats dans le tableau while($dnn = $sth->fetch()) { ?> <tr> <td style="background-color:#DCDCDC;border:1px #C0C0C0 solid;text-align:left;vertical-align:top;height:12px"><span style="color:#000000;font-family:Arial;font-size:11px;"><div onClick="window.open('../description.php?Id=<?php echo $dnn['Id'] ?>','','width=600,height=200')"><?php if($surligner)//Si il faut surligner les mots, on les surligne { if($type==3) { echo substr((preg_replace('#('.preg_quote($rec).')#i', '<strong>$1</strong>', $dnn['article'])),0,70);//On surligne l'expression exacte } else { echo substr((preg_replace('#('.str_replace(' ','|',preg_quote($rec)).')#i', '<strong>$1</strong>', $dnn['article'])),0,70);//On surligne les mots cles de la recherche } } else { echo substr(($dnn['article']),0,70);//On ne surligne pas } ?></div></span></td> <td rowspan=2 style="background-color:#DCDCDC;border:1px #C0C0C0 solid;text-align:left;vertical-align:top;height:12px"><span style="color:#000000;font-family:Arial;font-size:11px;"><?php if($surligner)//Si il faut surligner les mots, on les surligne { if($type==3) { echo substr((preg_replace('#('.preg_quote($rec).')#i', '<strong>$1</strong>', $dnn['Resume'])),0,70),'...';//On surligne l'expression exacte } else { echo substr((preg_replace('#('.str_replace(' ','|',preg_quote($rec)).')#i', '<strong>$1</strong>', $dnn['Resume'])),0,70),'...' ;//On surligne les mots cles de la recherche } } else { echo substr(($dnn['Resume']),0,67),'...';//On ne surligne pas } ?></span></td><td style="background-color:#DCDCDC;border:1px #C0C0C0 solid;text-align:center;vertical-align:top;height:12px"><span style="color:#000000;font-family:Arial;font-size:10px;"><?php echo $dnn['Disponibilite']; ?></span> </td></tr> </table>
Merci
Salut,
Vu qu'il n'y a plus de réponse, j'en conclus que le problème n'est pas simple à résoudre.
Merci pour votre aide et les pistes à creuser.
Willm