Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Sivujen toteutus - kumpi parempi tapa

Sivun loppuun

Olli [17.09.2011 13:06:12]

#

Hei,
kumpi näistä on parempi tapa sivujen toteutukseen:

include("up.php");
Sisältö tähän
include("down.php");

up.php tiedostoon yläosa
down.php tiedostoon alaosa


vai

$sivu = $_GET['sivu'];
$sivut = str_replace("/", "", $sivu); // vain tämä hakemisto sallittu
include("".$sivu.".php");

Tarkoitus olisi aloittaa koodaaamaan simppeliä verkkokauppaa.

qeijo [17.09.2011 13:23:01]

#

Molemmat ovat mielestäni huonoja ratkaisuja. (Varsinkin toi alempi kummallinen viritys) Käytä mielummin basename() - funktio.

Tee vaikka reititin joka parsii (mahdollisen) syötteen ja palauttaa ohjuri - scriptin nimen.

<?php

/** Ei testattu **/

function reitti()
{
    if(isset($_GET["sivu"]) AND file_exists("scripthakemistojokaeiolejulkisestisaatavilla/" . basename($_GET["sivu"]) . ".php")) {
            return basename($_GET["sivu"]) . ".php";
    }
    else {
        return "default.php";
    }
}

$scripti = reitti();

?>

Olli [17.09.2011 13:42:32]

#

Ok, mikä vika tuossa ylemmässä on?
Miten muuten ohjelmointiputkassa tämä on toteutettu? Antilla tai Laurilla tietoa?

qeijo [17.09.2011 13:49:01]

#

Olli kirjoitti:

Ok, mikä vika tuossa ylemmässä on?

Näkee jo koko kysymyksestä että sekin vaihtoehto olisi todennäköisesti fail.

Olli [17.09.2011 14:05:37]

#

Millä perusteella?

Teuro [17.09.2011 14:31:07]

#

qeijo kirjoitti:

Näkee jo koko kysymyksestä että sekin vaihtoehto olisi todennäköisesti fail.

Perustele toki väitteesi, koska minusta se on oleellisesti parempi, kuin sinun tekemäsi viritelmä.

qeijo [17.09.2011 14:40:05]

#

:D Voiko sitä kutsua edes ratkaisuksi kun se käytännössä ei tee yhtään mitään muuta kuin sisällyttää kaksi tiedostoa.?

<?php
include("up.php");
Sisältö tähän
include("down.php");
?>

Ja miten toi sisältö luodaan tuohon?

<?php
include("up.php");
include("sisalto.php");
include("down.php");
?>

kö? Vai onko se stattista? Joka tapauksessa tarvitset jonkinlaisen 'reitittimen' kaltaisen scriptin joka parsii käyttäjän syötteen. Ja minun esittämäni "viritelmä" toimisi siinä enemmän kuin hyvin. Vai oletko Teuro sitä mieltä että toi:

<?php
$sivu = $_GET['sivu'];
$sivut = str_replace("/", "", $sivu); // vain tämä hakemisto sallittu
include("".$sivu.".php");
?>

olisi parempi.

Teuro [17.09.2011 14:43:41]

#

No kysytäänpä sitten, että mitä muuta sen pitäisi tehdäkään? Tuolla tavalla saadaan jokaiselle sivulle samat perustoiminnot, jotka on helppo päivittää yhdestä paikasta kaikille sivuille. Haitallista koodia on käytännössä mahdotonta lisätä tuolla tavalla tehdylle sivulle.

qeijo kirjoitti:

Joka tapauksessa tarvitset jonkinlaisen 'reitittimen' kaltaisen scriptin joka parsii käyttäjän syötteen. Ja minun esittämäni "viritelmä" toimisi siinä enemmän kuin hyvin.

Miksi tarvitaan syöteparseri, jos kerran syötettä ei anneta, vaan sivut pyydetään sivun omalla nimella?

qeijo kirjoitti:

Vai oletko Teuro sitä mieltä että toi:

Tällaista en ole sanonut, vaan olen pyytänyt sinua perustelemaan väitteesi ratkaisun huonoudesta. Minusta tuokaan ei ole hyvä systeemi. Ensimmäinen esitetty idea on minusta toistaiseksi aivan riittävän hyvä.

qeijo [17.09.2011 14:45:10]

#

Nyt mä lähen uimahalliin.

Metabolix [17.09.2011 15:13:13]

#

Esitetyistä tavoista ensimmäinen on parempi muttei paras. Toisessa vaihtoehdossa osoitteista tulee rumia ja virhetilanteiden järkevä käsittely vaikeutuu huomattavasti.

Parempi ratkaisu olisi tämä:

<?php
require_once("sivupohja.php");

ylaosa("Otsikko");
echo "Juttua, juttua...";
alaosa();

Tällä tavalla sivun yläosa saa tarvitsemansa arvot selkeästi parametreina (ei tarvitse asettaa mystisiä muuttujia) eikä yläosan koodi pääse sotkemaan muita sivun muuttujia.

Seuraava koodi esittelee erään tyypillisen virheen:

<?php
// Haetaan tietokannasta jotain sisältöä sivulle. Tämä pitää tehdä ennen
// sisällön tulostamista, jotta virhetilanteesta saadaan tulostettua siisti
// virheilmoitus ja oikea status (esim. 404, jos tietoa ei löydy).
list($otsikko, $teksti) = hae_juttu($_GET["id"]);

// Tulostetaan yläosa.
$otsikko = "Uutiset";
include("yla.php");

// Tulostetaan sisältö.
// Mutta kas, $otsikko ei olekaan enää jutun otsikko vaan teksti "Uutiset"!
echo "<h1>", htmlspecialchars($otsikko), "</h1>";
echo "<p>", htmlspecialchars($teksti), "</p>";

include("ala.php");

Tässä siis käytetään vahingossa väärää muuttujaa. Toki näin räikeä virhe on kohtalaisen helppo huomata itsekin, mutta jos arvoa muutetaan yla.php:ssä, virheen löytäminen voi olla hankalampaa. Siksi näitä include-kikkailuja kannattaa välttää. Funktiot on tehty käytettäviksi.

Olli [17.09.2011 16:12:08]

#

Tuo väärän muuttujan käyttö on ihan totta. Taidan silti pitäytyä tuossa omassa 1. ratkaisussani.

toinen ongelma:

Minulla on seuraava kansiorakenne:

-päähakemisto
--sivut
---sivu1
---sivu2
---sivu3

Päähakemistossa on htaccess-tiedosto. Haluaisin että htaccess-tiedoston tietyt koodit eivät olisi käytössä sivu3-kansiossa.
Tämä johtuu mod_rewrite ongelmista.

Joten miten saisin poissuljettua tietyn hakemiston?

qeijo [17.09.2011 20:48:15]

#

Teuro kirjoitti:

Miksi tarvitaan syöteparseri, jos kerran syötettä ei anneta, vaan sivut pyydetään sivun omalla nimella?

Jos kyseessä ei ole yhden näkymän sivu, niin tarvitaan ylemmässäkin "ratkaisussa" jossain syöteparseri jolla käsitellään url:in query - osaa.

punppis [18.09.2011 21:27:11]

#

Itse käytän lähes poikkeuksetta tuota include top/bottom -systeemiä. Jos tarvitsee selata sivuja ajaxilla niin silloin tuo index.php:n sisällä includettaminen on mielestäni fiksumpaa.

Tuon qeijon koodikikkare on käytännössä sama asia kuin käyttäisi includea. Miksi se tarvitsisi kierrättää jonkun funktion kautta?

qeijo: ideana on siis pitää jokainen käyttäjälle näkyvä sivu erillisenä php-tiedostona. jokaiseen includetaan tuo top ja bottom, josta tulevat html:t ennen dynaamista sisältöosuutta ja sen jälkeen.

Osoitteen kauneudesta ei mielestäni kannata välittää, koska sen saa mieleiseksi mod_rewritellä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta