Tester une valeur avec CF ?

Résolu
Signaler
Messages postés
24
Date d'inscription
samedi 19 juillet 2003
Statut
Membre
Dernière intervention
23 mai 2006
-
Messages postés
24
Date d'inscription
samedi 19 juillet 2003
Statut
Membre
Dernière intervention
23 mai 2006
-
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).

http://annuairejdra.liber-mundi.org/random.cfm

Le code :

<cfprocessingdirective pageencoding="ISO-8859-1">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!--- Tri le plus haut id de la base annu --->

<cfquery datasource="#application.kaimdb#" name="getp" maxrows="1">

SELECT id
FROM annu
ORDER BY id DESC

</cfquery>
<!--- Tri le plus petit id de la base annu --->

<cfquery datasource="#application.kaimdb#" name="getg" maxrows="1">
SELECT id
FROM annu
ORDER BY id
</cfquery>

<!--- Trouve un id au hasard entre les deux bornes --->

<cfset idrandom=randrange(#getp.id#,#getg.id#)>

<!--- Test pour savoir si il y a quelques chose correspondant à cette id --->

<cfquery datasource="#application.kaimdb#" name="test">

SELECT id
FROM annu WHERE (id #idrandom#) and (valide 1)

</cfquery>

<!--- Si il n'y a rien relance le random --->

<cfif test.id eq 0>
<cfset idrandom=randrange(#getp.id#,#getg.id#)>
</cfif>

<!--- Affiche la ligne correspondant à l'id trouvé --->

<cfquery datasource="#application.kaimdb#" name="getl">

SELECT id, title, adr, valide, type,notec, noteg, commentaire
FROM annu WHERE (id #idrandom#) and (valide 1)

</cfquery>
<!--- Affichage RAS --->

<cfoutput>
<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'>

<link rel="stylesheet" href="#Application.WebRoot#/css/stylea.css">
</head>

<caption>#getl.title#

</caption>

----

Aller voir #getl.title#,
Type de Fichier ,
Etat d'avancement ,
Commentaire sur le jeu,

----

Retour à l'annuaire
--->

</cfoutput>
</html>

Aresh mon site en CF :
http://kaim.liber-mundi.org/
Merci Code source

13 réponses

Messages postés
203
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
11 mai 2006

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'>

<link rel="stylesheet" href="#Application.WebRoot#/css/stylea.css">
</head>

<caption>#getl.title#

</caption>

----

Aller voir #getl.title#,
Type de Fichier ,
Etat d'avancement ,
Commentaire sur le jeu,

----

Retour à l'annuaire
--->

</cfoutput>
</html>
Messages postés
203
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
11 mai 2006

humm ca me parrait bien complexe tout ca

<cfquery datasource="#application.kaimdb#" name="getl">
SELECT id, title, adr, valide, type,notec, noteg, commentaire
FROM annu
</cfquery>

<cfset idrandom=randrange(1,#getl.RecordCount#)>

<cfoutput query="getl" startrow = idrandom maxrows = 1>

code ici

</cfoutput>

Laurent
Messages postés
24
Date d'inscription
samedi 19 juillet 2003
Statut
Membre
Dernière intervention
23 mai 2006

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 ;-).

Merci quand même de ton aide.

Aresh mon site en CF :
http://kaim.liber-mundi.org/
Merci Code source
Messages postés
203
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
11 mai 2006

Salut,

Le code poste n'est pas tester vu que je l'ai taper comme ca.
Maintenant le process devrait fonctionner.

Tu as quoi comme erreur ?

Laurent
Messages postés
203
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
11 mai 2006

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.

Laurent
Messages postés
203
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
11 mai 2006

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.

Laurent
Messages postés
24
Date d'inscription
samedi 19 juillet 2003
Statut
Membre
Dernière intervention
23 mai 2006

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...

La suite demain suis trop NRV là

Aresh mon site en CF :
http://kaim.liber-mundi.org/
Merci Code source
Messages postés
24
Date d'inscription
samedi 19 juillet 2003
Statut
Membre
Dernière intervention
23 mai 2006

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>

Aresh mon site en CF :
http://kaim.liber-mundi.org/
Merci Code source
Messages postés
203
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
11 mai 2006

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)

Laurent

PS: Tu m'as toujours pas dit quelle erreur tu as.
Messages postés
203
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
11 mai 2006

Desole j'ai oublie: Array = tableau.
C'est une structure de donnee. Tu pourrais aussi bien dans ton cas utiliser une liste.

Laurent
Messages postés
203
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
11 mai 2006

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>

Laurent
Messages postés
24
Date d'inscription
samedi 19 juillet 2003
Statut
Membre
Dernière intervention
23 mai 2006

Je vais tester ton code...

J'utilise un base de donnée MySQL.

Merci pour le code.

Aresh mon site en CF :
http://kaim.liber-mundi.org/
Merci Code source
Messages postés
24
Date d'inscription
samedi 19 juillet 2003
Statut
Membre
Dernière intervention
23 mai 2006

J'ai mi en route le code...

Sa marche bien.

Bon dans l'ensemble celà à l'air de moins buggé qu'avec le code que j'utilise habituellement. Voir pas du tous...

Merci pour tous...

Joyeux noél !

Le lien :

http://annuairejdra.liber-mundi.org/random.cfm

Aresh mon site en CF :
http://kaim.liber-mundi.org/
Merci Code source