Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Sivut dynaamisiksi PHP:n avulla

Sivun loppuun

odys [22.06.2003 01:57:18]

#

Tämä pienehkö koodivinkki näyttää miten toteutat sivusi _turvallisesti_ dynaamisiksi ja näin helpotat sivujen päivittämistä ja vaivaasi.

Kommentit koodivinkin aikana on englanniksi (tottumus kaiketi)

Sivut ladataan osoiterivin perusteella. Esim http://jope.psykoosi.org/index.php?page=etusivu

Testaa ja ymmärrä koodi.

<?php

	/*
	 *  Page load system coded by Joni Järvinen a.k.a Jope <jope@psykoosi.org>
	 *  More scripts can be found at http://jope.psykoosi.org/ (Finnish site)
	 *
	 *  This system shows you how to load page safely using GET method.
	 *  There is much benefits in this kind of system for example you can make
	 *  your homepages more dynamic loading texts from seperate files.
	 *
	 */

	// Here you have to list every page you want that can be loaded
	$pages = Array (
				"news" => "includes/news.php",
				"info" => "includes/info.php",
				"and so on" => "right?/you get it?.php"
			 );

	// We check if there is page given. If not by default we load news.php
	$page = ($_GET["page"] != "") ? $_GET["page"] : "news";

	// Lets check that the file exists and it is in $pages array
	if (isset($pages[$page]) AND file_exists($pages[$page])) {
		// Everything's allright lets load the page
		include ($pages[$page]);
	} else {
		// Somethings wrong! We show error message
		echo "Error 404 - The page cannot be found.";
	}

	/*
	 *  If you think you have like 100 pages and you don't want to write
	 *  the array manually. Here's the solution for you.
	 *
	 *  function MakeArray (String handle)
	 *
	 *  Example:
	 *    MakeArray ("/home/jope/public_html/my_pages/loads/");
	 *
	 *  Then you have an array to use with Page load system. Remember the ending slash!
	 *
	 *  Use this function with caution! Check the directory which you turn
	 *  into array that it doesn't include any UNWANTED files.
	 *
	 */

	function MakeArray ($dir) {
		global $pages;
		$handle = OpenDir ($dir) or die ("Couldn't open $handle!");
		while (FALSE !== ($file = ReadDir($handle))) {
			if ($file != ".." AND $file != ".") {
				if (is_dir($dir . $file)) {
					MakeArray ($dir . $file . "/");
				} else {
					$pages[ereg_replace("\.(.*)$", "", $file)] = $dir . $file;
				}
			}
		}
		CloseDir ($handle);
	}

?>

arcatan [23.06.2003 09:37:51]

#

Kun tuo tarjoaa tuota virhe numero neljänollanelosta, niin eikö siitä pitäisi laittaa myös headeriin jokin tieto. Vai muistanko väärin. Pitäisi varmaan tutkia HTTP:n määritystä...

T.M. [23.06.2003 13:57:58]

#

hööm... ei täs oo mitää ideaa, helpompaa on vaa includaa jokaiseen PHP-tiedostoon kaks osaa, ylle yks ja alle toinen, ja sit keskelle sisältö, eikä tarvi tehä tommosii vaivallisii scriptei jotka sit pahimmas tapaukses alkaa bugaa jotenki todella oudosti..
noitten arraytten kirjottamisiin menee varmaa enemmän aikaa ku kahen includen pasteemiseen ;P bad idea...

odys [23.06.2003 14:35:55]

#

No te ette nyt kai tajunnut? Tonhan avulla ei edes tarvitse laittaa includeja. Teet vaan index.php:n ja laitat html koodin sinne ja sitten laitat tuon skriptin siihen kohtaan mihin sivut ladataan ja sen jälkeen kirjoitat vaan tekstit erillisiin tiedostoihin ja käytät vaikka tota funktiota tossa luomaan sen arrayn. Tämähän on ihan pirun kätevä.

Ja DSword tossa ei ole kyse semmoisesta vaan yksinkertaisesti tulostetaan sivulle, että sivua ei löydy.

Samanlaista skriptiä käytän omilla sivuilla.

http://jope.psykoosi.org/?sivu=taa_ei_toimi
http://jope.psykoosi.org/?sivu=etusivu

T.M. [23.06.2003 21:11:48]

#

kyllä mä tajusin, sun pitää tehä tiedostot, kirjottaa niitten nimet ja osotteet arrayhin... kaks includee on _mun_ mielestä selvempi, jepjep..

Olli Vanhoja [24.06.2003 18:23:04]

#

siis hetkinen includeeko toi sit halutun tiedoston indexin sisään jos olen divittänyt kaikki valikot reunoihin ja tämän keskimmäiseksi?
Tai parempi kai kokeilla itse, mutta vastatkaa silti :-S

odys [24.06.2003 20:59:03]

#

Öö.. en tajunnut oikein kysymystäsi?
Tämähän toimii esim näin: (Sivut tulee muotoon index.php?page=jotain)

<html>
<head>
<title>Testi</title>
</head>
<body>
<h2>Nämä on Jopen hienot kotisivut</h2>
<!-- PASTEA TÄHÄN YLLÄ OLEVA SKRIPTI -->
</body>
</html>

Nyt vain kirjoittelet tekstit erillisiin tiedostoihin ja ne latautuvat tekstin "Nämä on Jopen hienot kotisivut" tekstin alapuolelle.

Ja T.M. Jos include on mielestäsi selvempi niin tee vaikka näin:

<?php
  include("ylä.php");
?>
PASTEA TÄHÄN YLLÄ OLEVA SKRIPTI
<?php
  include("ala.php");
?>

Näin sinun ei tarvitse laittaa joka tiedostoon includeja?
Tämä säästää tilaakin koneelta jos nyt vähän viilaillaan :))

Sivuja on helpompi hallita ja skriptin mukana olevan funktion avulla ei edes arraytä tarvitse itse kirjoittaa.

Aivan erinomainen vaihtoehto jokaiselle.

Olli Vanhoja [24.06.2003 22:49:31]

#

Siis juurinoin olen tehnyt lähes :-P

odys [24.06.2003 22:51:09]

#

Ja sitten vain linkit sivuilla mutoon: http://osote.com/index.php?page=joku_sivu

Mitä se sanoo? Virheilmoitus? Muuten vain ei toimi?

Olli Vanhoja [24.06.2003 22:53:24]

#

Ahh, kiitti vähän jouduin tota säätää, mut thx nyt toimii loistavasti yhdistän viel ton "tyylisivun" niin, että ennen tuota includetan diviä (objektin paikan määritys (koordinaatit) avulla käyttäen tehdyn upean ulkoasun :-P

odys [24.06.2003 22:56:48]

#

Ok. :)

Olli Vanhoja [24.06.2003 23:00:54]

#

oli kyl tarkotus tonnefoorumii;-)

stalefish [25.06.2003 06:06:35]

#

*shooting myself because didnt know this earlier*

stalefish [25.06.2003 06:11:09]

#

<?php
  include("ylä.php");
?>
<?php
  include("pageload.php");
?>
<?php
  include("ala.php");
?>

voisiko noin tehdä? Ja olisko siitä minkäänlaista hyötyä?

stalefish [25.06.2003 06:49:27]

#

Sorry kun floodaan mutta vielä yksi kysymys kun tuhoan oman www-projektini täydellisesti ;p

Jos tekee näin (index.php):
<?php
include("ylä.php");
?>
*** tuo scripti ***
<?php
include("ala.php");
?>

niin täytyykö ne linkit olla tuossa keskellä vai voiko ne olla myös vaikkapa tuossa ylä.php tiedostossa?

stalefish [25.06.2003 08:06:21]

#

Kiitoksia Jopelle mahtavasta koodivinkistä =) Muutama tuntihan siinä vierähti ennen kuin ymmärsin täysin mitä ajoit takaa. Tuo kuitenkin toimii ja varsinkin kun heittää includet ylös ja alas ja tuon scriptin siihen väliin. Mutta hieman koodia joutui hiomaan omaa käyttöäni varten. Opiskelen juuri XML:ää ja PHP on jäänyt unohduksiin jo hieman yli vuodeksi, joten muisteltavaa on vielä paljon =p

Olli Vanhoja [27.06.2003 13:01:31]

#

Mulon ainaki yla.phpees ja ala.pahpees o sitte copyrigtit ;-)

odys [27.06.2003 13:34:17]

#

No kaikkien vapaaseen käyttöön tämä skripti täällä on :)
Enhän minä tänne muuten tätä olisikaan lisännyt.

k-mikko [28.06.2003 11:08:05]

#

Itselläni moinen toteutuu yksinkertaisesti switchillä.

URL on muotoa /www/index.php?sivu=etusivu tai vaikkapa /www/index.php?sivu=linkit

<?
switch($_GET['sivu']){
	case "etusivu": include("etusivu.php");
	break;
//	...ja näin edelleen mutta HUOM:

	default: include("etusivu");
	break;
//Eli jos tulee virheellinen sivuvalinta, näytetään etusivu.
}
?>

odys [28.06.2003 13:40:06]

#

Juu kyllä se onnistuu noinkin.. ihan samaa asiaa toteuttaa, mutta minun esimerkissäni on juuri se etu, että taulukon missä sivut ovat määritelty voi luoda automaagisesti kansiosta tuolla funktiolla.

odys [28.06.2003 13:50:17]

#

Niin ja tästähän näkee myös esimerkin rekursiivisestä funktion kutsumisesta. :)

Matti Kaijomaa [19.07.2003 07:12:08]

#

Frameja ne olla pitää :)

odys [19.07.2003 13:23:49]

#

No ei todellakaan ei niinkun mistään hinnasta. Framet pilaavat jokaisen sivun. iframe saattaa jossain tilanteessa olla ihan kätevä, mutta frameja ei tod käytetä.

Gwaur [11.08.2003 22:57:36]

#

frameja niiden ei olla pidä

OzKu1 [28.09.2003 17:58:53]

#

mul on mun sivuilla iframe ja ajattelin et tää laittais sen sivun siihen ifameen miten se toimis

feldon [28.10.2003 22:22:25]

#

Tuohan on hieno systeemi! Toistaiseksi olen naputellut arrayt käsin, mutta nyt sisällön pursuillessa hakemistoista ulos, olisi tarkoitus ottaa käyttöön tuo MakeArray-funktio. Mietityttää vaan, että mihin kohtaan tuota koodia tulisi määrittää hakemistopolku, josta tahdon tehdä arrayn? Ja miten? Osaisiko joku auttaa, odys kenties?

odys [30.10.2003 07:53:46]

#

MakeArray() luo globaalin taulukon, joka toimii kaikissa kohdissa koodiasi, funktioissa tietysti esittelet global $pages;

Laitat MakeArray ("polku/hakemistoon/missä/ladattavat/sivut/ovat/"); // Muista viimeinen / -merkki! ihan mihin kohtaan vaan sivua ennen kuin käytät sivunlataamis skriptiä.

feldon [01.11.2003 00:32:39]

#

Jepulis. Rupesinkin vääntämään polkua väärin ja olin ymmälläni kun ei toiminut. Sen jälkeen tutkin tarkemmin ja niinhän siitä puuttui tuo viimeinen merkki.

Kiitos siis kommentista! Ja ennen kaikkea suurkiitokset hienosta skriptistä - olet todella lahjakas.

operator [29.02.2004 12:45:42]

#

Miksi, oi miksi en saa tuota toimimaan yhdessä Apachen kanssa. Aina lykkää vain 404-virheilmoitusta, sitä skriptissä määriteltyä. Heti kun heitän tiedostot oikealle servulle, niin johan alkaa pelittää. Osaako kukaan auttaa? Apachen asetuksia muokkaamaan kenties?

aER0 [03.04.2004 18:21:04]

#

Mitenkäs tohon koodin pätkään sais toisen muuttujan lisäksi.
eli kun sivu on nyt ?page=members ni tulis ?page=members&name=pauli esim. ?

aER0 [03.04.2004 21:22:54]

#

lisäys edelliseen: siis nyt on vaik ?page=members ja sit siel sivul on linkki vaikka "pauliin" ja oon pistäny pauli.phpn arrayseen ja sen linkin muotoon ?page=pauli, niin se ei toimi. eli pitäs saada vaikka ?page=members&name=pauli

Margus [16.04.2004 09:35:55]

#

Siis pitääkö koodiin tehdä jotain muutoksia (osoitepolkuja) tai pitääkö luoda jotain tiedostoja/kansioita?
Ei mee perille...

m0nkei [19.06.2004 15:20:16]

#

ööh pirhana ei skulaa en tiedä mikä on vikana kun painan linkkiä alkaa lataamaan mutta haluttu teksti ei vai ilmesty tuo etusivun saan näkymään mutta linkit eivät skulaa =/

m0nkei [19.06.2004 15:28:33]

#

hmm siis eikös laitetaanko linkiksi ?sivu=jotain vaiko index.php?sivu=jotain kummallakaan tavalle ei toiminut tarvitseeko targetiksi jotain?

TETRIS [08.12.2004 17:46:26]

#

Molemmilla tavoilla pitäisi (siis olettaen, että tiedoston nimi on index.php) toimia. Olet tehnyt varmaankin jotain väärin.

Belaeryth [25.01.2006 18:30:00]

#

Kiitoksia koodista, todella pätevä ja yksinkertainen.

Oldeboy [07.02.2006 18:07:51]

#

Loistava koodi käytän itsekkin
Sivuilla: http://www.opypmk.fi on käytössä tuollainen koodi yhdeksällä muuttujalla. Muuten toimii hyvin , mutta Linkeistä tulee aika pitkiä...

ZcMander [09.06.2006 14:37:21]

#

Tossas on vain yksi vika: Entäs jso formista lähetetään POST tietoa, jonka pitäisi sitten mennä index.php?sivu=jokuihmejuu :n ei taida onnistua?

tsuriga [24.08.2006 22:43:13]

#

Hyvien koodaustapojen mukaisesti arrayn sekä funktioiden ensimmäiset kirjaimet voisi kirjoittaa pienellä sekä käyttää heittomerkkejä lainausmerkkien sijaan taulukon arvoihin viitatessa.

peg [23.03.2007 11:37:51]

#

Näinkin voi tehdä linkit metatageista ja yllä oleva esimerkki yhdistettynä tähän olisi näppärä.
linkitettävän tiedoston head osaan <META NAME="title" CONTENT="LINKIN NIMI"> ja alla oleva koodi sivulle, hakee
siis sivun linkin, tässä esimerkissä kaikista .phtml päätteisistä tiedostoista.

 <?php
	function Metatiedot($tiedostonimi)
	{
		$metatiedot = get_meta_tags($tiedostonimi);
		return $metatiedot;
	}
	$polku = "./";
	$hakemisto = opendir( $polku );
	while ( $tiedosto = readdir($hakemisto) )
	{
		if ( ereg("\.phtml",$tiedosto) ) // tiedosto tyyppi esim .htm
		{
		$meta = Metatiedot($polku . "/" . $tiedosto);
		print "<a href=\"$tiedosto\">$meta[title]</a><br>";
		}
	}
	closedir( $hakemisto );
	?>

romu [23.05.2007 23:24:47]

#

Sain toimimaan ensimmäisen koodin. Kun yritin tehdä sivusta väännöstä englanniksi, saan koko ajan 404- virheen.

englannin kielinen tiedosto on index2.php ja sijaitsee samassa juuressa index.php:n kanssa. Tiedoston ensimmäinen linkki osoittaa includes-kansioon, jossa englannin kielinen versio on muitten joukossa.

Vaikka kuinka silmät kipeinä tuijotan, en näe mitään rakenteellista eroa, mutta toinen ei toimi? Osoiterivillä näkyy jopa oikea osoite, mutta sisältö vain ei avaudu.

Jos joku ymmärtää tästä selityksestä, niin nöyrästi pyydän auttamaan..

moptim [29.05.2007 21:38:17]

#

odys, se jos osoite on vaikka \ros\kaa\?kebab niin se kokeilee oletuksena tämmöistä: \ros\kaa\index.php?page=kebab


Sivun alkuun

Vastaus

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

Tietoa sivustosta