cs_aresh
Messages postés24Date d'inscriptionsamedi 19 juillet 2003StatutMembreDernière intervention23 mai 2006
-
22 déc. 2004 à 18:38
cs_aresh
Messages postés24Date d'inscriptionsamedi 19 juillet 2003StatutMembreDernière intervention23 mai 2006
-
23 déc. 2004 à 18:36
Bonsoir à tous ,
J'ai un petit soucis. J'ai une jolie base de donnée, avec 300 entrée environs, mais dans la structure, il y a des "trou" (certainne ligne se sont faite deletté). Ces trou ne géne en rien habituellement suaf pour une page de mon site.
En effet, j'affiche les données d'une ligne aléatoirement pour mes utilisateurs (pour les personnes qui désirent aller au gré du surf sur une page au hasard).
Je créer un id aléatoire entre 2 borne (le plus grand et le plus petit ID). Mais quand le hasard fait mal les choses je tombe sur mes "trous". Et là forcément rien ne s'affiche...
Comment faire ?
Parce que l'id n'existe pas ! un <cfif id eq 0> c'est un peut pisser dans un violoncelle du XIII éme siécle.
Aller le code de ma page (ainsi que le lien pour les gens qui voudrais tester les choses (en gros tous les 20/30 liens il tombe sur une ligne vide).
<cfprocessingdirective pageencoding="ISO-8859-1">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!--- Tri le plus haut id de la base annu --->
cs_lfontaine
Messages postés203Date d'inscriptionlundi 23 décembre 2002StatutMembreDernière intervention11 mai 2006 23 déc. 2004 à 01:59
Ok c'est noel....
<cfprocessingdirective pageencoding="ISO-8859-1">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<cfquery datasource="#application.kaimdb#" name="getl">
SELECT id, title, adr, valide, type,notec, noteg, commentaire
FROM annu
</cfquery>
<!--- Trouve un enregistrement au hazard --->
<cfset idrandom=randrange("1",getl.Recordcount)>
<!--- Affichage RAS --->
<cfoutput query="getl" startrow="#idrandom#" maxrows="1">
<title>Zoom sur #getl.title# la selection de Axolotl</title>
<META name='description' content='annuaire de jeu de rôle amateur Français'>
<META name='keywords' content='jeux, rôle, jeux de rôles, jeux amateur, amateur, nephilim, add, dd, d&d, Appel de chtulhu, liber-mundi.rog, jeu on-line, D20 systeme, COPS, LA, Freind, serieTV, brain.soda, forum jdra, SDN, Casus Belli, Mangas'>
<META name='author' content='Calmes Christophe'>
<META name='generator' content='Cold Fusion'>
<META name='language' content='fr'>
<META name='robot' content='index, follow'>
cs_aresh
Messages postés24Date d'inscriptionsamedi 19 juillet 2003StatutMembreDernière intervention23 mai 2006 22 déc. 2004 à 23:49
Ma solution complexe a le merite d'afficher quelques chose une fois sur 20 environs...
Parcontre ton code est simple (je viend de tester), mais il m'affiche un jolie panneau d'erreur. Ou alors je suis trop truffe pour comprendre la subtenciel moelle de ton explication ;-).
cs_lfontaine
Messages postés203Date d'inscriptionlundi 23 décembre 2002StatutMembreDernière intervention11 mai 2006 23 déc. 2004 à 00:21
Salut,
Pour donner un peu plus d'explications:
Vu que tu ne peut te fier a tes indices, je propose de faire une requette qui te donne tout les enregistrements. (disons que tu as 302 enregistrements dans ta base)
Ensuite tu genere un nombre aleatoire allant de 1 a 302
Ensuite tu affiches par l'intermediare du cfoutput uniquement 1 enregistrement en debutant par l'enregistrement d'index, ton nombre aleatoire.
Dans ce cas tu n'a plus a travailler avec tes IDs.
Maintenant si tu prefere, on peut envisager la creation d'un module qui comporterait en entree ton ID min et ton ID max.
tu utilises donc un cfmodule avec ces deux indices.
Le module genere un nombre aleatoire entre min et max et teste si l'ID est present dans ta bdd. Si oui tu sort du module en sauvant ton nombre aleatoire si non, tu apelles une nouvelle fois ton module ce qui le rend recurcif.
cs_lfontaine
Messages postés203Date d'inscriptionlundi 23 décembre 2002StatutMembreDernière intervention11 mai 2006 23 déc. 2004 à 00:25
Tu pourrais egalement faire une requete qui te renvoit tout tes indices, les placer dans un tableau et utiliser arraylen pour avoir ton nombre maximal pour ta fonction randrange. Ensuite tu recupere l'indice qui est place dans le array[idrandom]
bref pas mal de possibilites, mais je persiste a dire que la premiere offerte est la plus simple.
cs_aresh
Messages postés24Date d'inscriptionsamedi 19 juillet 2003StatutMembreDernière intervention23 mai 2006 23 déc. 2004 à 00:43
Il est tard, donc j'ai pas trop les idées clair...
Je suis débutant en CF. Je ne connais pas encore bien l'utilisation des variable....
Par exemple quand tu me par de array... moi ça m'évoque rien de bien précis.
Maintenant, je veux quand même 2/3 trucs à mon sens trés important.
1 Que le id mini et maxi soit dynamqiue (imagine que je mette en dure le 1.... et que je suprime de ma base ensuite.... ) Ce qui est le cas, mes id vont de 10 à 407 et je n'ai de 359 lien valide ! Donc il a un GROS trou entre de 1 à 9.... et puis ensuite deci de là... et celà va aller en empirant avec le temps (+ de "trou" donc plus d'affichage foireux... chier ce truc !).
Tas derniére proposition me parait être la plus élégeante et la plus intéressante...
Mais simplement, il n'y a pas un moyen de dester un Id si il n'existe pas tous bêtement ?
Genre Id eq Null... pas 0 Null rien dedans... ID n'existe pas néant JE TE DIT serveur de mes....
J'ai essayé mes ce c... de machin semble pas fait pour les solutions simples qui arrangerai tous le monde (et accésoirement ma qualité de vie).
Mais, je penche + pour mon incapacité à me faire comprendre plutôt.
Sinon j'aime bien CF.... Je trouve que c'est un langage facile d'accée (par rapport à php).
Et puis pendant que nous sommes dans les considairation philosophique... vive Fire Fox...
cs_aresh
Messages postés24Date d'inscriptionsamedi 19 juillet 2003StatutMembreDernière intervention23 mai 2006 23 déc. 2004 à 00:48
J'ai mieux...
Je vais ajouter un colonne qui aurat le rôle d'un compteur indépendant.... Avec un module qui a chaque fois que je delleterai un truc dans la base remettra à jour le compteur.... Histoire de plus avoir de trou.
Mais je perciste à dire que c'est quand même une sacré usine à gaz, pour un truc qui serai simplement résumable par un
<Cfif Id truc muche eq null>
Faire sa popotte internet...
<cfelse>
Truc muche machin chose... tous le monde est heureux
</cfif>
cs_lfontaine
Messages postés203Date d'inscriptionlundi 23 décembre 2002StatutMembreDernière intervention11 mai 2006 23 déc. 2004 à 01:32
Salut,
En fait comme tu as des trous comme tu le dis, le mieux est simplement de ne pas te servir de tes ID. A la place tu utilises le numero du recorset (enregistrement ou ligne si tu prefere). Quand tu fait une requete le resultat comporte toujours une ligne 1 (qui peut avoir l'ID 9 ou 3 ou 13 ca n'a pas d'importance)
La premiere solution travaille sur le nombre d'enregistrements retournes par ta requete et pas sur les valeurs de l'ID de chaque enregistrement.
<Cfif Id truc muche eq null> ne fonctionne pas parceque lors de ta requete tu ne peut pas recuperer les elements qui sont supprimes, c'est aussi simple que ca, ces ID sont supprimes de ta base et ne peuvent donc pas etre recuperes lors d'une requete.
C'est pour cela que la solution preconisee en terme de gestion de bdd est de ne jamais supprimer d'info, le mieux aurait ete d'ajouter une collone de type booleen (oui/non) appellee supprime. Au lieu de supprime, tu marque l'enregistrement comme supprime.
Une autre preconisation est d'utiliser des idenfieurs uniques pour les ID au lieu de simples entiers incrementes (mais bon pour plus d'infos il te faut regarder dans un bouquin de bdd)
cs_lfontaine
Messages postés203Date d'inscriptionlundi 23 décembre 2002StatutMembreDernière intervention11 mai 2006 23 déc. 2004 à 02:34
Une autre solution qui me vient maintenant et qui limiterait le transfert de donnees entre la bdd et CF serait de faire le random directement dans la bdd.
Mais ca depend de quelle bdd tu utilises
Pour access par example
<cfquery datasource="#application.kaimdb#" name="getl">
SELECT TOP 1 *
FROM annu
ORDER BY Rnd((1000*ID)*Now());
</cfquery>