Compter trier données recherche interne mysql

cdurlephp -  
 cdurlephp -
Bonjour à tous,

débutant en php, j'ai besoin d'une aide.
J'essaie de faire un moteur de recherche en php intégré à mon site avec une base MySQL.
La base est créée et j'ai commencé la page de traitement des données.

Voici mon code :

<!-- php codepart 1 here -->
<?php require("libs/dbconnect.php");
 ?>
<!-- php codepart 1 end -->

<?PHP
echo $value;
$sql ='SELECT * FROM `commerces`'; 
$page_text_query = mysql_query($sql) or die("Query failed");
$cont = mysql_fetch_array($page_text_query);
echo $cont['Nom'];
echo '<br />';
echo $cont['Rue'];
echo '<br />';
echo $cont['Telephone'];
echo '<br />';
echo $cont['Fax'];
?>


Ce code fonctionne mais n'affiche qu'un résultat de recherche, le premier.
J'aurais souhaité savoir comment récupérer tous les résultats et les trier.
Je suppose qu'il faut faire une boucle avec if et else mais je ne connais pas la syntaxe de ce type de code.
J'ai regardé quelques tutos mais c'est un peu confus pour moi.

Pourriez-vous m'indiquer la marche à suivre ?
Avez-vous à disposition un exemple ?

Merci.

40 réponses

Dalida Messages postés 7114 Statut Contributeur 923
 
ajoute un
echo( $valeur );
avant d'exécuter la requête et teste avec des caractères accentuées qu'on voit ce qu'il y a dedans !
0
cdurlephp
 
Salut, je fais le point :

- Il y a des entités html dans ma bdd et même des liens. Ex :
<a href="truc.html">am&eacute;lie</a>

- La recherche trouve des résultats mais pas pour amélie par exemple.
- Avec htmlentities normalement ce qui est transmis par POST a ses accents qui se tranforment en entités html non?


Avec ce code :


?PHP
$valeur = htmlentities( $_POST['valeur'] , ENT_NOQUOTES , 'UTF-8' );
$valeur = mysql_escape_string ( $valeur );
$sql = "SELECT * FROM commerces WHERE MATCH (Nom,Rue,Telephone,Activites) AGAINST ('$valeur')"; 
$page_text_query = mysql_query($sql) or die('Query failed');
while ($cont = mysql_fetch_array($page_text_query, MYSQL_BOTH)) {
printf ('<br />');
printf ($cont['Nom']);
printf ('<br />');
printf ('<span class="search">');
printf ($cont['Rue']);
printf ('<br />');
printf ($cont['Telephone']);
printf ('<br />');
printf ($cont['Fax']);
printf ('</span>');
printf ('<br />');
}
?>


La recherche ne trouve rien.

Dans MySQL :

L'interclassement exact de ma table est utf8_unicode_ci et le type MyISAM c'est important ?
Le type de chaque champ est text et l'index est en fulltext pour permettre une recherche plein texte.

Merci de ta patiente.
0
Dalida Messages postés 7114 Statut Contributeur 923
 
bis repetita placent !

mais tu as regardé ce qu'il y a dans la variable ???
faut savoir si ta requête est mal construite ou si c'est la logique qui foire.
0
cdurlephp
 
je ne peux plus poster ? test test
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cdurlephp
 
ok je viens de m'apercevoir qu'il y a deux pages sur le POST ;.)

Un echo ($valeur);

me renvoit amélie et pas
am&eacute;lie
.
Je pense donc que j'ai fait une faute, le texte n'est pas converti ?
0
Dalida Messages postés 7114 Statut Contributeur 923
 
ah ben le voila le binz !
0
cdurlephp
 
Mais maintenant que j'ai rajouté les 3 dernières lignes de code que tu m'as donnée :

$valeur = htmlentities( $_POST['valeur'] , ENT_NOQUOTES , 'UTF-8' );
$valeur = mysql_escape_string ( $valeur );
$sql = "SELECT * FROM commerces WHERE MATCH (Nom,Rue,Telephone,Activites) AGAINST ('$valeur')"; 


Il trouve société, amélien, château mais pas amélie... Strange isn't it ?

Aurais-tu un conseil ?
0
Dalida Messages postés 7114 Statut Contributeur 923
 
oui !

fais un
echo( $sql );

et teste ta requête (avec "amélie" comme mot) dans PHPMyAdmin.
0
cdurlephp
 
Bien vu, c'est intéressant!!
My SQL ne retourne aucun enregistrement pour amélie.
Pourtant c'est la ville concernée par ce site et ce mot y figure dans chaque enregistrement.

Ce n'est pas trop grave car normalement ce n'est pas un critère de recherche que les gens vont utiliser.
Toutefois, service ne marche pas ni méli mélo etc... Des mots oui d'autres non.

Mystère et boule de gomme...
0
Dalida Messages postés 7114 Statut Contributeur 923
 
je te conseille d'utiliser cette technique dès que tu as un soucis avec MySQL, ça peut éviter des heures de prise de tête.

mais il vaut mieux trouver le pourquoi, sinon cela veut tout simplement dire que ta recherche n'est pas fiable et dans ce cas mieux ne pas en avoir du tout.

l'interclassement est en 'ci' (insensible à la casse) ?
dans ta BDD tu as bien 'am&eacute;lie' et pas 'am&ecute;lie' ou 'am&eacute,lie' ?
0
cdurlephp
 
Non, dans ma bdd j'ai am´lie alors c'est peut-être pour ça, désolé.

alors mon code est faux ?
0
Dalida Messages postés 7114 Statut Contributeur 923
 
tu dois avoir 'am&acute;lie'

(comme CCM interprète il faut remplacer le & de l'entité par sa propre entité &amp;)

donc, il suffit de corriger ta BDD.
0
cdurlephp
 
En fait, pour être clair :

il faut que je remplace

am&eacute;lie


par

'am&eacute;lie'


Parce-que sur la bdd j'ai déjà
am&eacute;lie


Sinon je comprend plus...
0
Dalida Messages postés 7114 Statut Contributeur 923
 
ah ben non alors !!!
ne tiens pas compte des apostrophes c'est juste pour délimiter.

j'avais compris que tu avais 'am´lie' donc avec un accent aigu mais sans le 'e' c'est à dire 'am&acute;lie' donc je te disais de le corriger par le 'é' c'est à dire '&eacute;'.

mais si la valeur est bonne, pas de soucis de ce côté là.
0
cdurlephp
 
Ok, donc je reviens au départ ça reconnait certains caractères mais pas les autres c'est du pur délire.

As-tu un ultime conseil ?
0
Dalida Messages postés 7114 Statut Contributeur 923
 
la casse, l'interclassement est-il en 'ci' ?

y a-t-il quelque chose de particulier pour 'amélie' (début de chaine, mot seul…) ?

as-tu essayé avec 'LIKE' et les '%' ?

as-tu bien respecté les conditions d'utilisation de la recherche en 'fulltext' ?

as-tu essayé 'AGAINST ('$valeur' WITH QUERY EXPANSION)' ?

ou si tu as une idée de ce que je pourrais faire à manger ce soir !
-:oD
0
Dalida Messages postés 7114 Statut Contributeur 923
 
ou alors avec REGEXP
0
cdurlephp
 
Spaghettis bolo ?
Simple, mais bon ?

Je consulte ton lien.
Oui avec LIKE et % j'ai essayé mais ça indique toujours Query failed.
Avec Query expansion ça m'affiche tout le contenu de la table.

Ou des légumes ? C'est bon pour la santé ;-))

Merci à toi je suis paumé mais je me soigne.
0
Dalida Messages postés 7114 Statut Contributeur 923
 
faut réussir à faire tourner le 'LIKE'.
tu as fait 'echo()' plus test PHPMyAdmin ?

peux tu nous coller le message d'erreur ?

(pour l'instant ce sera pâté maison/vin rouge…)
0
cdurlephp
 
désolé de te faire partager ma vie mais je vais chercher ma copine à la gare!
Et là je ne suis plus sur le même ordinateur.
J'enverrai le code demain ou.. la solution peut-être si un miracle se produit (j'espère!!!).

Html et css je connaissais mais php je n'avais jamais voulu m'y mettre.
En plus en couplant avec MySQL = mélange détonant.

Tiens alors : http://blogueuz.com/billet_pates-au-vin-rouge_cuisinegirls.html
Bon c'est un blog de filles mais t'avais pas qu'à choisir ce pseudo.
0
Dalida Messages postés 7114 Statut Contributeur 923
 
pâté

t'as oublié le e accent aigu, décidement…

-:oDDD
0
cdurlephp
 
salut,

alors maintenant j'ai fait quelques modifs :

- je n'ai plus d'entités html dans ma bdd car j'ai lu dans la doc SQL que c'était déconseillé pour la recherche;
- Tous les mots sont trouvés sauf amélie, mais les mots commençant par am... sont dans la liste des stopwords dans la doc MySQL.
- L'affichage du coup fait des points d'interrogation à la place des lettres mais je suis déjà content que tout marche.

Je vous tiens au jus !!!
0
cdurlephp
 
hello tous voilà mon code finalement, avec le formulaire sur la même page, (presque terminé, manque si la recherche comporte plus d'un mot) si ça peut aider quelqu'un :

<div id="category">
<form action="#formulaire" method="post">
<p>Recherche</p>
<div class="input1"><input name="valeur" type="text" />
</div><div class="input2"><input type="submit" name="submit" value="Envoyer"/></div>
</form>
</div>
 <div style="position:absolute; left: 242px; top: 669px; "><a href="contact.html">
<img src="img/spacer.gif" width="80px" height="19px" border="0"/></a></div>
<div style="position:absolute; left: 330px; top: 669px;"><a href="mention.html"><img src="img/spacer.gif" width="161px" height="20px" border="0"/></a></div>
<br /><br /><br /><br />
<div name="formulaire" style="position:absolute; left:220px; width:600px; line-height:20px;">
<?PHP
$valeur = ( $_POST['valeur'] );
$replace = mysql_escape_string ( $valeur );
if ($valeur=="edf" || $valeur=="edf/gdf" || $valeur=="gdf"|| $valeur=="edf gdf" || $valeur=="edf-gdf"){
	$valeur="edfedf";
}
$sql = "SELECT * FROM commerces WHERE MATCH (Nom,Rue,Telephone,Activites) AGAINST ('\%$valeur%' IN BOOLEAN MODE) ORDER BY Nom" ;
$page_text_query = mysql_query($sql) or die('Query failed');
$cpt = mysql_num_rows($page_text_query);
$rpp = 3;	
$nbpages = ceil($cpt / $rpp);	
$cpt2 = 0;	
$cpt3 = 0;	
$cpt4 = 1;	

printf ('<br />');

if  (strlen($valeur)==0 && $cpt == 0 ) {
print ("Veuillez entrer un terme de recherche");
}
else if(strlen($valeur)<=3 && $cpt == 0 ) {
print ("<p>Il y a $cpt r&eacute;sultat &agrave; votre demande</p>");
printf ('<div style="position:absolute; left="500px">');
printf ('Vos termes de recherche doivent contenir:');
printf ('<br />');
printf ('- Au moins 4 lettres ');
printf ('</div>');
}



else {
		print ("<p>Il y a $cpt r&eacute;sultat(s)</p>" );
			if ($nbpages > 1) {
				 echo "<p>Page :";
				 $stylelien1=" style=\"font-weight: bold;\"";
					 for ($i=1; $i<=$nbpages; $i++) {
						 echo " <a href=\"#\" id=\"lienpage".$i."\" ".$stylelien1."onClick=\"Javascript:affichePage(".$i.")\">".$i."</a>";
						 $stylelien1="";
				}
				echo "</p>";
}
		while ($cont = mysql_fetch_array($page_text_query)) {
 
		if ($cpt2 == 0) {
			 if ($cpt4 == 1) {
				 echo "<div id=\"page1\" style=\"display: inline;\">";
				} 
				else {
					
				 echo "<div id=\"page".$cpt4."\" style=\"display: none;\">";
			}
				echo "<table border=\"0\"><tr><td><b>Nom</b></td><td><b>Adresse</b></td><td><b>T&eacute;l&eacute;phone</b></td><td><b>Fax</b></td></tr>";
			$cpt4++;
		 }
		  $cpt2++;
		  $cpt3++;
		  echo "<tr><td>".$cont['Lien']."</td><td>".htmlentities($cont['Rue'])."</td><td>".$cont['Telephone']."</td><td>".$cont['Id']."</td></tr>";
		  if ($cpt2 == $rpp || $cpt3 == $cpt) {
			 echo "</table></div>";
			$cpt2 = 0;
			}


	}
}
printf ('<br />');printf ('<br />');?>
0