Résultat de requête sur plusieurs pages

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

Résultat de requête sur plusieurs pages

par Rockleader » 10 Oct 2015, 00:08

Bonsoir,

encore moi et mes questions farfelues =)

Je me demandais quelle était la méthode à employer pour "lire une requête sur plusieurs pages"

Peut être que le terme plusieurs pages est ici mal choisi.

Disons par exemple que je réalise une requête qui va me retourner 55 résultats.

Je veux afficher ces résultats, mais tous les mettre d'un coup, ce serait lourd et pas très pertinent.

Ce serait intéressant de pouvoir se dire, bon et bien, moi je veux afficher l'ensemble de mes résultats mais seulement 10 maximums sur ma page.

Donc en fait, il s'agit de lire les 10 premiers résultats, et si l'utilisateur le désire il peut accéder aux autres.

La première serait de faire une requête à chaque fois qui va lire 10 lignes max. Mais ça implique autant de requête que de page...ça me semble donc être une mauvaise méthode.

Est il donc possible de faire la requête une seule fois, et ensuite sur ses résultats de réaliser un découpage sur plusieurs pages.

Je dis page là encore, mais peut être qu'il existe des solution plus propre avec un contenu dynamique sur sa page en question.




Je ne trouve pas de meilleure façon d'illustrer ce problème que les moteurs de recherches. Quand on fait une recherche on n'a pas tous les résultats en page 1 et heureusement !!

Je suis preneur de toute idée sur la question, c'est surtout que je ne vois pas comment faire ça...



Autre point, j'ai pu discuter sur developpez de l'importance du fait de sécuriser ses variables, je me disais (par exemple) que le fait de mettre un champ de formulaire en required empêchait de recevoir une variable vide. Mais je me suis rendu compte que n'importe qui peut copier le coder de notre formulaire et donc envoyer de la merde à destination de notre page de traitement php; en l’occurrence ici pour faire un cas que je n'ai pas prévu il suffisait de supprimer le required dans la copie de form et ça fait planter coté serveur php car je n'ai pas traité ce cas là.

Donc j'ai bien compris: ne pas faire confiance aux utilisateurs.

En revanche, j'avoue ne pas bien comprendre comment le fait de vérifier l'existence d'une variable nous assure que l'utilisateur ne nous envoie pas quelque chose de mauvais. On m'a dit que la totalité du site pouvait se faire démolir si je ne protégeais pas mes variables, mais d'un autre coté, j'ai du mal à voir comment un user pourrait foutre un site en l'air juste en envoyant des données inutiles via un formulaire html frauduleux.
En espérant que vous puissiez m'éclairer sur ce point là également =)


Merci à vous :lol3:
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 10 Oct 2015, 09:19

hello,

généralement tu as un pool de données.
ce pool, c'est ta database (sql, nosql, whatever) ou bien en mémoire (dans un gros array).

toi tu récupères la première page:
getResults(beginningIndex, limit)
au sein de ta méthode, si tu interfaces avec une db sql, tu pourrais avoir qqch genre

1)
Code: Tout sélectionner
/**
 * @result:{
 *  "count" : the number of elements found for given criteria
 *  "results":[result1, result2, ...]
 * }
 */
function getResults(beginninIndex, limit){
  beginningIndex = (int)beginninIndex
  limit = (int)limit

  //get paginated results
  results = mysql_query('select * from mab where whatever and offset '+beginninIndex+' limit '+limit+);

  //get count
  count = mysql_query('count * from mab where whatever');

  return {
    "count":count,
    "results":results
  }
}


2)
Si tu as dumpé ta table (ce qui est pas forcément pertinent...)
ton pool de données est dans une variable par ex: $data
tu remplaces //get paginated results , par
Code: Tout sélectionner
$results = array_slice($data, $beginningIndex, $limit)


Pour afficher ta page suivante, il suffit que l'appelant (qui connait beginning et index) ait connaissance de results->count.
il calcule nextBeginningIndex = beginningIndex+ limit (si et seulement si beginningIndex+limit < count)

Remarque:
le count est fait à chaque page. Si ta collection change jamais dans le temps, ca sert à rien de refaire le count tout le temps... seul la premiere requete pour récupérer un ss ensemble de la collection est suffisante.

3) Si ta collection n'évolue pas dans le temps, ou très peu.
Tu peux "optimiser" ta pagination:
tu calcules le count une seule fois.
tu génères le nombre de page avec leur offset.
(count/limit)==nb pages (à peu pres)
et beginningIndex = (numéro page*limit) si numéro page commence à 0

Par ex: tu peux faire 3) pour afficher les pages par 10 d'un volume de manga.
Mais tu peux pas si c'est pour afficher les posts d'un forum (ou les gens peuvent rajouter des réponses)
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 10 Oct 2015, 16:37

Je ne suis pas certain d'avoir compris ce que tu énonces, corrige moi si je me trompe.

En gros, si j'ai le résultat de ma requête dans $data.
Je lui applique la fonction array_slice ce qui va me permettre de faire mon découpage.


Mais tu parles de la génération des pages (ou en tout cas c'est comme ça que j'ai compris offset).

En fait, c'est justement ça le problème, je ne vois pas comment je peux générer ces pages là.

Savoir le nombre de page que je veux générer en fonction de mon nombre de ligne c'est assez simple. Mais comment les générer ça, ça me dépasse =)

Ou alors il faut que j'ai des pages spécialement prévues pour ça...mais je peux pas en faire une infinité non plus et pourtant plus mon nombre de lignes sera élevé plus j'aurais besoin de pages.


EDIT: Je ne sais pas si c'est ce que voulait dire ta réponse ou si cela m'en a justement donné l'idée, mais je crois avoir compris comment faire.


Il me suffit de mémoriser au sein d'une variable de session une valeur indexDébut et d'afficher les n premiers résultats de ma requête par exemple.
Pour afficher les autres résultats je n'aurais alors qu'à recharger la même page en incrémentant de n ma variable de session !
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 10 Oct 2015, 18:33

mysql_query('insert name into People values(bob0)')
mysql_query('insert name into People values(bob1)')
mysql_query('insert name into People values(bob2)')
mysql_query('insert name into People values(bob3)')
mysql_query('insert name into People values(bob4)')
mysql_query('insert name into People values(bob5)')
mysql_query('insert name into People values(bob6)')
mysql_query('insert name into People values(bob7)')
mysql_query('insert name into People values(bob8)')
mysql_query('insert name into People values(bob9)')

la table people contient 10 personnes.
Tu veux paginer par 2 personne par page:
page 1 doit contenir bob0, bob1
page 2 doit contenir bob2, bob3
page 3 doit contenir bob4, bob5
page 4 doit contenir bob6, bob7
page 5 doit contenir bob8, bob9

la limit est 2.
dans le php qui génère ta page:
index.php
Code: Tout sélectionner
$count, "data"=>$data);
}

$offset = $_GET['offset'] ? $_GET['offset']:0;
$limit = 2;
$res = getResults($offset, $limit);


//show the people's name of current page
$htmlPeople = '';
foreach($name as $res->data){
    $htmlPeople .= ''.$name.'';
}

//show the next links
$nbPages = $res->count/$res->limit;
for($i = 0; $i'.$i.'';
}

//generate the page
$str = file_get_contents("./index.html");

//replaces the content of index.html with some variables
$str = replace("{{PEOPLE_OF_PAGE}}", $htmlPeople, $str);
$str = replace("{{CURRENT_OFFSET}}", $offset, $str);
$str = replace("{{NB_PEOPLE}}", $res->count, $str);
$str = replace("{{LINKS}}", $htmlLinks, $str);
echo $str;
?>


Code: Tout sélectionner
index.html




    ({{CURRENT_OFFSET}}/{{NB_PEOPLE}}):



    {{PEOPLE_OF_PAGE}}



    {{LINKS}}




pas besoin de session.
je pense que le code est self explanatory, il y a des erreurs de syntaxe, par ce que je me rappèle plus de ce langage, mais tu as les idées
la vie est une fête :)

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 12 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite