Affichage requête plutôt étrange...

Résolu
caccia Messages postés 95 Date d'inscription   Statut Membre Dernière intervention   -  
caccia Messages postés 95 Date d'inscription   Statut Membre Dernière intervention   -
Salut à tous!

Je suis actuellement en stage dans une sympathique entreprise parisienne, laquelle m'a confié la lourde tâche de développer un intranet permettant l'accès à une base de donnée. Jusqu'ici, me direz-vous, rien d'extraordinaire!
Et pourtant...
Je planche en ce moment même sur le développement d'un petit moteur de recherche. Le principe est simple et ô combien éculé: il s'agit pour l'utilisateur d'entrer un mot clé, de choisir dans quel domaine il veut que sa recherche soit effectuée (le recherche peut s'orienter vers plusieurs types de documents possibles mais là n'est pas mon problème) et de valider. En gros, un de nos bons vieux formulaires comme on les aime.
Jusqu'ici, toujours rien d'extraordinaire, ajouterez-vous, encore une fois, impatient d'aider la communauté tout entière, ici-même représentée en ma propre personne.

C'est au niveau du php que les problèmes commencent! Voici ma fonction:

<?php
function recherche_table($doc,$cle){
include('connection.php');

$retour = mysql_query("SELECT COUNT(*) AS nbre_entrees FROM ".$doc."");
$donnees = mysql_fetch_array($retour);
$answer = mysql_query("SELECT * FROM ".$doc."");
$donnees = mysql_fetch_array($answer);
$nbr = count($donnees);
$nbr = ($nbr / 2)-1;
$fin_requete = '';

for($j = 0; $j<=$nbr; $j++ ){
$nom = mysql_field_name($answer, $j);
if($fin_requete == ''){
$fin_requete .= " `".$nom."` LIKE '%".$cle."%'";
}
else{
$fin_requete .= " OR `".$nom."` LIKE '%".$cle."%'";
}
}


$requete = "SELECT * FROM ".$doc." WHERE ".$fin_requete." ";
$reponse = mysql_query("SELECT * FROM `arkadoc`.`".$doc."` WHERE ".$fin_requete." ");
$donnees = mysql_fetch_array($reponse) ;
$nb_results = mysql_num_rows($reponse);
//?><p>Il y a <?php echo $nb_results;?> resultats </p><?php
while ($donnees = mysql_fetch_array($reponse)){
echo 'salut!';
for($j = 0; $j<=$nbr; $j++ ){
$nom = mysql_field_name($reponse, $j);
echo $nom;?><br /><?php echo $donnees[$j]; ?><br /><?php
}
}
}

?>

Tout ce joli bazar affiche des réponses. Cool me direz-vous... Problème: malgré le mysql_fetch_array et le while, impossible d'afficher autre chose que la première de toutes les réponses et ce malgré le fait qu'elles soient nombreuses (les réponses évidemment...).
Cela fait un petit bout de temps que je profite allègrement des solutions sans m'être inscris et aujourd'hui j'ai franchis le pas! Quelqu'un saura t-il ne pas me faire regretter ce choix?

Merci d'avance à tous!

6 réponses

le père
 
Bonjour

Curieux, moi je dirais au contraire que tu n'affiches jamais la première réponse. En effet, tu fais un $donnees = mysql_fetch_array($reponse) ; avant le while. Donc tu as déjà 'consommé' la première réponse.
Il y a plusieurs trucs bizarres dans ton script, mais aucun qui explique à première vue qu'il ne balaye pas toutes les bonnes réponses - sauf la première
0
caccia Messages postés 95 Date d'inscription   Statut Membre Dernière intervention   16
 
Qu'est ce qu'il y a d'étrange dans mon code (hors mis ce dont on parle...)? Comme j'ai un peu appris le php "sur le tas" j'avoue mal maîtriser certaines choses et je fais plus du bricolage que réellement de la programmation...

(en tout cas merci pour le coup de main... Je vais tester ça tout de suite!)

EDIT: c'était bien ça... en fait je n'avais même pas fait attention que c'était là. Je l'avais utilisé pour un test antérieur et comme ça fait quelques heures maintenant que je suis derrière mon écran, je ne suis plus très lucide.

Cependant, ça tient toujours pour la correction des "bizareries" dans mon code!
0
le père
 
$donnees = mysql_fetch_array($answer);
suivi de
$nbr = ($nbr / 2)-1;

Pourquoi as-tu divisé par 2 ? Tu n'avais qu'à faire un mysql_fetch_assoc($answer) et tu aurais eu directement le bon nombre d'éléments. Car mysql_fetch_array (sans options) te rend un array avec tous les champs en double : une fois avec un indice numérique, et une fois avec le nom du champ.
Regarde dans la doc PHP les différences entre mysql_fetch_array, mysql_fetch_row et mysql_fetch_assoc

Et pour balayer tous les éléments d'un tableau (tel que $donnees) le foreach est nettement préférable :
foreach ($reponse as $champ=>$valeur) echo $nom,'<br />',$valeur,'<br />';
0
caccia Messages postés 95 Date d'inscription   Statut Membre Dernière intervention   16
 
Je suis globalement d'accord en ce qui concerne le "foreach" cependant mon soucis ici était de récupérer le nom des colonnes de la table mysql que j'utilise (d'où le "mysql_field_name" ). La fonction devait être suffisamment générique pour que je puisse m'attaquer à plusieurs tables en faisant passer le nom des tables en variable (ici "$doc")...

C'est pour ces plusieurs raisons que je suis obligé (tout du moins je pense) de faire une boucle précédé, ici, d'un while.
Je vois mal comment utiliser le foreach dans mon cas...

En tout cas, merci beaucoup pour toutes ces précisions, le père! Si je croyais en toi, j'allumerais un cierge en ton nom...
0

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

Posez votre question
le père
 
mon soucis ici était de récupérer le nom des colonnes de la table mysql que j'utilise Justement, tu les récupères !
remplace

for($j = 0; $j<=$nbr; $j++ ){
$nom = mysql_field_name($reponse, $j);
echo $nom;?><br /><?php echo $donnees[$j]; ?><br /><?php
}
par
foreach ($donnees as $nom=>$valeur) echo $nom,'<br />',$valeur,'<br />';

j'avais appelé la même variable une fois $champ et une fois $nom dans mon message précédent, c'était une erreur. De plus, j'avais confondu $donnees et $reponse, ça ne risquait pas de marcher tel quel.
0
caccia Messages postés 95 Date d'inscription   Statut Membre Dernière intervention   16
 
$donnees = mysql_fetch_array($answer);
suivi de
$nbr = ($nbr / 2)-1;

Je divise par deux car j'ai besoin d'un array pour pouvoir utiliser le mysql_field_name. Mais peut-être que ce n'est plus la peine puisque je peux éventuellement utiliser le foreach, une nouvelle fois.

Quoi qu'il en soit, merci pour tout!
0