Bonjour à tous et à toutes,
Je viens vers vous aujourd'hui pour savoir si il est possible de prioriser une colonne d'une table quand un mot est trouvé dedans.
Je m'explique, j'ai un système de recherche sur un site de vente en ligne de cartouche pour imprimante qui fonctionne bien mais que je voudrais améliorer pour qu'il affiche moins de résultat.
Je fait la recherche dans trois colonnes de la table produits (marque, modèle imprimante et référence de la cartouche)
Voici mon problème : si le chercheur écrit "hp" ça va chercher dans les trois colonnes et afficher toutes les lignes ou il y a "hp" dedans car la marque est trouvée dans la colonne marque.
Jusque la tout va bien, maintenant si le chercheur écrit "hp envy 4500" ça va toujours chercher dans les trois colonnes (marque, modèle imprimante et référence de la cartouche) et afficher toutes les lignes ou il y a "envy 4500" trouvé dans la colonne modèle imprimante et aussi hp trouvé dans la colonne marque mais moi je voudrais que la requête n'aille plus chercher dans la colonne des marques à partir du moment ou elle a trouvée quelque chose dans la colonne modèle d'imprimante et n'affiche que les lignes ou il y a "envy 4500".
Est-ce possible ?
Voici mon code
PS : j'ai essayé de faire une requête préparée mais la ça fonctionne plus lol
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 <?php $check = array('produits' => array('marque', 'mod_imprimante', 'ref_origine')); //Connexion à la base de données include('connexion_ajax.php'); $table = (isset($_GET['table']) ? htmlspecialchars($_GET['table']) : ''); $marque = (isset($_GET['marque']) ? htmlspecialchars($_GET['marque']) : ''); $mod_imprimante = (isset($_GET['imprimante']) ? htmlspecialchars($_GET['imprimante']) : ''); $ref_origine = (isset($_GET['ref_origine']) ? htmlspecialchars($_GET['ref_origine']) : ''); $search = (isset($_GET['search']) ? htmlspecialchars($_GET['search']) : ''); if(isset($check[$table]) && in_array($mod_imprimante, $check[$table])){ //Vérification if($table && $mod_imprimante && $search){ $search = strtolower(htmlspecialchars($search)); header("content-type: application/xml"); echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; echo '<suggests>'; $and = 'AND'; $or = 'OR'; $mots = explode(" ", $search); //séparation des mots $nombre_mots = count ($mots); //comptage du nombre de mots $valeur_requete = ''; //tant que le nombre de mots de la recherche est supérieur à celui de la boucle, on continue en incrémentant à chaque fois le nombre de mots for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) { $valeur_requete .= '' . $and .' '.$marque.' LIKE \'%'.$mots[$nombre_mots_boucle].'%\' ' . $or .' '.$mod_imprimante.' LIKE \'%'.$mots[$nombre_mots_boucle].'%\' ' . $or .' '.$ref_origine.' LIKE \'%'.$mots[$nombre_mots_boucle].'%\''; } $valeur_requete = ltrim($valeur_requete,$and); //suppression de AND ou de OR au début de la boucle $query_impr = $bdd_ajax->query('SELECT '.$mod_imprimante.' FROM '.$table.' WHERE aff_recherche = 1 AND ('.$valeur_requete.') GROUP BY '.$mod_imprimante.' ORDER BY '.$mod_imprimante.''); while($data_impr=$query_impr->fetch()) { $string_field[$field_string]=strtolower(stripslashes($data_impr[$mod_imprimante])); $affichage_field[$mod_imprimante] = ucwords($string_field[$field_string]," \t\r\n\f\v'"); echo ' <suggest>'.$affichage_field[$mod_imprimante].'</suggest>'; } echo '</suggests>'; $query_impr->closeCursor(); } } ?>
Merci d'avance pour votre aide.
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 <?php $query_impr = $bdd_ajax->prepare('SELECT '.$mod_imprimante.' FROM '.$table.' WHERE aff_recherche = :aff AND (mod_imprimante LIKE %:mod_imp% OR ref_origine LIKE %:ref_oem% OR marque LIKE %:marq%) GROUP BY mod_imprimante ORDER BY mod_imprimante'); for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) { $query_impr->bindValue('mod_imp', $search, PDO::PARAM_STR); $query_impr->bindValue('ref_oem', $search, PDO::PARAM_STR); $query_impr->bindValue('marq', $search, PDO::PARAM_STR); } $query_impr->bindValue('aff', 1, PDO::PARAM_INT); try { $query_impr->execute(); } catch ( Exception $e ) { echo ''.$e->getMessage().'<br />'; echo ''.$e->getCode(); exit(); } ?>
Partager