Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kannan rakenne (ja includeongelma)

Sivun loppuun

SysRq868 [06.03.2007 22:57:30]

#

Informatiiviset otsikot - Osa MXXVII. (Mod. yritti auttaa.)

PHP+MySQL:llä kokeilu- ja harjoittelumielessä kun olen tässä sellaista yksinkertaista ostoskori-/tilausjärjestelmää pakertamassa, ajattelin, että miten olisi järkevintä sijoittaa tilaukset "orders"-nimiseen tauluun niin, että jokainen eri tilaus on omalla yhdellä rivillänsä? Muutenhan asia olisi selvää pässinlihaa, mutta yhdessä tilauksessa voi olla useampi tuote. Miten tämä olisi kaikista järkevintä toteuttaa? Tuotteilla on olemassa omat tietonsa "products"-taulussa, mutta tilausriville pitäisi aina tallentaa vähintään tuotteen tuotenumero (josta saa selville "products"-taulun avulla nimet ym.) ja tilauksenaikainen hinta (jotta tilausta myöhemmin tarkastellessa ei näy uusi hinta siellä, joka ei ole välttämättä se hinta, mitä tuotteesta on tilaushetkellä pulitettu). En välttämättä tarvitse suoraa koodia, pelkät ajatukset, selitykset ja yksityiskohtaiset teoriat riittävät.

Toinen kysymys taas on seuraava: miten PHP-tiedoston saisi tarkistamaan, onko itsensä includetettu? Toisin sanoen, minulla on seuraavanlainen koodi index.php:ssa:

(CSS, HTML)<?php
if(file_exists($_GET["action"].".php")){
    include($_GET["action"].".php");
} else {
    include("404.php");
}
?>(HTML)

Joten näin ollen kun menee osoitteeseen index.php?action=testi, se includettaa testi.php:n (ja taittaa sen CSS:n avulla), mikäli se on olemassa. No, samassa minulla saattaa olla esim. config.php, jota nyt välttämättä ei tarvitsisi includetella. Tällaisia "salaisia" tiedostoja on useampia ja niitä tulee varmasti lisää, joten joka ikisen lisääminen tuohon index.php:n ehtolauseeseen veisi aivan tuhottomasti aikaa. Tiedostoja ei voi siirtää toiseen kansioon (jolloin ehtolauseessa voisi olla vain kansion nimi ja jokerimerkki) tietyistä syistä. Siihen menisi vielä enemmän aikaa. Miten siis voisin ympätä testi.php:seen koodin, joka havaitsee pomminvarmasti (tai ainakin papattimatonvarmasti), onko ko. tiedosto näytetty jonkun toisen tiedoston (index.php) läpi includetettuna, vaiko eikö?

Kiittäen, allekirjoittanut.

Blaze [06.03.2007 23:38:23]

#

SysRq868 kirjoitti:

miten olisi järkevintä sijoittaa tilaukset "orders"-nimiseen tauluun

Hah, kuin suoraan viimevuotiselta oppitunnilta, jotain hyötyä tästä koulun penkillä istumisestakin :)
About noin: http://blaze.dyndns.ws/~blaze/tilaus_er-kaavio.png

SysRq868 kirjoitti:

Toinen kysymys taas on seuraava: miten PHP-tiedoston saisi tarkistamaan, onko itsensä includetettu?

Öö, toimisko

if(strpos(__FILE__, "{$_GET['action']}.php") === false) {
  echo 'ei olla tuossa filussa, includeta vapaasti!';
}

SysRq868 [07.03.2007 00:02:50]

#

Hienon hienosta kaaviosta en ymmärtänyt juurikaan mitään. Koulun penkille kun vasta viime kuun yhteishaussa hain. :)

Pienen hienosäädön jälkeen includetus tosin toimi, joten kädetönkään en ole... :F Kiitos siitä!

Antti Laaksonen [07.03.2007 00:22:47]

#

Tilauksen kaikkien tuotteiden id:t ja hinnat voi toki ahtaa yhdelle riville sopivasti muodostetun merkkijonon avulla, mutta parempi tapa taitaa olla ottaa käyttöön uusi taulu, jossa on eri tilausten tuotteita. Sinun tapauksessasi tässä taulussa voisi olla kullakin rivillä tilauksen id, tuotteen id ja tuotteen hinta tilaushetkellä. Sitten kun pitää saada selville kaikki tietyn tilauksen tuotteet, haetaan vain taulusta kaikki ne rivit, joilla on tietty tilauksen id. (Juuri tämä ajatus taitaa olla taustalla myös Blazen kaaviossa.)

Blaze [07.03.2007 00:38:16]

#

SysRq868 kirjoitti:

Hienon hienosta kaaviosta en ymmärtänyt juurikaan mitään.

Noi laatikot on siis tauluja, teksti niitten sisällä taulujen sarakkeita, ja niistä alleviivatut primary keyitä. Viivat laatikkojen välillä on noitten suhteita ("asiakkaalla voi olla monta tilausta", "jokaisella tilauksella on vain yksi asiakas"). Kuvion hieno nimi on entity relationship diagram, jos kiinnostaa googlettaa.

Kuten itsekin huomasit, tilaukseen ei suoraan voi kiinnittää useampia tuotteita, tämän takia tarvitaan tuo Tilausrivi-taulu siihen väliin.

Jos Antti Asiakas tilas Hilavitkuttimen ja USB-joulukuusen, kanta näyttäis suunnilleen tällaiselta:

Asiakas

IDNimi
5Antti Asiakas

Tilaus

TilausIDAsiakasID
15

Tilausrivi

TilausIDTuoteID
1100
1110

Tuote

IDNimi
100Hilavitkutin
110USB-joulukuusi

Merri [07.03.2007 01:01:20]

#

Eikös require_once() hoida tuon include-ongelman automaagisesti?

Blaze [07.03.2007 08:20:01]

#

Tosiaan joo, ja on huomattavan vähemmän purkka.

tkarkkainen [07.03.2007 10:07:20]

#

Jos ymmärsin tuon include-ongelman oikein, niin require_once() ei auta. Se ei näes ota mitään kantaa siihen, mitä tiedostoja saa incluudata.

Itse harrastin joskus sellaista, että määrittelin index.php:n yläpäässä muuttujan $included = 1; Sitten noihin salaisempiin tiedostoihin laitoin seuraavanlaisen koodin:

if ( !isset ( $included ) )
    die ( "error" );

Toimivuus toki edellyttää, että register_globals on poissa päältä (milloinkahan tätä voi alkaa pitää itsestäänselvyytenä?).

Lebe80 [07.03.2007 13:31:36]

#

tkarkkaisen (jos saan nimimerkkiä taivuttaa) esimerkin tapainen ratkaisu olisi myös käyttää defineä, niin kuin eräässä CMS:ssäkin:
define ("_included", 1 );

ja taas toisaalla käytetään:
defined( "_included" ) or die( "Direct Access to this location is not allowed." )

Itse taas tykkään, että kaikissa "inkludatuissa" tiedostoissa mitään ei ajeta suoraan, vaan kaikki "koodi" on joko luokan tai funktioiden sisällä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta