ugrás a tartalomhoz

Saját lapozó

GreenEar · 2014. Jan. 26. (V), 19.06
Sziasztok!

Egy lapozással kapcsolatban kérnék segítséget. Van a Weblaboron és azon túl rengeteg lapozó, de nem találom azt ami nekem igazán átlátható lenne.
A problémám az hogy lapozással kapcsolatban teljesen alap a tudásom (alap==0) és részletes leírást a logikájáról nem találtam.

Szeretném a lapozás menetét megérteni, és egy saját egyszerű lapozót írni.
A példa kedvéért az egy kereső programot írok be:
  1. <form method="get">  
  2. <input type="text" name="searchword1" id="searchword1">  
  3. <input type="text" name="searchword2" id="searchword2">  
  4. <input type="text" name="searchword3" id="searchword3">  
  5. <button type="submit">Mehet</button>  
  6. </form>  
MySql-Ből kérem le az adatokat, minden működik szépen. (tudom hogy escapelés stb kell rá de ezt a lekérdezést csak a példa miatt írtam).
A lekérés:
  1. <?  
  2.   
  3. require_once('connectvars.php');  
  4.     
  5. $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);  
  6.   
  7. $where = array();  
  8.   
  9. if ($_GET['searchword1']) {  
  10.   
  11. $where[] = "elsosor = '" . $_GET['searchword1'] . "'";  
  12.   
  13. }  
  14.   
  15. if ($_GET['searchword2']) {  
  16.   
  17. $where[] = "masodiksor = '" . $_GET['searchword2'] . "'";  
  18.   
  19. }  
  20.   
  21. if ($_GET['searchword3']) {  
  22.   
  23. $where[] = "harmadiksor = '" . $_GET['searchword3'] . "'";  
  24.   
  25. }  
  26.   
  27. $query = "SELECT * FROM tabla";  
  28.   
  29. if(!emptyempty($where)){    
  30.   
  31.     $query .= ' WHERE '.implode(' AND '$where).'';    
  32. }  
  33.   
  34. $data = mysqli_query($dbc$query);   
  35.   
  36. while ($row = mysqli_fetch_array($data)) {   
  37.   
  38. echo ''$_row['adat'] .'';  
  39.   
  40. }  
  41.   
  42.   
  43. ?>  
Hogy kezdjek neki a lapozásnak? Gondolom meg kell határoznom hány sor van amit lekér, mennyit szeretnék ha egy oldalon megjelenne, ...
Köszönöm előre is a segítséget és az infókat is ezzel kapcsolatban.
 
1

Vizualizáció

Hidvégi Gábor · 2014. Jan. 26. (V), 19.21
Amikor nekem kellett lapozót készítenem, lerajzoltam, mi az, amit szeretnék, hogy megjelenjen, aztán felírtam, hogy milyen változókat kell ehhez felhasználnom, ez után már csak meg kellett írni a kódot, mert pofonegyszerű az egész.
2

Szükséged lesz a sorok

Joó Ádám · 2014. Jan. 26. (V), 19.38
Szükséged lesz a sorok számára (COUNT() függvény), ebből, ha eldöntötted az egyszerre megjelenítendő sorok számát, megtudod, hány oldalad van, és a lapozó megjelenítésével készen vagy. Az adott oldal megjelenítéséhez pedig határt kell szabj a lekérdezett sorok számának, és meg kell add, hányadik sortól várod az eredményt (LIMIT és OFFSET záradék).

Döntsd el, hogy melyik irányból kezded a számozást (ha a legújabb az első, akkor egyszerűbb a lekérdezésed, de idővel vándorolnak a sorok; ha fordítva, akkor kicsit összetettebb az SQL, de a keresőből érkező látogatók a jó helyre érkeznek a listában), figyelj oda az összeadásra-szorzásra, és arra, hogy mi történik, ha túl nagy vagy kicsi számokat ad meg a felhasználó.
3

mysql esetében az

szabo.b.gabor · 2014. Jan. 27. (H), 17.01
mysql esetében az SQL_CALC_FOUND_ROWS is jó dolog lehet.
  1. -- tehát a kiindulási pont kb ez  
  2. SELECT * FROM tabla;  
  3.   
  4.   
  5. -- aztán ráeresztesz egy limitet  
  6. SELECT * FROM tabla LIMIT 0,20;  
  7. -- így csak az első húszat kapod meg.  
  8.   
  9. SELECT * FROM tabla LIMIT 20,20;  
  10. -- így 20-tól indulva kapod meg a következő 20 elemet  
  11.   
  12. SELECT SQL_CALC_FOUND_ROWS * FROM tabla LIMIT 40,20;  
  13. SELECT FOUND_ROWS();  
  14. -- így megkapod 40-től indulva a köv 20 elemet,   
  15. -- majd a következő lekéréssel (persze előtte még fetch-eled az elemeket)   
  16. -- megkapod az összes elem számát.  
4

Mérni kell

Hidvégi Gábor · 2014. Jan. 27. (H), 17.24
Amellett, hogy nem szabványos, érdemes megmérni a sebességét, nálunk párezer rekordos táblákban már sokkal gyorsabb volt két külön lekérdezést lefuttatni (az elsőben az össz rekordszámot lekérni, a másodikban pedig a LIMIT-tel), mint egyet az SQL_CALC_FOUND_ROWS-zal.