Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Tiedon listaaminen usealle sivulle tietokkannasta

dartvaneri [15.06.2011 15:46:28]

#

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

Teuro [20.06.2011 19:45:30]

#

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>";

dartvaneri [21.06.2011 00:43:14]

#

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.

Teuro [27.06.2011 17:27:53]

#

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.

dartvaneri [27.06.2011 20:42:06]

#

Okei, eli turhaa vaivauduin heittään sen tänne.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta