Help : afficher les résultats SQL pour AU MOINS un des mots

Petit nouveau ! | 8 Messages

06 nov. 2009, 13:26

Salut à tous,

Merci pour votre site.

Je suis débutant php et je galère.

j'ai une page.php?room=53 par exemple, avec dedans :

Code : Tout sélectionner

<?php mysql_connect("localhost", "***", "***"); mysql_select_db("mydb"); $reponse = mysql_query("SELECT * FROM room WHERE chat_group_id =2 AND room_id ='$_GET[room]'"); while ($donnees = mysql_fetch_array($reponse) ) { ?> <?php echo $donnees['name']; ?><br /> <?php } mysql_close(); ?>
les echo m'affiche une room (son name) et autres infos...
j'aimerais afficher en dessous de ce code les rooms similaires à la 1re ci-dessus.
C'est-à-dire dont le "name" ressemble au "name" de la room ci-dessus. (au moins un des mots est identique)

Avez-vous une idée de comment je peux m'y prendre ?

D'avance je vous remercie de votre éventuelle aide ;)

ViPHP
ViPHP | 1136 Messages

06 nov. 2009, 13:33

Il te faut donc une seconde requête , de recherche FULLTEXT ( MATCH() ) ( mettre le champ "name" en FULLTEXT ).

http://dev.mysql.com/doc/refman/5.0/en/ ... guage.html

Tu auras ainsi les rooms qui colle plus ou moins au nom de ta room principale ...

Good luck ,
Ch.

Petit nouveau ! | 8 Messages

06 nov. 2009, 13:42

j'ai rien compris :D
mais je vais essayer de chercher avec ce que tu as dis ;)
(étant donné que je suis débutant, je ne vois pas trop comment écrire cette seconde requête (au niveau de la syntaxe)

merci déjà de ton renseignement (rapide en plus)

++

ViPHP
ViPHP | 1136 Messages

06 nov. 2009, 13:55

Dans u premier temps , tu n'es pas obligé de fermer ouvrir les tags php constamment ..

je dis ça , c'est plus pour l'aspect pratique et la lisibilité ..
<?php
mysql_connect("localhost", "***", "***");
mysql_select_db("mydb");
$reponse = mysql_query("SELECT * FROM room WHERE chat_group_id =2 AND room_id ='".mysql_real_escape_string($_GET[room])."'");
while ($donnees = mysql_fetch_array($reponse) )
{

    echo $donnees['name'];

   //ici ta deuxiéme requete avec match 
   $sql = "SELECT room.*, MATCH (room.name) AGAINST (\"".mysql_real_escape_string($donnees['name'])."\")  FROM room WHERE MATCH (room.name) AGAINST (\"".mysql_real_escape_string($donnees['name'])."\") ";
   $reponse2    =    mysql_query($sql)or die(mysql_error());
   while($otherRomms = mysql_fetch_array($reponse2,MYSQL_ASSOC){
        echo $otherRooms['name']."<br>";
   }

}
mysql_close();
?>

Voilà , un truc du genre .... ( c'est dans des exemple comme ça que l'on voit que l'on s'habitue vite à l'autocompléxion .. )


Good luck , ch ...

Petit nouveau ! | 8 Messages

06 nov. 2009, 14:15

wow... ça c'est du codage.
J'ai rien compris non plus, mais j'ai carrément copier coller ton code et j'obtiens ça :

Mon SalonCan't find FULLTEXT index matching the column list

Pour te prouver que je fais pas mon teubé, j'ai quand même analyser ton code, réparé ton ) manquant, etc...
mais pour le resultat qui ne marche pas, je ne comprends pas...
Pourtant dans ma DB, j'ai beaucoup de room qui contiennent le mot "salon", or là, il ne m'en trouve aucun ! :/

edit : j'ai cherché la définition de "autocomplexion" mais je n'ai rien trouvé non plus :non:

Mammouth du PHP | 568 Messages

06 nov. 2009, 14:37

C'est parceque dans ta base de données tu dois ajouter un index de type FULLTEXT,

si tu utilise PhpMyadmin, il te faut sélectionner la table cible puis en dessous de la structure de la base tu a un bloc Index, là il te faut Créer un index sur 1 colonne(s) de type FULLTEXT sur le champ cible.

ViPHP
ViPHP | 1996 Messages

06 nov. 2009, 15:07

Bonjour à tous,

au code de stopher je rajouterai un test numeric (comme ta requete fais intervenir la supervariable $_GET) :
De plus des requêtes alors que la pile mysql n'est pas vide, cela alourdi la charge serveur : stocke d'abord tes variables dans un tableau temporaire puis ensuite, relance une requête.
<?php
$room = mysql_real_escape_string($_GET["room"]);
$tab_temp = array();
mysql_connect("localhost", "***", "***");
mysql_select_db("mydb");
$requete = "SELECT * FROM room WHERE chat_group_id =2 AND room_id ='".$room."'";
if (is_numeric($room))
{
  $reponse = mysql_query($requete);
  if (mysql_num_rows ($reponse) == 0)
     die ("pas de résultats");
  else
  {
    while ($donnees = mysql_fetch_assoc($reponse) )
    {
       $tab_temp = $donnees['name'];
    }
  }


  //ici ta deuxiéme requete avec match
  if (is_array($tab_temp) && !empty($tab_temp))
  {
    foreach ($tab_temp as $name)
    {
    $name = addslashes($name);
    $sql = "SELECT room.*, MATCH (room.name) AGAINST (\"".$name."\")  FROM room WHERE MATCH (room.name) AGAINST   (\"".$name."\") ";
       $reponse2    =    mysql_query($sql)or die(mysql_error());
       while($otherRomms = mysql_fetch_assoc ($reponse2) 
       {
            echo $otherRooms['name']."<br>";
       }
    }
  }
}
else
{
  echo "$_GET['room'] pas numeric";
}
mysql_close();
?>
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

ViPHP
ViPHP | 1136 Messages

06 nov. 2009, 15:24

@juuu :

bon , je pense que tu as toutes les clefs en main avec les réponses de Yosh et Aureusms

@Aureusms :
De plus des requêtes alors que la pile mysql n'est pas vide, cela alourdi la charge serveur : stocke d'abord tes variables dans un tableau temporaire puis ensuite, relance une requête.
Et bien merci pour l'info , je ne savais pas non plus .. :-)

ViPHP
ViPHP | 1996 Messages

06 nov. 2009, 15:29

C'est du vécu malheureusement... :D
Je pense néanmoins que cela dois dépendre du type de base utilisée (innodb, myisam,...)
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Petit nouveau ! | 8 Messages

06 nov. 2009, 16:02

salut les gars
merci pour vos réponses

J'ai bien créer l'index dans phpmyadmin :

Code : Tout sélectionner

ALTER TABLE `room` DROP INDEX `name` , ADD FULLTEXT `name` ( `name` )
le résultat me donne le nom de la 1re room.... et rien d'autres
(alors que comme je le disais, j'ai pleinnnns de rooms qui porte au moins un des mots de la 1re) :(

je continue de chercher de mon côté.... (mais en vain)

ViPHP
ViPHP | 1136 Messages

06 nov. 2009, 16:05

Maintenant que tu as changer ton champ en FULLTEXT , ta requête ( avec match ect ) ne fonctionne pas ?

Petit nouveau ! | 8 Messages

06 nov. 2009, 16:17

elle ne donne pas d'erreur, mais elle me donne QUE le 1er echo, le second ne donne rien
(je parle de ton code)
celui de Aureusms étant bugé au niveau syntaxe, et meme débuggé il m'affiche
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'a23camch'@'localhost' (using password: NO) in /home/a23camch/www/fr/chat.php on line 110

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/a23camch/www/fr/chat.php on line 110
21pas numeric
bref, tant pis pour les problème de surcharge sql, je préfère m'attarder sur ton code qui ne bug pas... mais il ne marche pas :(

ViPHP
ViPHP | 1136 Messages

06 nov. 2009, 16:22

Heu là , c'est un probléme de connexion à ta base de données ...
Access denied for user 'a23camch'@'localhost' (using password: NO) in /home/a23camch/www/fr/chat.php
es tu certains d'être bien connecté ?

Compléte
mysql_connect("localhost", "***", "***");
Comme ceci :
$link = mysql_connect("localhost", "mysql_user", "mysql_password")
    or die("Impossible de se connecter : " . mysql_error());
echo 'Connexion réussie';
En remplaçant mysql_user et mysql_password bien entendu ...

C'est assez étonnant que cette erreur arrive que maintenant ... :-k

Petit nouveau ! | 8 Messages

06 nov. 2009, 16:28

oui oui mais c particulier, l'utilisateur n'est pas en root, par sécurité....

ton code marche bien, et plusieurs de mes codes aussi, j'arrive bien à me connecter et récupérer des infos, mais celui de Aureusms non, mais ce n'est pas important

Ce qui m'intéresse c'est de savoir pourquoi ton code me retourne le 1er echo (c'est-à-dire le name de la room) mais pas le 2nd... c'est-à-dire aucun name similaire :(

Petit nouveau ! | 8 Messages

06 nov. 2009, 16:39

@stopher : pourquoi ne pas faire un truc du genre :

une recherche WHERE name like %$donnees['name']%

mais 1 : je ne connais pas du tout la syntaxe pour l'écrire
et 2 : le LIKE retourne les salons EXACTEMENT pareil, or je veux AU MOINS un de mots pareils

:/