Monesti tulee tarve listata tietokannasta haettavat tiedot usealle sivulle, mutta on hyödytöntä lähteä tekemään jokaiselle omaa sivua; sivu1.php, sivu2.php, sivu3.php jne.. On paljon helpompi, jos koodi tekee sen automaattisesti sen mukaan, että onko vielä tulossa tietoa, vai eikö.
Tämä kyseinen koodi hakee tiedon tietokanta taulusta, listaa ensimmäiselle sivulle esim 10 tietoa, ja loput tulevat seuraaville sivuille. Aina sivua vaihdettaessa koodi hakee sille sivulle kuuluvat tiedot tietokannasta.
Koodin käyttäminen vaati jonkin verran php:n ja mysql(pdo) osaamista.
Koodi toimii ainakin IE7, IE8, firefox, opera ja chrome.
Soveltaminen on vapaa. Parannus ehdotuksia saa antaa.
koodi:
sivu.php <?php $taulun_nimi = "koordinaatit"; //tietokanta taulun nimi $osoite = "sivu.php?"; //tämän sivun osoite $otsikko = "Koordinaatit"; //sivun otsikko $limitx = 10; //määrä jota mahtuu yhdelle sivulle include("yhteys.php"); // tulostetaan yhteys.php:n sisältö, jolla otetaan yhteys tietokantaan echo "<h2>$otsikko</h2>"; //sivun otsikko $numero = $_GET['numero']; //haetaan "sivunnumero" if(!preg_match("/^[0-9]+$/", $numero)){ $numero = 1;}; //jos $numeron sisältö ei ole mikään luku, muutetaan $numero ykköseksi. tällä voidaan varmistua tietomurtoiskuilta if($numero == '' || $numero == 0) { //jos $numero on tyhjä tai nolla, muutetaan se ykköseksi $numero = 1; } if($numero == 1){ $limit = $limitx; } else{ //lasketaan mitkä tiedot tulevat tälle sivulle $luku = ($limitx * $numero)-$limitx-1; $limit = "$luku, $limitx"; } $kysely = $yhteys->prepare("SELECT * FROM $taulun_nimi LIMIT $limit"); //haetaan tietokannan taulusta tiedot.. $kysely->execute(); while ($rivi = $kysely->fetch()) { /////////////////////////////// //tiedot joite halutaan hakea// /////////////////////////////// $y = $rivi['y']; //..haetaan tietokannan taulusta tiedot.. $x = $rivi['x']; //..haetaan tietokannan taulusta tiedot.. //tietojen tulostus echo "<b>$y</b></a><b>$x</b> <br><br>"; //...ja tulostetaan tiedot allekkain } $kysely = $yhteys->prepare("SELECT COUNT(*) FROM $taulun_nimi"); // lasketaan rivien määrä taulukossa... $kysely->execute(); $tulos = $kysely->fetch(); $rivit = $tulos["COUNT(*)"]; //...lasketaan rivien määrä taulukossa $seuraava = $numero + 1; //seuraava sivu $edellinen = $numero - 1; //edellinen sivu $luku2 = ($numero * $limitx)+1; //lasketaan jääkö tulostettavia tietoja vielä seuraavalle sivulle if($rivit >= $luku2) { //jos tulostettavia tietoja on enemmän kuin tälle sivulle mahtuu, tulostetaan linkki jolla päästään seuraavalle ja edelliselle sivulle if($numero <= 1) { echo "<br><br><-- <a href='{$osoite}numero=$seuraava' style=\"text-decoration: none;\">--></a>"; } else{ echo "<br><br><a href='{$osoite}numero=$edellinen' style=\"text-decoration: none;\"><--</a> <a href='{$osoite}numero=$seuraava' style=\"text-decoration: none;\">--></a>"; } } else //jos ei ole tulostettavia tietoja enää, linkkiä ei tulosteta, muuta kuin edelliselle sivulle. { if($numero <= 1) { echo "<br><br><-- -->"; } else { echo "<br><br><a href='{$osoite}numero=$edellinen' style=\"text-decoration: none;\"> <--</a> -->"; } } ?>
Seuraavalla koodilla muodostetaan yhteys tietokantaan.
yhteys.php <?php try { $yhteys = new PDO("mysql:host=localhost;dbname=tietokannan nimi", "käyttäjätunnus", "salasana"); } catch (PDOException $e) { die("VIRHE: " . $e->getMessage()); } $yhteys->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); ?>
Tein tällaisen lisäosan tähän sivutus skriptiin. Tässä tämä skripti tulostaa sivujen numerot, ensiksi 3 edellistä sivua, sitten nykyisen sivun, sitten kolme seuraavaa ja "..." jälkeen tulee kolme viimeistä sivua. Koodin on helppo asentaa, se vain laitetaan sivu.php tiedoston loppuun, ja se toimii sellaisenaan. yksinään koodi ei toimi, koska se vaatii $rivit, $limitx ja $numero muuttujien arvot.
<?php ///////////////////////////////////////////////////////////////// //tässä kaikki muuttujat joihin on laskettu tietyn sivun numero// ///////////////////////////////////////////////////////////////// $sivu_maara = $rivit/$limitx; //lasketaan montako sivua tiedoista tulee. Jaetaan rivien määrä sivulle mahtuvien määrällä. $sivu_maara = ceil($sivu_maara); //pyöristetään sivu määrä ylöspäin, koska jos on esim 40 täyttä sivua, ja sivulle 41 jää vaikka 3 niin se voi näyttää 40.2, vaikka todellisuudessa onkin 41 sivua. $ed = $numero - 1; $ed2 = $numero - 2; $ed3 = $numero - 3; $seur = $numero + 1; $seur2 = $numero + 2; $seur3 = $numero + 3; $t_viimeinen = $sivu_maara - 1; $k_viimeinen = $sivu_maara - 2; $n_viimeinen = $sivu_maara - 3; $v_viimeinen = $sivu_maara - 4; $ku_viimeinen = $sivu_maara - 5; $s_viimeinen = $sivu_maara - 6; ///////////////////////////////////////////////////////////////////////// ///tästä alkaa if-lauseet, jotka tarkistavat montako sivua on jäljellä,// //sen mukaan sitten päätetään näytetäänkö seuraavia kolmea sivua, /////// //kolmeaviimeistä sivua tai kolmea edellistä sivua.////////////////////// ///////////////////////////////////////////////////////////////////////// if($numero == 1) { $edelliset = ""; } elseif($numero == 2){ $edelliset = "<a href='{$osoite}numero=$ed' style=\"text-decoration: none;\">$ed</a>,"; } elseif($numero == 3){ $edelliset = "<a href='{$osoite}numero=$ed2' style=\"text-decoration: none;\">$ed2</a>, <a href='{$osoite}numero=$ed' style=\"text-decoration: none;\">$ed</a>,"; } else{ $edelliset = "<a href='{$osoite}numero=$ed3' style=\"text-decoration: none;\">$ed3</a>, <a href='{$osoite}numero=$ed2' style=\"text-decoration: none;\">$ed2</a>, <a href='{$osoite}numero=$ed' style=\"text-decoration: none;\">$ed</a>,"; } if($numero == $k_viimeinen || $numero == $t_viimeinen || $numero == $sivu_maara || $numero == $n_viimeinen ) { $seuraavat = ""; } elseif($numero == $v_viimeinen){ $seuraavat = "<a href='{$osoite}numero=$seur' style=\"text-decoration: none;\">$seur</a>,"; } elseif($numero == $ku_viimeinen){ $seuraavat = "<a href='{$osoite}numero=$seur' style=\"text-decoration: none;\">$seur</a>, <a href='{$osoite}numero=$seur2' style=\"text-decoration: none;\">$seur2</a>,"; } elseif($numero == $s_viimeinen){ $seuraavat = "<a href='{$osoite}numero=$seur' style=\"text-decoration: none;\">$seur</a>, <a href='{$osoite}numero=$seur2' style=\"text-decoration: none;\">$seur2</a>, <a href='{$osoite}numero=$seur3' style=\"text-decoration: none;\">$seur3</a>,"; } else{ $seuraavat = "<a href='{$osoite}numero=$seur' style=\"text-decoration: none;\">$seur</a>, <a href='{$osoite}numero=$seur2' style=\"text-decoration: none;\">$seur2</a>, <a href='{$osoite}numero=$seur3' style=\"text-decoration: none;\">$seur3</a>"; } if($numero == $sivu_maara) { $viimeiset = ""; } elseif($numero == $t_viimeinen){ $viimeiset = " <a href='{$osoite}numero=$sivu_maara' style=\"text-decoration: none;\">$sivu_maara</a>"; } elseif($numero == $k_viimeinen){ $viimeiset = " <a href='{$osoite}numero=$t_viimeinen' style=\"text-decoration: none;\">$t_viimeinen</a>, <a href='{$osoite}numero=$sivu_maara' style=\"text-decoration: none;\">$sivu_maara</a>"; } elseif($numero == $n_viimeinen){ $viimeiset = "<a href='{$osoite}numero=$k_viimeinen' style=\"text-decoration: none;\">$k_viimeinen</a>, <a href='{$osoite}numero=$t_viimeinen' style=\"text-decoration: none;\">$t_viimeinen</a>, <a href='{$osoite}numero=$sivu_maara' style=\"text-decoration: none;\">$sivu_maara</a>"; } elseif($numero == $s_viimeinen || $numero == $ku_viimeinen || $numero == $v_viimeinen){ $viimeiset = "<a href='{$osoite}numero=$k_viimeinen' style=\"text-decoration: none;\">$k_viimeinen</a>, <a href='{$osoite}numero=$t_viimeinen' style=\"text-decoration: none;\">$t_viimeinen</a>, <a href='{$osoite}numero=$sivu_maara' style=\"text-decoration: none;\">$sivu_maara</a>"; } else{ $viimeiset = "... <a href='{$osoite}numero=$k_viimeinen' style=\"text-decoration: none;\">$k_viimeinen</a>, <a href='{$osoite}numero=$t_viimeinen' style=\"text-decoration: none;\">$t_viimeinen</a>, <a href='{$osoite}numero=$sivu_maara' style=\"text-decoration: none;\">$sivu_maara</a>"; } echo "<br> {$edelliset} <b>{$numero}</b>, {$seuraavat} {$viimeiset}"; //tulostetaan sivun numerot ?>
Tämän ilman lisäosaa saa tiivistettyä tällaiseksi.
<?php require_once("yhdista.php"); /** Helpompi tulkita tulostusvaiheessa onko olemassa edellistä tai seuraavaa **/ $seuraava = NULL; $edellinen = NULL; /** $_GET['sivu'] on käsiteltävä sivu tämän ja seuraavan muuttujan avulla lasketaan aloituskohta tietokannasta **/ $sivu = isset($_GET['sivu']) ? $_GET['sivu'] : 0; $riveja_sivulla = isset($_GET['riveja']) ? $_GET['riveja'] : 10; /** Aloituskohta **/ $alku = $sivu * $riveja_sivulla; $kysely = $yhteys->prepare("SELECT nimi FROM juttuja LIMIT :alku, :maara"); $kysely->bindParam(':alku', $alku, PDO::PARAM_INT); $kysely->bindParam(':maara', $riveja_sivulla, PDO::PARAM_INT); $tulos = $kysely->execute(); /** Tulostetaan ja lasketaan saadut rivit **/ while ($rivi = $kysely->fetch()) { echo "<li>{$rivi['nimi']}</li>"; } /** Logiikka sivulinkkejä varten **/ if ($kysely->rowCount() == $riveja_sivulla) { $seuraava = $sivu+1; $edellinen = $sivu-1; } else { $seuraava = NULL; $edellinen = $sivu-1; } if ($sivu == 0) { $seuraava = $sivu+1; $edellinen = NULL; } echo "<p>"; if ($edellinen) { echo "<a href=\"sivutus.php?sivu={$edellinen}\">edellinen</a> "; } if ($seuraava) { echo "<a href=\"sivutus.php?sivu={$seuraava}\">seuraava</a>"; } echo "</p>";
Mutta,
A) Tämän soveltaminen ei ole aloittelijalle niin helppoa, kuin mun koodin
B)yhdelle sivulle mahtuvien määrä ja osoitteet yms helpompi vaihtaa mulla
Toki onhan tossa sun versiossa 26 riviä vähemmän.
dartvaneri kirjoitti:
Mutta,
A) Tämän soveltaminen ei ole aloittelijalle niin helppoa, kuin mun koodin
Miten ihmeessä tuo purkkaviritelmä on helpompi ymmärtää? Siellä on epäselviä muuttujien nimiä, epäselvää logiikkaa, sekä vastaavia kummallisuuksia.
dartvaneri kirjoitti:
B)yhdelle sivulle mahtuvien määrä ja osoitteet yms helpompi vaihtaa mulla
Sivuille mahtuvien rivien määrä on molemmilla tismalleen yhtä helppoa, joskin sun versio tuottaa epämääräisiä E_NOTICE tason virheitä, jos kaikkia vaadittavia muuttujia ei ole asetettu. Minun versiossa nuokin on otettu huomioon.
Okei, eli turhaa vaivauduin heittään sen tänne.
Aihe on jo aika vanha, joten et voi enää vastata siihen.