Aller au contenu

Sujets conseillés

Posté

Bonjour,

Comme vous pouvez le voir en cliquant sur le bouton WWW ci dessous, je possède un petit site de recherche de personnes. Celui-ci repose sur un petit moteur de recher php mysql. Or, depuis que la recherche se fait sur une jointure sql, ce moteur à tendance à buguer. Je dit "a tendance à buguer" par ce que la recherche fonctionne environ une fois sur trois. Donc, deux fois sur trois, l'erreur suivante apparait.

Warning: mysql_query(): Unable to save result set in /home/ouetu/www/rechercher.php on line 31

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/ouetu/www/rechercher.php on line 32

La requete de recherche ressemble à ça:

$nbq = strlen($q);
$q = strtolower($q);
$q = trim($q);
$mots = str_replace('\'', ' ', $q);
$mots = str_replace(',', ' ', $mots);
$mots = str_replace(':', ' ', $mots);
$mots = str_replace('-', ' ', $mots);
$mots = str_replace('(', ' ', $mots);
$mots = str_replace(')', ' ', $mots);
$tab = explode(' ', $mots);
$nb = count($tab);
$sqlr= "SELECT PR.nom, PR.prenom, PR.pseudo, PA.affectations, PA.message FROM profils PR, parcours PA WHERE (PR.pseudo = PA.pseudo) AND (PR.afficher = 'oui') AND (PR.nom LIKE '%$tab[0]%' OR PR.prenom LIKE '%$tab[0]%' OR PA.affectations LIKE '%$tab[0]%')";
for($i = 1; $i < $nb;$i = $i +1)
{
$sqlr.=" AND (PR.nom LIKE '%$tab[$i]%' OR PR.prenom LIKE '%$tab[$i]%' OR PA.affectations LIKE '%$tab[$i]%')";
}  
///$sqlr.=" ORDER BY PR.nom ASC";
$resr=mysql_query($sqlr, $db);///ligne31
$nbresult=mysql_num_rows($resr);///ligne32

Si quelqu'un avait un tuyau, ça me rendrait bien service. J'ai également pensé au fait que ma requète pouvait être trop longue mais je ne vois pas vraiment comment la simplifier.

Merci d'avance pour vos réponses,

Loïc.

Posté

Il y a fort à parier que ta requète est beaucoup trop longue, ou que la page de résultat générée est trop importante.

Tu devrais, dans un premier temps, t'intéresser à la fonction : mysql_unbuffered_query qui permet de récupérer les résultats, avant que la requète ne soit finie. Ainsi, elle pourra continuer à s'executer, sur le serveur sql, sans mobiliser plus de résultats.

Sinon, la solution est de décomposer ta table, en sous tables, et de recommencer la recherche, dans les sous tables concernées.

Anonymus.

Posté

Merci pour cette réponse,

J'ai remplacé, mysql_query() par mysql_unbuffered_query(). Premier ecueuil: je ne peux plus utiliser mysq_num_rows(). Jusque là, rien de dramatique, je n'afficherai pas le nombre de résultats, c'est tout.

Deuxième ecueuil: l'erreur suivante apparait environ quatre fois sur cinq (pire qu'avant).

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /home/ouetu/www/rechercher.php on line 39

Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /home/ouetu/www/rechercher.php on line 51

Decidement, c'est plus compliqué que je ne pensais. Comment fait donc Mr Google pour chercher dans sa base de donnée avec autant de rapidité ?

Gagnerais-je quelque chose à imbriquer une requète dans une autre pour remplacer la jointure ? (à mon avis non, mais bon...)

Loïc

Posté

Bon.. Laisses tomber mysql_unbuffered_query.

Il faudrait que tu décomposes ta requète. Pour cela, tu peux très bien faire une requète pour chaque count($tab); Tu récupères le résultat des id, et ensuite, tu compares les tableaux que ca te donne, en ne gardant 'que' les id qui sont présents dans tous les tableaux. (l'équivalent du 'AND' de la requète sql).

Cela te fera des requètes beaucoup moins longues, même ca fait beaucoup plus de requètes.

Avec les id récupérées, ensuite, tu va chercher les résultats correspondants.

Anonymus.

Posté

Merci encore pour cette réponse (rapide en plus),

Je crois que j'ai compris le principe de ta technique, le mettre en pratique va être une autre paire de manches.

Je me met au boulot, si quelq'un a d'autres propositions, qu'il n'hésite pas.

Loïc.

Posté

Oulala,

Tu n'aurais pas un petit début de code pour m'orienter un peu parce que là, je rame un peu :wacko: . (je ne suis pas en codeur fou non plus).

Loïc.

Posté

Si, bien sûr.

Sans changer le début du code, ca donnerait ca (la requete ne change pas non plus, seulement la boucle) :

$sqlr= "SELECT PR.nom, PR.prenom, PR.pseudo, PA.affectations, PA.message FROM profils PR, parcours PA WHERE (PR.pseudo = PA.pseudo) AND (PR.afficher = 'oui') AND (PR.nom LIKE '%$tab[0]%' OR PR.prenom LIKE '%$tab[0]%' OR PA.affectations LIKE '%$tab[0]%')";

$nbresult=0;
for($i = 1; $i < $nb;$i = $i +1){
$une_autre_requete = $sqlr." AND (PR.nom LIKE '%$tab[$i]%' OR PR.prenom LIKE '%$tab[$i]%' OR PA.affectations LIKE '%$tab[$i]%')";

///$sqlr.=" ORDER BY PR.nom ASC";
$resr=mysql_query($une_autre_requete, $db);///ligne31
$nbresult += mysql_num_rows($resr);///ligne32

}

Anonymus.

Posté

Merci beaucoup Anonymus.

Je crois que tu va m'en vouloir... je t'ai fait travailler pour rien car je n'ai finalement pas utilisé ta méthode... vraiment désolé :blush:

J'ai décidé de multiplier les champs du formulaire de recherche, ce qui conduit à une requète plus simple et surtout beaucoup plus rapide(cf -http://www.ouetu.com). Je pense que c'est solution plus viable, étant donné le nombre d'inscriptions ajoutées chaque jour.

Merci tout de même pour ta réponse,

Loïc.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...