problème de structure de site... =>ancres

ViPHP
ViPHP | 3607 Messages

17 mai 2006, 11:29

bonjour à tous!
je me trouve actuellement dans une impasse, je suis en train de créer un petit carnet d'adresse, stocker dans une bdd etc...
j'affiche les adresses 10 par 10, avec une flèche pour changer la partie LIMIT de la requête, je passe ainsi de LIMIT 0,10 à LIMIT 10,10, etc
mon problème vient des ancres, chaque affichage posséde une ancre avec son id.
Lorsque j'ajoute une adresse ou en modifi une, je redirige vers la page index.php#idenregistrement...
seulement, l'ancre n'est pas forcément présente dans la page vu qu'il y a le LIMIT x,10...
ma question est, est-il possible avec une requête sql de déterminier la position d'un résultat pour pouvoir influer sur le LIMIT...
si j'ai pas été clair demandez des précisions...
merci d'avance :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 mai 2006, 11:53

hum... tu dois pouvoir faire un select pour compter le nombre d'enregistrements qui précèdent celui que tu viens d'insérer, dans l'ordre d'affichage ? Quelque chose du genre :

Code : Tout sélectionner

SELECT COUNT(*) FROM maTable WHERE monLibelle < 'nomUtilisateur'
Tu peux ainsi en déduire le début de ton limit en arrondissant à la 10aine inférieur...

ViPHP
ViPHP | 3607 Messages

17 mai 2006, 12:15

oui c'est bien ça que je veu, mais comment est-ce que je fait pour récupérer la valeur de count?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 mai 2006, 12:23

Ben comme pour n'importe quelle requête :)
$rs = mysql_query("SELECT COUNT(*) AS nb FROM ...") or die (...);
$row = mysql_fetch_assoc($rs);
echo $row['nb'];
pis ensuite tu peux faire un 10 * floor($row['nb'] / 10) pour avoir la 10aine inférieure du limit :)

ViPHP
ViPHP | 3607 Messages

17 mai 2006, 12:30

houlala je pige plus rien là... :-(
obn je détail un peu, mon ancre se fait par rapport à l'id de l'enregistrement,
donc ce que je comprend pas c'est quoi mettre après le WHERE, ma requête éxécutée sur la page ou je redirige est la suivante:

Code : Tout sélectionner

SELECT * FROM `carnet` ORDER BY `nom` LIMIT x,y
et là jevois plus du tt pour ta requête

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 mai 2006, 12:46

Ton ancre est l'id ok, mais c'est sur le critere nom que tu tris les éléments pour les afficher par page. En fait ce qu'il te faut rechercher c'est la position de l'enregistrement que tu viens d'enregistrer lorsque tu ordonnes ta liste pour l'afficher par page. Quand tu sais quelle position il occupe, tu peux en déduire la page que tu dois ouvrir :)

Le but de ma requête est de déterminer cette position :

Code : Tout sélectionner

SELECT COUNT(*) AS nb FROM carnet WHERE nom < 'nomUtilisateurInséré'
va compter le nombre d'utilisateur dont le nom se trouve avant "nomUtilisateurInséré" (à remplacer naturellement par le nom de l'utilisateur que tu viens d'insérer) dans l'ordre alphabétique

A partir de ça, tu peux donc déterminer la page (s'il y en a 46, c'est donc à partir de l'enregistrement 40 que tu dois afficher) et ainsi avoir ton "x" :)

ViPHP
ViPHP | 3607 Messages

17 mai 2006, 12:51

alors là je commence à comprendre, le problème, c'est que j'ai plusieurs nom identiques, alors pour contrer ça je peut faire comme ça?

Code : Tout sélectionner

SELECT COUNT(*) AS nb FROM carnet WHERE `nom` < 'nomUtilisateurInséré' AND `prenom` < 'prenomUtilisateurInséré' AND etc ORDER BY `nom`

ViPHP
ViPHP | 3607 Messages

18 mai 2006, 17:52

bon alors je reviens avec du concret, j'ai créer une petite fonction qui retourne le paramètre à passer à LIMIT, mais bon ça marhce pas,
je précise que le nombre d'affichage par page est modifiable via les options, et est donc contenu dans $adresses_par_page
voici la fonction:
function ancres_limites($id,$adresses_par_page,$connexion){
	$rs = mysql_query("SELECT COUNT(*) AS nb FROM `carnet` WHERE `id`< '".$id."'  ORDER BY `nom`",$connexion);
	$row = mysql_fetch_assoc($rs);
	return $adresses_par_page * floor($row['nb'] / $adresses_par_page);
}
ça marche jamais, j'essaye de bidouiller l'expression après le return, mais un coup ça marche un coup ça marche pas suivant l'id que je transmet :cry:

ViPHP
ViPHP | 3607 Messages

19 mai 2006, 15:24

Bon ben finallement j'ai réussit, c'était la requête qu'était pas bonne, voici la requête corrigée:

Code : Tout sélectionner

SELECT COUNT(*) AS nb FROM `carnet` WHERE `nom`<= 'xxxxx' AND `id`!= xx ORDER BY `nom` ASC
par contre est-ce que c'est possible de ne sélectionner que l'id, pour que le code aille plus vite....?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

19 mai 2006, 15:52

Ben dans cette requête tu ne selectionnes rien, tu ne fais que compter.
Tu peux bien sur faire un "SELECT COUNT(id) ...", ca reviendra au même au niveau résultat, mais la commande count(*) étant l'instruction sql la plus optimisée, je ne suis pas sur que tu y gagnes beaucoup en performance de ce côté là...

Le problème de performances viendront selon moi d'avantage de la condition " nom < '...' ", vu qu'il est obligé de parser toute la table pour les comparer... p'tet qu'un index la rendrait plus performante ?

ViPHP
ViPHP | 3607 Messages

19 mai 2006, 15:55

j'y connais pas grand chose (et même rien) en index...
qu'est-ce qu'il faudrait faire...?