La variable URL Coldfusion change de manière inattendue

J’ai un problème qui me contrarie beaucoup. J’ai écrit un outil de pagination de base pour une page exécutée sur Coldfusion 11: http://fftoolbox.scout.com/ffwc/rankings.cfm?rankings=season&page=2

Je l’ai conçu de telle sorte qu’il existe une requête d’url appelée page qui contient le numéro de page. De cette façon, l’utilisateur peut simplement saisir le numéro de page qu’il souhaite plutôt que d’appuyer sur les boutons suivant et précédent.

La pagination fonctionne parfaitement pour les pages 1 à 25, mais à la page 26 et suivantes, elle enregistre la variable url.page avec la valeur 1, même si le lien sur le contrôle indique clairement que la variable doit être la page 26.

Si vous le remarquez, je dispose de la méthode Coldfusion qui vide la scope de l’URL en haut de la page. Vous noterez que lorsque la page est égale à 25 ou moins, la page est signalée correctement. Toute valeur supérieure à 25, cependant, la valeur 1 est affectée à url.page, même si ce n’est pas ce qui est envoyé en fonction du navigateur. Je l’ai testé dans FF, Chrome et IE, et présentent tous le même comportement. Cela m’amène à penser que ce n’est pas quelque chose dans le code ou une particularité basée sur un navigateur, mais peut-être une sorte de paramètre de serveur.

Voici un code assorti du projet:

  1. Le vidage et la définition des variables de session.

            

Ce rang de départ et de fin est utilisé dans une requête SQL pour récupérer la plage appropriée de lecteurs. Je n’inclus pas le SQL sauf si quelqu’un le demande car cela fonctionne bien. En fait, lorsque je tape le code url.page à 26, tout fonctionne comme il se doit.

  1. Les liens Précédent et Suivant:

       Previous    Next  

S’il vous plaît laissez-moi savoir si vous avez besoin de plus d’informations. Je pense que c’est en fait soit un problème Apache, soit un problème CF car la pagination fonctionne correctement aux pages 1 à 25.

MODIFIER:

J’ai eu une demande pour montrer les requêtes. Il y a deux d’entre eux. Un pour obtenir les données et un autre pour obtenir le nombre total de données.

  select * from (select @currentRank := @currentRank +1 as rank,player_name, point_sum, contest_type from (select player_name,sum(points) as point_sum, contest_type, (select @currentRank := 0) r from 2014_ranking_season inner join ecom_item_type on ecom_item_type.ecom_item_type_id = 2014_ranking_season.contest_type where contest_type = #session.filter# group by player_name)t1 order by point_sum desc)t2 where rank between #startingRank# and #endingRank#   select * from (select @currentRank := @currentRank +1 as rank,player_name, point_sum, contest_type from (select player_name,sum(points) as point_sum, contest_type, (select @currentRank := 0) r from 2014_ranking_season inner join ecom_item_type on ecom_item_type.ecom_item_type_id = 2014_ranking_season.contest_type where contest_type = #session.filter# group by player_name)t1 order by point_sum desc)t2  

J’espère que ça aide. Gardez à l’esprit que, sauf pour le bouton précédent avec lequel j’expérimente, tout fonctionne bien jusqu’à la page> 25.

MODIFIER:

La valeur de GetMax.recordCount = 2242. En outre, j’écris une petite page de reproduction qui est réduite pour ne produire que les résultats. Une fois cela fait, je posterai le code de la page entière. Que ce soit ou non, il reproduit le résultat, cela nous dira quelque chose.

MODIFIER:

La page de reproduction est en place et l’erreur EST reproductible, même avec le code réduit. Voici l’URL: http://fftoolbox.scout.com/ffwc/testPagination.cfm?rankings=season&page=26

Voici la liste complète du code:

              Test Pagination   

select * from (select @currentRank := @currentRank +1 as rank,player_name, point_sum, contest_type from (select player_name,sum(points) as point_sum, contest_type, (select @currentRank := 0) r from 2014_ranking_season inner join ecom_item_type on ecom_item_type.ecom_item_type_id = 2014_ranking_season.contest_type group by player_name)t1 order by point_sum desc)t2 where rank between #startingRank# and #endingRank# select * from (select @currentRank := @currentRank +1 as rank,player_name, point_sum, contest_type from (select player_name,sum(points) as point_sum, contest_type, (select @currentRank := 0) r from 2014_ranking_season inner join ecom_item_type on ecom_item_type.ecom_item_type_id = 2014_ranking_season.contest_type group by player_name)t1 order by point_sum desc)t2 select team_name from 2014_ranking_season where player_name = limit 1 <tr class='evenRow'class='oddRow'>
RANKPLAYER NAMETEAM NAMEPOINTS
#rank# #player_name##GetOneName.team_name##point_sum#
Previous Next

Je vais également obtenir les en-têtes de requête http à afficher sur cette page. Je vais les mettre dans la question, si les gens le veulent, mais la question commence à être longue, et le cfdump le formate bien dans le navigateur. Merci à tous pour l’interaction jusqu’à présent.

METTRE À JOUR:

Je soupçonne que notre équipe d’approvisionnement, sur laquelle je n’ai aucun contrôle, aurait pu faire quelque chose dans le backend, comme le mettre sur Varnish, ce qui n’est pas censé se produire. S’il vous plaît continuez à regarder le code, etc., et je vais aboyer cet arbre pour voir s’il y a quelque chose qu’ils ont fait. 25 semble juste à “humain” un chiffre pour que ce ne soit pas un cadre quelque part. Je vous tiendrai au courant.

METTRE À JOUR:

J’ai vérifié auprès de l’équipe de provisionnement et Varnish n’est pas actif, et la balance de charge ne cause pas le problème, car je pourrais répliquer le problème en contournant le LB. Mon avis selon lequel il s’agit d’un problème de configuration avec Apache ou CF semble devenir de plus en plus probable au fur et à mesure que les choses s’arrêtent.

METTRE À JOUR:

En ajoutant le code recommandé par @Leigh, nous trouvons que la requête http est certainement page = 26 et que la scope de l’URL est certainement page = 1. Je cherche à voir si un fichier d’application peut être en train de le perturber.

MISE À JOUR FINALE:

En examinant l’application.cfm, j’ai trouvé le code suivant:

       

Après que ceci ait été commenté, la pagination a fonctionné très bien. Une autre méthode pour le faire fonctionner serait de ne pas utiliser la page comme nom de variable pour la page. (Ceci est contre-intuitif et déplaisant pour moi) Je suis d’avis que les constructions comme la pagination devraient être contenues dans un seul fichier ou répertoire, et non pas à l’échelle du site.

En examinant l’application.cfm, j’ai trouvé le code suivant:

       

Après que ceci ait été commenté, la pagination a fonctionné très bien. Une autre méthode pour le faire fonctionner serait de ne pas utiliser la page comme nom de variable pour la page. (Ceci est contre-intuitif et déplaisant pour moi) Je suis d’avis que les constructions comme la pagination devraient être contenues dans un seul fichier ou répertoire, et non pas à l’échelle du site.

Merci à tous ceux qui ont commenté, et m’a aidé dans cette entreprise.

Tout d’abord, votre bouton “précédent” ne définit pas une URL.page ou une session.page – il utilise “action”. Etant donné que la page n’est pas définie dans l’URL, la page est automatiquement configurée … En cliquant sur “précédent”, puis sur “suivant”, je reviens toujours à la page 2, peu importe où je commence.

Maintenant, votre “prochain” lien …

   Next  

Je viens de lancer ce code après avoir défini session.page sur ma propre page .cfm …

Un bouton “Suivant” GetMax.recordcount que si session.page est à zéro ou GetMax.recordcount plus de 50 fois la valeur de session.page . Je soulève la question parce que GetMax.recordcount ne devrait jamais changer. Vous affichez 50 enregistrements à la fois.

Le code suivant ne fonctionne pas, donc je ne fais pas ce que vous faites de votre côté …

     Next   

Il serait peut-être temps de nous montrer la logique de requête.

Modifier:

Pourquoi ne pas faire quelque chose comme ça?

   SELECT TOP 50 * FROM PeopleTable WHERE PeopleID >= #StartRecord#  

C’est si simple et je ne comprends pas pourquoi la requête GetMax est nécessaire. Tout ce qui concerne les mathématiques supplémentaires ne fait qu’accroître le risque d’erreur. La pagination ne devrait pas être un projet en soi.