sélection exclusive sur une requête search

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : sélection exclusive sur une requête search

par medseaweb » 26 juin 2008, 17:38

Bonjour et merci à tous j'ai trouvé la solution
cela me permet d'avoir des requêtes plus cohérentes
roland

par Shrell » 25 juin 2008, 09:11

Dans ce cas, il faut utiliser les expressions régulières de début et de fin de mot, à savoir [[:<:]] et [[:>:]], qui au contraire de %, marcheront qu'il y ait un espace ou non avant. Cependant ils ne trouveront pas le cas abcdMNOPwxyz

par caroube » 25 juin 2008, 09:03

Visiblement Coppermine stocke une série de mots clés. Il faut comprendre comment fonctionne le LIKE.
LIKE 'abcd%' : teste une chaîne qui commence par abcd.
LIKE '%wxyz" : teste une chaîne qui finit par wxyz
LIKE '%mnop%' : teste une chaîne qui contient mnop

Mais l'espace est également un caractère
LIKE '%mnop%' trouvera la chaîne 'abcd mnop wxyz', mais également la chaîne 'abcdmnopwxyz'
Si tu veux que ça ne retrouve que les mots complets, il faut donc tester avec l'espace LIKE '% mnop %'

Sauf ... que bien sûr, ça ne marche que si le mot est au milieu et pas au début ou à la fin. En effet, si tu cherches '% abcd %' et que ta chaîne contient 'abcd mnop wxyz', rien ne sera renvoyé car il n'y a pas d'espace avant le abcd. Idem pour '% wxyz %'.

Plusieurs solutions s'offrent à toi.
1) Travailler avec du fulltext. Il faut indexer les champs susceptibles d'être l'objet de la requête et modifier la syntaxe de la requête.
2) rajouter des espaces avant ou après les chaînes. Ceci ne peut pas être fait dans la table, car le type de données varchar supprime les espaces avant et après. Mais cela peut-être fait dans la requête.

Code : Tout sélectionner

"CONCAT(' ', $param, ' ') LIKE '% $word %'";
Ceci résoud le problème dans un premier temps, mais de manière très basique. Mais il y a plein de cas qui ne fonctionneront pas
1) l'utilisateur tape un mot au masculin, mais c'est le féminin qui est stocké dans la base ou un mot au singulier, mais c'est le pluriel qui est stocké dans la base.
2) l'utilisateur tape deux mots : 'voiture super' et la base de ne contient que l'un des deux, ou les deux mots mais dans un autre ordre, ou les deux mots mais séparés par un troisième, ...

par medseaweb » 24 juin 2008, 11:39

Bonjour,
j'ai enfin trouvé la ligne de code qui m'interpelle!

Code : Tout sélectionner

if (in_array($param, $allowed))$fields[] = "$param LIKE '%$word%'";
sauf qu'en enlevant les % je n'ai plus de résultat
j'ai tout essayé

Code : Tout sélectionner

if (in_array($param, $allowed))$fields[] = "$param = '$word'"; ..// if (in_array($param, $allowed))$fields[] = "$param LIKE '$word%'"; ..// if (in_array($param, $allowed))$fields[] = "$param LIKE '%$word'"; ..//
seule la solution

Code : Tout sélectionner

LIKE '%$word%'";
fonctionne
un dernier coup de pouce?
merci d'avance
roland

par caroube » 23 juin 2008, 15:38

Le résultat de l'argument search est stocké ici
if (isset($_GET['search'])) { 
    $USER['search']['search'] = $_GET['search']; 
} 
Il n'est pas utilisé dans ce fichier, donc il est utilisé dans une fonction stockée dans un autre fichier.
Il faut donc que tu regardes dans les autres fichiers de Coppermine dans quelle fonction est déclarée $USER en global et ensuite où est utilisé $USER['search']['search'].

par medseaweb » 23 juin 2008, 15:19

bonjour,
merci pour la réponse.
J'utilise une base de donnée Coppermine ou je modifie certaines choses au niveau des fichiers PHP pour avoir le résultat que j'escompte. Tu peux voir la base de donnée sur http://bluemarineweb.eu/Medseaweb/medseaweb.html
Je n'ai pas pu appliquer ta solution car je n'ai pas trouvé dans le fichier thumbnails.php (ci dessous) qui est à priori utilisé par ma requête.
Si une autre possibilité te saute aux yeux... merci d'avance
Cordialement
roland


Code : Tout sélectionner

<?php /************************* Coppermine Photo Gallery ************************ Copyright (c) 2003-2006 Coppermine Dev Team v1.1 originally written by Gregory DEMAR This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. ******************************************** Coppermine version: 1.4.4 $Source: /cvsroot/coppermine/stable/thumbnails.php,v $ $Revision: 1.16 $ $Author: gaugau $ $Date: 2006/02/24 13:30:07 $ **********************************************/ /** * Coppermine Photo Gallery 1.4.4 thumbnails.php * * This file generates the data of thumbnails for all the albums and metalbums, * the actual display is handled by the display_thumbnails and then in-turn * theme_display_thumbnail function * * @copyright 2002-2006 Gregory DEMAR, Coppermine Dev Team * @license http://opensource.org/licenses/gpl-license.php GNU General Public License V2 * @package Coppermine * @version $Id: thumbnails.php,v 1.16 2006/02/24 13:30:07 gaugau Exp $ */ /** * * @ignore */ define('IN_COPPERMINE', true); define('THUMBNAILS_PHP', true); /** * * @ignore */ define('INDEX_PHP', true); require('include/init.inc.php'); if (!USER_ID && $CONFIG['allow_unlogged_access'] == 0) { $redirect = $redirect . "login.php"; header("Location: $redirect"); exit(); } if ($CONFIG['enable_smilies']) include("include/smilies.inc.php"); function thumb_get_subcat_data($parent, &$album_set_array, $level) { global $CONFIG; $result = cpg_db_query("SELECT cid, name, description FROM {$CONFIG['TABLE_CATEGORIES']} WHERE parent = '$parent'"); if (mysql_num_rows($result) > 0) { $rowset = cpg_db_fetch_rowset($result); foreach ($rowset as $subcat) { $result = cpg_db_query("SELECT aid FROM {$CONFIG['TABLE_ALBUMS']} WHERE category = {$subcat['cid']}"); $album_count = mysql_num_rows($result); while ($row = mysql_fetch_array($result)) { $album_set_array[] = $row['aid']; } // while } if ($level > 1) thumb_get_subcat_data($subcat['cid'], $album_set_array, $level -1); } } /** * Main code */ if (isset($_GET['sort'])) $USER['sort'] = $_GET['sort']; if (isset($_GET['cat'])) $cat = (int)$_GET['cat']; if (isset($_GET['album'])) $album = $_GET['album']; if (isset($_POST['search'])) { // find out if a parameter has been submitted at all $allowed = array('title', 'caption', 'keywords', 'owner_name', 'filename', 'pic_raw_ip', 'pic_hrd_ip', 'user1', 'user2', 'user3', 'user4'); foreach ($allowed as $key) { if (isset($_POST[$key]) == TRUE) { $_POST['params'][$key] = $_POST[$key]; } } $USER['search'] = $_POST; $album = 'search'; } if (isset($_GET['search'])) { $USER['search']['search'] = $_GET['search']; } if (isset($_GET['page'])) { $page = max((int)$_GET['page'], 1); } else { $page = 1; } $breadcrumb = ''; $breadcrumb_text = ''; $cat_data = array(); $lang_meta_album_names['lastupby'] = $lang_meta_album_names['lastup']; $lang_meta_album_names['lastcomby'] = $lang_meta_album_names['lastcom']; if (is_numeric($album)) { $result = cpg_db_query("SELECT category, title, aid, keyword, description, alb_password_hint FROM {$CONFIG['TABLE_ALBUMS']} WHERE aid='$album'"); if (mysql_num_rows($result) > 0) { $CURRENT_ALBUM_DATA = mysql_fetch_array($result); $actual_cat = $CURRENT_ALBUM_DATA['category']; $CURRENT_ALBUM_KEYWORD = $CURRENT_ALBUM_DATA['keyword']; breadcrumb($actual_cat, $breadcrumb, $breadcrumb_text); $cat = - $album; } } elseif (isset($cat) && $cat) { // Meta albums, we need to restrict the albums to the current category if ($cat < 0) { $result = cpg_db_query("SELECT category, title, aid, keyword, description, alb_password_hint FROM {$CONFIG['TABLE_ALBUMS']} WHERE aid='" . (- $cat) . "'"); if (mysql_num_rows($result) > 0) { $CURRENT_ALBUM_DATA = mysql_fetch_array($result); $actual_cat = $CURRENT_ALBUM_DATA['category']; $CURRENT_ALBUM_KEYWORD = $CURRENT_ALBUM_DATA['keyword']; } $ALBUM_SET = 'AND aid IN (' . (- $cat) . ') ' . $ALBUM_SET; breadcrumb($actual_cat, $breadcrumb, $breadcrumb_text); $CURRENT_CAT_NAME = $CURRENT_ALBUM_DATA['title']; $CURRENT_ALBUM_KEYWORD = $CURRENT_ALBUM_DATA['keyword']; } else { $album_set_array = array(); if ($cat == USER_GAL_CAT) $where = 'category > ' . FIRST_USER_CAT; else $where = "category = '$cat'"; $result = cpg_db_query("SELECT aid FROM {$CONFIG['TABLE_ALBUMS']} WHERE $where"); while ($row = mysql_fetch_array($result)) { $album_set_array[] = $row['aid']; } // while if ($cat >= FIRST_USER_CAT) { $user_name = get_username($cat - FIRST_USER_CAT); $CURRENT_CAT_NAME = sprintf($lang_list_categories['xx_s_gallery'], $user_name); } else { $result = cpg_db_query("SELECT name FROM {$CONFIG['TABLE_CATEGORIES']} WHERE cid = '$cat'"); if (mysql_num_rows($result) == 0) cpg_die(CRITICAL_ERROR, $lang_errors['non_exist_cat'], __FILE__, __LINE__); $row = mysql_fetch_array($result); $CURRENT_CAT_NAME = $row['name']; } thumb_get_subcat_data($cat, $album_set_array, $CONFIG['subcat_level']); // Treat the album set if (count($album_set_array)) { $set = ''; foreach ($album_set_array as $album_id) $set .= ($set == '') ? $album_id : ',' . $album_id; $ALBUM_SET .= "AND aid IN ($set) "; } breadcrumb($cat, $breadcrumb, $breadcrumb_text); } } pageheader(isset($CURRENT_ALBUM_DATA) ? $CURRENT_ALBUM_DATA['title'] : $lang_meta_album_names[$album]); if ($breadcrumb) { if (!(strpos($CONFIG['main_page_layout'], "breadcrumb") === false)) { theme_display_breadcrumb($breadcrumb, $cat_data); } theme_display_cat_list($breadcrumb, $cat_data, ''); } /** * Function to draw the password box if the album is password protected */ function form_albpw() { global $lang_thumb_view, $CURRENT_ALBUM_DATA; $login_falied = starttable('-1', $lang_thumb_view['enter_alb_pass'], 2); if (isset($_POST['validate_album'])) { $login_failed = '<tr><td class="tableh2" colspan="2" align="center"> <span style="color:red">'.$lang_thumb_view['invalid_pass'].'</span></td></tr> '; } if (!empty($CURRENT_ALBUM_DATA['alb_password_hint'])) { echo <<<EOT <tr> <td colspan="2" align="center" class="tableb">{$CURRENT_ALBUM_DATA['alb_password_hint']}</td> </tr> EOT; } echo <<<EOT $login_failed <tr> <form method="post" action=""> <input type="hidden" name="validate_album" value="validate_album"/> <td class="tableb" width="40%">{$lang_thumb_view['pass']}: </td> <td class="tableb" width="60%"><input type="password" class="textinput" name="password" /></td> </tr> <tr> <td class="tablef" colspan="2" align="center"><input type="submit" class="button" name="submit" value={$lang_thumb_view['submit']} /> </form> </tr> EOT; endtable(); } $valid = false; //flag to test whether the album is validated. if ($CONFIG['allow_private_albums'] == 0 || !in_array($album, $FORBIDDEN_SET_DATA)) { $valid = true; } elseif (isset($_POST['validate_album'])) { $password = $_POST['password']; $sql = "SELECT aid FROM " . $CONFIG['TABLE_ALBUMS'] . " WHERE alb_password='$password' AND aid='$album'"; $result = cpg_db_query($sql); if (mysql_num_rows($result)) { if (!empty($_COOKIE[$CONFIG['cookie_name'] . '_albpw'])) { $albpw = unserialize($_COOKIE[$CONFIG['cookie_name'] . '_albpw']); } $albpw[$album] = md5($password); $alb_cookie_str = serialize($albpw); setcookie($CONFIG['cookie_name'] . "_albpw", $alb_cookie_str); get_private_album_set($album); $valid = true; } else { // Invalid password $valid = false; } } else { $sql = "SELECT aid FROM " . $CONFIG['TABLE_ALBUMS'] . " WHERE aid='$album' AND alb_password != ''"; $result = cpg_db_query($sql); if (mysql_num_rows($result)) { // This album has a password. // Check whether the cookie is set for the current albums password if (!empty($_COOKIE[$CONFIG['cookie_name'] . '_albpw'])) { $alb_pw = unserialize($_COOKIE[$CONFIG['cookie_name'] . '_albpw']); // Check whether the alubm id in the cookie is same as that of the album id send by get if (isset($alb_pw[$album])) { $sql = "SELECT aid FROM " . $CONFIG['TABLE_ALBUMS'] . " WHERE MD5(alb_password)='{$alb_pw[$album]}' AND aid='{$album}'"; $result = cpg_db_query($sql); if (mysql_num_rows($result)) { $valid = true; //The album password is correct. Show the album details. get_private_album_set(); } } } } else { // Album with no password. Might be a private or normal album. Just set valid as true. $valid = true; } } $META_ALBUM_SET = $ALBUM_SET; //temporary assignment until we are sure we are keeping the $META_ALBUM_SET functionality. CPGPluginAPI::filter('post_breadcrumb',null); if (!$valid) { form_albpw(); } else { display_thumbnails($album, (isset($cat) ? $cat : 0), $page, $CONFIG['thumbcols'], $CONFIG['thumbrows'], true); } pagefooter(); ob_end_flush(); ?>

par Cyrano » 21 juin 2008, 22:52

Sans voir la requête SQL que tu exécutes, ce sera difficile de te répondre de façon appropriée.

Mais sommairement, il y a des chances pour que tu aies mis par exemple

Code : Tout sélectionner

... LIKE '%bon%' ...
Et dans ce cas le résultat est normal : le "%" remplace n'importe quel caractère, donc les termes incluant le mot clé vont tous être sortis.

Il manquerait un paramètre dans ton url indiquant par exemple un choix "commençant par", "contenant", "se terminant par" ou "terme exact" Et dans ce cas, tu pourrais dynamiquement modifier la requête :

Code : Tout sélectionner

... LIKE 'bon%' ... // commençant par ... LIKE '%bon%' ... // contenant ... LIKE '%bon' ... // se terminant par ... = 'bon' ... // terme exact

sélection exclusive sur une requête search

par medseaweb » 21 juin 2008, 18:57

Bonjour,
débutant en php j'ai inclue dans ma page html une recherche dans ma base de donnée de mots clés avec search exemple ci-dessous):

<option value="http://www.medseaweb.eu/cpg145/thumbnai ... search=bon">
Bon</option>

mais cette formulation me sort tout les mots clés avec "bon" mais également "bonnard", "bonne" etc...
si je pouvais avoir la solution
merci d'avance
roland