Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/08/2006, 23h37   #1
Nouveau Membre du Club
 
Avatar de Angelik
 
Inscription : août 2006
Messages : 217
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : août 2006
Messages : 217
Points : 31
Points : 31
Par défaut [Conception] Recherche interne+résultats

Je sollicite encore votre aide et vais encore abuser de votre temps afin que vous m'orientiez sur une piste

Toujours concernant mon application membres et département, j'aimerais à partir d'une saisie cette fois que l'internaute puisse taper un chiffre entre 1 et 100 par exemple et que les résultats s'affichent.

Exemple : si je tape 41, j'aimerais que la 41ème fiche membre apparaisse suivie des 10 suivantes (c a d 42,43,44,...,51)

Pour l'instant avec ce que j'ai mis en place, c a d une recherche par 'id' , si je tape 2 , la fiche 2 apparaît ainsi que ... la 12, la 22, 32 ... ainsi que toute celle avec un chiffre 2 au lieu d'afficher la 2, la 3,4,5,6,...,12

Voici mon code pour la saisie :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
<?php
include "configuration.php";
include "page_haut.inc";
$query = mysql_query("SELECT * FROM $mbmembres");
 ?>
 
<form action="resultats.php" method="post" target="main">
  <p>
    <table border="0">
  </p>
  <tr>
      <td valign=top>Aller au membre N°
          <input type='text' size="10" name='word'>
          <input name="submit" type='submit' value='OK'>
      </table>

Concernant ma page de résultat voici mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
<?php
 
include "configuration.php";
 
	if (!empty($word)) {
 
 
		$search = mysql_query("SELECT * FROM $mbmembres WHERE id LIKE '%$word%' LIMIT 0,100") or die ("ERROR:" . mysql_error());
		$num = mysql_num_rows($search);
 
if ($num == 0) {
 
while ($row = mysql_fetch_row($search)) { 
 
echo "<tr>"; 
echo "$img<td><b><center></td>"; 
 
}
 
?>
Merci d'avance
Angelik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 23h59   #2
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Si tu fais :
Code :
WHERE id LIKE '%$word%'
et que $word contient 2, la requête te renvoie toutes lignes où l'id contient 2.

Si tu veux récupérer les lignes où l'id est 2 et +, il faut le faire avec l'opérateur > et non LIKE.
Et bien sûr ne pas oublier le "ORDER BY id " pour s'assurer que les lignes soient ordonnées :
Code :
WHERE id >= %$word ORDER BY id LIMIT 0,10
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 00h22   #3
Nouveau Membre du Club
 
Avatar de Angelik
 
Inscription : août 2006
Messages : 217
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : août 2006
Messages : 217
Points : 31
Points : 31
Je viens de modifier mon code comme tu me l'as indiqué ci-dessus, mais les résultats s'affichent de 1 à 10 sans prendre en compte l'id que je rentre...
J'ai peut être pas fais ce qu'il fallait ?

Voici mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
<?php
 
include "configuration.php";
 
	if (!empty($word)) {
 
 
		$search = mysql_query("SELECT * FROM $mbmembres WHERE id >= '%$word' ORDER BY id LIMIT 0,10") or die ("ERROR:" . mysql_error());
		$num = mysql_num_rows($search);
 
if ($num == 0) {
 
while ($row = mysql_fetch_row($search)) { 
 
echo "<tr>"; 
echo "$img<td><b><center></td>"; 
 
}
 
?>
Angelik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 00h36   #4
Inactif
 
Avatar de Kerod
 
Inscription : septembre 2004
Messages : 11 753
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 11 753
Points : 14 585
Points : 14 585
Moi je dirais que délimiter la recherche dans le where. Par exemple, tu tapes 41 tu fais ton where comme ceci :
Code :
WHERE nomduchamp >= 41 AND nomduchamp <= 41 +10
Tiens il faudrait tester que les 10 prochains existent.

Hum il faudrait vérifier si un fonction n'existe pas déjà
Kerod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 00h46   #5
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Citation:
Envoyé par Angelik
Je viens de modifier mon code comme tu me l'as indiqué ci-dessus, mais les résultats s'affichent de 1 à 10 sans prendre en compte l'id que je rentre...
J'ai peut être pas fais ce qu'il fallait ?
Oui tu as laissé un % ==> MySQL tente de convertir ta chaîne en entier (eh oui en laissant les ' ', ça oblige une conversion) ==> il n'y arrive pas ==> 0

Citation:
Envoyé par Kerod
Tiens il faudrait tester que les 10 prochains existent.

Hum il faudrait vérifier si un fonction n'existe pas déjà
Oui, une seule suppression et ça ne marche plus avec le +10
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 00h56   #6
Nouveau Membre du Club
 
Avatar de Angelik
 
Inscription : août 2006
Messages : 217
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : août 2006
Messages : 217
Points : 31
Points : 31
J'ai du mal à comprendre pourquoi le code ci dessous me renvoi les résultats avec toutes les fiches où le 2 apparaît par exemple
Code :
$search = mysql_query("SELECT * FROM $mbmembres WHERE id LIKE '%$word%' LIMIT 0,10") or die ("ERROR:" . mysql_error());
et que le code de Biglo ci-dessous me renvoi tous les résultats de 0 à 10 sans prendre en compte l'id préalablement renseigné...

Code :
$search = mysql_query("SELECT * FROM $mbmembres WHERE id >= '%$word%' LIMIT 0,10") or die ("ERROR:" . mysql_error());


lol jai posté en même temps que toi ma réponse Biglo... Je m'empresse de réctifier
Angelik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 00h59   #7
Inactif
 
Avatar de Kerod
 
Inscription : septembre 2004
Messages : 11 753
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 11 753
Points : 14 585
Points : 14 585
Tiens tu peux aussi utiliser le BETWEEN qui renvoie les valeurs comprises entre deux limites
Kerod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 01h18   #8
Nouveau Membre du Club
 
Avatar de Angelik
 
Inscription : août 2006
Messages : 217
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : août 2006
Messages : 217
Points : 31
Points : 31
J'ai rectifié mon code en supprimant les ' et % ...Effectivement maintenant ça marche !

Citation:
Tiens tu peux aussi utiliser le BETWEEN qui renvoie les valeurs comprises entre deux limites
c'est à dire ?

Sinon, je me permets de vous demander une dernière chose [sans ré-ouvrir un post] concernant l'ouverture aléatoire de fiches 'membre'

Concrètement, comment faire pour afficher 10 fiches aléatoires qui se suivent? Par exemple : Quelle méthode employée pour afficher les fiches 55,56,57,...,65 et en raffraîchissant la page obtenir 4,5,6,...,14 ou encore 62,63,64,...,72

Toujours sur la base de ce code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
 
include "configuration.php";
 
	if (!empty($word)) {
 
 
		$search = mysql_query("SELECT * FROM $mbmembres WHERE id LIKE '%$word%' LIMIT 0,100") or die ("ERROR:" . mysql_error());
		$num = mysql_num_rows($search);
 
if ($num == 0) {
 
while ($row = mysql_fetch_row($search)) { 
 
echo "<tr>"; 
echo "$img<td><b><center></td>"; 
 
}
 
?>
Merci d'avance
Angelik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 01h30   #9
Inactif
 
Avatar de Kerod
 
Inscription : septembre 2004
Messages : 11 753
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 11 753
Points : 14 585
Points : 14 585
Voici un exemple avec between :
Code :
SELECT column_name FROM table_nameWHERE column_nameBETWEEN value1AND value2
Kerod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 01h31   #10
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Citation:
Envoyé par Angelik
Sinon, je me permets de vous demander une dernière chose [sans ré-ouvrir un post] concernant l'ouverture aléatoire de fiches 'membre'

Concrètement, comment faire pour afficher 10 fiches aléatoires qui se suivent? Par exemple : Quelle méthode employée pour afficher les fiches 55,56,57,...,65 et en raffraîchissant la page obtenir 4,5,6,...,14 ou encore 62,63,64,...,72
Là il vaut mieux garder le même code (avec le <=) et générer un identifiant aléatoire pour $word. Le problème c'est que ce nombre doit être compris entre 1 et MAX(id). Tu peux le faire en SQL :

Code :
SELECT FLOOR(1 + RAND() * MAX(id)) FROM ta_table;
Le problème c'est qu'il n'y aucune assurance pour qu'il y ait au moins 10 enregistrements où l'id est >= à ce nombre aléatoire.
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 01h33   #11
Inactif
 
Avatar de Kerod
 
Inscription : septembre 2004
Messages : 11 753
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 11 753
Points : 14 585
Points : 14 585
Aléatoire : moi pour ne pas se casser la tête je ferai avec le meme systeme que la pagination...Je récupère tout et je joue avec le start qui serait aléatoire et on garde le limit 10.

En gros
Code :
select * from tatable LIMIT $start, 10
avec le start créée par rand()
Kerod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 01h40   #12
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
En effet, c'est beaucoup plus simple et on peut facilement avoir toujours 10 enregistrements (en supposant que la table contienne au moins 10 lignes).
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 01h46   #13
Inactif
 
Avatar de Kerod
 
Inscription : septembre 2004
Messages : 11 753
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 11 753
Points : 14 585
Points : 14 585
Oui il y a cette condition, mais au final ca fonctionnera toujours
Kerod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 12h10   #14
Nouveau Membre du Club
 
Avatar de Angelik
 
Inscription : août 2006
Messages : 217
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : août 2006
Messages : 217
Points : 31
Points : 31
Bonjour

Citation:
Le problème c'est qu'il n'y aucune assurance pour qu'il y ait au moins 10 enregistrements où l'id est >= à ce nombre aléatoire.
En fait cela ne me pose pas de problème au sein de mon application. J'ai testé ce code ci-suit

Code :
1
2
3
 
$search = mysql_query("SELECT FLOOR(1 + RAND() * MAX(id)) FROM mbmembres LIMIT 0,10") or die ("ERROR:" . mysql_error());
		$num = mysql_num_rows($search);
Le problème c'est qu'il m'affiche seulement 1 fiche aléatoire. De plus, l'image et le lien de la fiche, ne s'affiche pas.Ce dernier problème doit être dû à mon select. De ce fait j'ai tenté sans succès :

Code :
1
2
search = mysql_query("SELECT FLOOR(1 + RAND() * MAX(id)), sid, url,  photo FROM mbmembres LIMIT 0,10") or die ("ERROR:" . mysql_error());
		$num = mysql_num_rows($search);
Je me documente aussi sur ta méthode Kerod et écume les sites pour rassembler des éléments sur la fonction rand () où

Mais pour l'instant mes tentatives restent peu probantes ...
Angelik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 12h29   #15
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Salut,

La requête que je t'ai donnée ne retourne pas le résultat que tu désires mais seulement un nombre "aléatoire" compris entre 1 et Max(id). Après avoir obtenu ce nombre, il faut refaire ta requête normal mais en y insérant ce nombre aléatoire.

Mais il vaut mieux prendre la solution de Kerod. Seule différence pour le nombre aléatoire : il doit être compris entre 0 et le nombre d'enregistrements de ta table.

Code :
1
2
3
4
5
6
7
$res = mysql_query("SELECT FLOOR(RAND() * COUNT(*)) FROM mbmembres");
$row = mysql_fetch_array($res);
$start = $row[0]; // Ici tu as le nombre aléatoire
 
$search = mysql_query("SELECT sid, url,  photo FROM mbmembres ORDER BY sid LIMIT $start, 10 ") or die ("ERROR:" . mysql_error());
 
...
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2006, 12h43   #16
Nouveau Membre du Club
 
Avatar de Angelik
 
Inscription : août 2006
Messages : 217
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : août 2006
Messages : 217
Points : 31
Points : 31
Problème résolu ! Merci de votre aide qui me permet de progresser ! @bientôt
Angelik est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h06.


 
 
 
 
Partenaires

Hébergement Web