| | can93 | Posté le 14/11/2005 @ 19:37 | Astucien
1467 Messages
| Bonjour a tous,
Titre pas tres clair, mais je m'explique mieux :
ID Nom
1 - A
2 - B
3 - C
5 - E
Si je suis sur l'id 3, j'aimerais afficher ce qu'il y a avant et apres, en gros l'article d'avant et celui d'apres..
Par logique je ferais
Avant : ID-1
Actuel : ID
Apres : ID+1
Mais là si je suis au 3e ID et que je veux passer au suivant cela affichera une erreur car l'ID 4 n'existe pas !
Les vides comme cela, viennent de suppressions de lignes.. contrainte obligatoire..
Alors je me demande comment faire.. si il y a une fonction ou un algo pour ça en PHP ?
Pourrait-on deplacer le pointeur par rapport aux lignes listés par une requete, et non pas par Addition ou Soustraction des ID ?
Je trouve pas comment faire..
Merci [smile][chinois]
| | |
| |
| Publicité |
|
| | can93 | Posté le 15/11/2005 à 08:00 | Astucien
1467 Messages
| Je ne pensais pas mes questions aussi compliqués même si je ne les comprends pas..
| | | | | koala01 | Posté le 15/11/2005 à 12:54 | Astucien
4715 Messages
| Salut,
Théoriquement, il ne devrait pas arriver que tu aies des identifiant auto-incrémentés dans lesquels il y aurait des trous… Et si ca arrive, tu risques d'être confronté à des problèmes pour les tables qui sont en relations grace à ces identifiants…
Le principe qui veut qu'une entrée dans une table ne soit pas effacée s'appelle "l'intégrité référencielle"…
Cela signifie simplement qu'il faut faire attention à ne pas supprimer un enregistrement dans une table qui pourrait servir de référence à une dans une autre table (ou bien, tu ne supprimes pas l'enregistrement, ou bien, tu dois veiller à supprimer toutes les références à cet enregistrement dans les autres tables)…
Je vais prendre un exemple relativement simple pour la compréhension…
Imaginons trente secondes que tu aies une table "membre" (pour un forum)…
Chaque membre est identifié par un champs de manière unique (que ce soit un entier auto-incrémenté ou son speudo)
Tu disposes aussi d'une table "message" dont un des champs indiquera forcément…qui l'a écrit et qui prendra la valeur … de l'identifiant unique de la table membre
Si un membre décide de ne plus intervenir sur le forum (ou si les modérateurs décident de le bannir), ce n'est absolument pas une raison pour supprimer le membre car, ou bien on se trouvera avec des messages qui… n'appartiennent plus à personne, ou bien il faudra aussi supprimer tous les messages de ce membre.
Le gros problème, si on supprime les messages du membre, c'est tout simplement que… d'autres gens auront peut être réagi à ses messages…
Supprimer les message de l'ancien membre signifie donc courrir le risque que de nombreuses autres interventions (d'autres personnes) soient "décalées" par rapport au "nouveau fil" du sujet…
Voilà donc pourquoi il est tès largement recommandé de NE PASsupprimer un enregistrement dans une table…
Par contre, rien n'empêche de prévoir un "flag (ou drapeau)" indiquant si l'enregistrement est "actif"(utilisable), ou si au contraire, il est "inactif"(inutilisable)…
Ce principe étant acquis, il est tout à fait possible de s'organiser pour n'obtenir que certains enregistrements bien précis dans une table…
Il y a deux manières de déterminer le(s)champ(s) qui doivent ressortir… Ces deux manières étant complémentaires.
La première étant l'injection d'une condition (qui commence par WHERE (une seule fois, meme s'il y a plusieurs condition) suivit d'un &ventuel terme NOT (qui inverse le reste) et d'un signe d'(in)égalité (<, <=, =, >=, >), ou d'un des termes LIKE 'valeur' ou IN (valeur1,valeur2,valeur3…)) "classique" dans la requete.
La deuxième solution permet de sélectionner un (ou plusieurs) enreigstrement(s) si les conditions ne permettaient pas de n'en obtenir qu'un…
Un exemple tout bête qui fait ressortir plusieurs enregistrements est la requete
[code]SELECT * FROM table[/code]
Il est important de comprendre que cette solution est mise en oeuvre APRES que les enregistrements aient suivi une première sélection basées sur les conditions, et que les identifiants ne jouent plus le moindre role.
Il s'agit "simplement" de rajouter le terme
[code]
LIMIT nombre
ou
LIMIT nombre1, nombre2
[/code]
nombre nombre1 et nombre2 devant etre plus grand ou égaux à 0
La solution n'utilisant qu'un nombre fera ressortir que les (nombre) premiers enregistrements sélectionnés par la requete (ce qui signifie que, meme si une valeur de 0 pour nombre est autorisée, elle ne sert pas à grand chose car ca ferait ressortir … 0 enregistrements, ce qui n'est sans doute pas des plus intéressant[clindoeil])
La solution utilisant deux nombre laissera les (nombre1) premiers enregistrement sur le coté, et sortira les (nombre2) enregistrements suivants (une valeur 0 pour nombre1 permettra donc de récupérer le premier enregistrement, mais, encore une fois, une valeur 0 pour nombre2 n'a qu'un intérêt limité [clindoeil]).
Il va de soi que, si les conditions fournies ne permettent pas de faire ressortir nombre enregistrement ou (nombre1+nombre2) enregistrements, seuls les enregistrements disponibles seront effectivement retournés [clindoeil]
Selon ton exemple, le code
[code]
SELECT * FROM table LIMIT 2,1
[/code]
te renverra donc l'enregistrement 3 - C;
le code
[code]
SELECT * FROM table WHERE ID>3 LIMIT 1
[/code]
te renvoyant quant à lui l'enregistrement 5 - E (du fait qu'il s'agit du premier enregistrement qui est plus grand que 3)
et le code
[code]
SELECT * FROM table LIMIT 1,4
[/code]
te renvoyant les enregistrements 2,3 et 5…
Tu disposes, enfin, si tu y trouves une utilité quelconque, des fonction COUNT(*) qui renvoie le nombre d'enregistrements sélectionnés, MIN(champs) qui renvoie la valeur minimale de champs parmis une sélection et MAX(champs) qui renvoie…la valeur maximale de champs parmis une selection.
Sur base de l'exemple que tu donnes, le code
[code]
SELECT COUNT(*) from table
[/code]
te renverra donc 4 (car il y a 4 enregistrements dans la table)
alors que le code
[code]
SELECT MIN(ID), MAX(ID) FROM table
[/code]
te renverra les valeurs 1 et 5 (respectivement la valeur minimale et la valeur maximale trouvée pour ID
Enfin, une fois sorti du langage SQL pur, tu disposes également de la fonction PHP mysql_num_rows(resultat de requete) qui renvoie le nombre d'enregistrements qui ont été renvoyés par la requete.
Sur base de ce qui précède, tu devrais arriver relativement facilement à mettre au point un algorithme qui te permette d'obtenir le résultat voulu [clindoeil]
Modifié par koala01 le 15/11/2005 12:59 | | | | | can93 | Posté le 05/12/2005 à 20:57 | Astucien
1467 Messages
| Ah Ben oui pas bête mr Koala [approuve] | | | |
| | Haut de la page |
| | Inscrivez-vous ! |
- Posez vos questions
- Résolvez vos problèmes
- Aidez les autres
- Participez et créez vos discussions
- Dialoguez en privé avec d'autres membres
- Suivez vos sujets préférés
- Affichez les signatures des membres
|
|