On tullut muutaman vuoden jälkeen tarvetta palata webohjelmoinnin pariin. Aikaisemmin tein sivut phpllä jolla toteutin sivustontaustalle hallintajärjestelmän, css-tiedostojen muokkasjärjestelmän,kolmiportaisen menun, kuvagallerian ... kaikki perustui tekstitiedostoihin.
Olen sen verran sivustaseurannut, että tietokannat näyttävät tulleen lisäksi tätä hommaa. Keskustelua haluan herättää sen takia, että saan selville kannattaisiko alkaa opettelemaan tätä tietokantahommaa.
Olenko siis ymmärtänyt oikein. että nykyisissä isoissa sivustoissa ei ole tälläisiä tekstitiedostoja ollenkaan vaan "sivut" on tallennettu kokonaisuudaan tietokantaan.
Onnistuuko näin tehtynä mm. tietojen muuttaminen helpommin. Yhtenä syynä miksi tietokannat saattaisi tulla tarpeeseen on se, että nykyinen kokonaisuus minulla on niin sekalainen ja laaja, että näin vuosien tauon jälkeen on vaikea päästä perille systeemistä ja kun tämä olisi vain laajenemaan päin.
hauki kirjoitti:
Keskustelua haluan herättää sen takia, että saan selville kannattaisiko alkaa opettelemaan tätä tietokantahommaa.
Kannattaa.
hauki kirjoitti:
Olenko siis ymmärtänyt oikein. että nykyisissä isoissa sivustoissa ei ole tälläisiä tekstitiedostoja ollenkaan vaan "sivut" on tallennettu kokonaisuudaan tietokantaan.
Templaatteja, kuvia ja muuta vastaavaa harvemmin kantaan tallennetaan, mutta tekstimuotonen sisältö yleensä joo.
hauki kirjoitti:
Onnistuuko näin tehtynä mm. tietojen muuttaminen helpommin.
No ei käytön helppoudessa hyvin tehtyyn tekstitiedostosysteemiin mitään eroa ole mutta luotettavampi ja skaalautuvampi se ihan oikea tietokanta on.
Mites hakkerointimahdollisuudet eroaa? Entä saako tietokannasta mitään varmuuskopiota omalle koneelle. Tekstitiedostothan on helppo ottaa omallekoneelle talteen.
Jos koodaat hyvin, varsinaisia murtomahdollisuuksia ei ole kummassakaan. Jos koodaat huonosti, sekä tietokannasta että tiedostoista voi varastaa dataa, yleensä tiedostoista helpommin. Huonosti suunnitellun tiedoston (eli aika monet aloittelijoiden tiedostot) saa myös helposti solmuun niin, että sivusto lakkaa toimimasta tai sivulle tulostuu jotain omituista. Muutenkin tiedostojen kanssa on paljon enemmän ongelmia mm. yhtäaikaisten käyttäjien kanssa.
Tietokanta on helppo varmuuskopioida.
Pienelle sivustolle harkitsemisen arvoinen vaihtoehto on myös SQLite-tietokanta, joka asustaa näppärästi yhdessä tiedostossa eikä vaadi erillistä palvelinsovellusta. Tietenkin suorituskyky on heikompi kuin "oikeilla" tietokannoilla.
PHP:ssä tietokantoja kannattaa käyttää PDO-rajapinnan kautta, kuten Ohjelmointiputkan MySQL-oppaan alussa neuvotaan.
Metabolix kirjoitti:
SQLite-tietokanta, joka asustaa näppärästi yhdessä tiedostossa eikä vaadi erillistä palvelinsovellusta
Ei vaadi erillistä palvelinsovellusta? Eli vaikka palvelin ei tue MySQLia(mulla juuri näin) niin pystyn silti käyttämään? Onko ohjelmointi samanlaista kuin MySQLissa?
Millasessa ne liten rajat sitten tulee vastaa? Entä meneekö duuni liten kanssa hukkaan, jos huomaan, että tarviin MySQL?
hauki kirjoitti:
Metabolix kirjoitti:
SQLite-tietokanta, joka asustaa näppärästi yhdessä tiedostossa eikä vaadi erillistä palvelinsovellusta
Ei vaadi erillistä palvelinsovellusta? Eli vaikka palvelin ei tue MySQLia(mulla juuri näin) niin pystyn silti käyttämään? Onko ohjelmointi samanlaista kuin MySQLissa?
Millasessa ne liten rajat sitten tulee vastaa? Entä meneekö duuni liten kanssa hukkaan, jos huomaan, että tarviin MySQL?
SQL-kieli on universaali standardi. MySQL ei ole kieli vaan tietokantamoottori, joka osaa suorittaa SQL-kyselyitä. Toki jokaisessa toteutuksessa on omat laajennuksensa, joita muut eivät tue, mutta veikkaan ettei harrastelija kovin montaa näistä ominaisuuksista tule koskaan kaipaamaan.
SQLiten kanssa tehty työ ei mene hukkaan, jos haluat vaihtaa tietokannan MySQL:iin joku päivä. Minulla on kehityksen alla yksi softa, jossa voi valita backendiksi joko SQLiten tai MySQL:n, ja yksinkertaisesti ajan samat kyselyt kummankin kannan kohdalla mitään muuttamatta. Joudun tosin tekemään jotkin kyselyt vähemmän tehokkaiksi, koska SQLite on jokseenkin pelkistetty eikä tue kaikkia hienouksia, mitä kehittyneemmät tietokantamoottorit osaavat.
Ja koska netti koostuu lähinnä kloonatusta tiedosta, minusta on tyhmää tehdä yhtään lisää kopioita. Siispä sen sijaan, että me tänne kloonattaisiin sinulle SQLiten dokumentaatiota, voit silmäillä niitä itse. Tässä yksi SQLiten peruspuutteista.
SQL-kieltä käyttäviä tietokantoja ovat mm. PostgreSQL, MySQL ja SQLite, joista kaksi ensin mainittua ovat palvelinpohjaisia tietokantoja ja SQLite ainoa ilman erillistä palvelinta toimiva. Peruskyselyt toimivat kaikissa aivan samalla tavalla, joten suurin osa koodista toimii ilman muutoksia missä tahansa näistä, kunhan käytät PDO-rajapintaa.
SQLiten "rajat" tulevat takuulla vastaan paljon myöhemmin kuin jossain omassa tiedostoviritelmässäsi. Esimerkiksi Firefoxin selaushistoria tallentuu SQLite-tietokantaan, ja siinä on jo varmaan enemmän tietoa kuin sinun harrastussivustollasi.
Eräs SQLiten erikoisuus kannattaa kuitenkin muistaa: se ei välitä eri tietotyypeistä lainkaan, joten vääränlaisen tiedon tallentaminen ei tuota virheilmoitusta, vaan tieto tallentuu ja voi siis aiheuttaa odottamattomia häiriöitä järjestelmässä. Kannattaa siis kirjoittaa koodi kerralla kunnolla. Toinen puute on, että SQLite ei tunne eri merkistöjä (kuten ei myöskään PHP) vaan käsittelee dataa sellaisenaan (tavuina).
Metabolix kirjoitti:
SQLite ainoa ilman erillistä palvelinta toimiva. P
Mitä toi nyt käytännössä tarkottaa. Minne ne tiedot tallentuu? Mistähän pääsisi alkuun? Yritin googletella SQLiteä, mutta ei ihmeitä löytyny?
Seuraava olisi käsittääkseni sivusto tietokannassa. esim??
+------------------------+--------------+-----+ |id |sijoittelu menussa |sivun otsikko |dataa| |----+-------------------+--------------+-----+ |1 | 1:2:2 |Etusivu | ... | |2 | 1:2:3 |Tokasivu | ... | |3 |2:1:1 |kolmasivu | .. |
hauki kirjoitti:
Mitä toi nyt käytännössä tarkottaa. Minne ne tiedot tallentuu? Mistähän pääsisi alkuun? Yritin googletella SQLiteä, mutta ei ihmeitä löytyny?
Itsellä kokemusta vain MySQL:ästä, mutta olettaakseni tiedot tallentuvat SQL-päätteiseen tiedostoon MySQL:n tavoin. Googlesta löytyy varmasti jokin opas tähänkin, etsi vain sinnikkäästi.
Täällä on ainakin jotain dokumentaatiota:
http://www.sqlite.org/
Ilman erillistä palvelinta toimiminen tarkoittaa, että SQLite toimii vastaavalla periaatteella kuin sinun tiedostoviritelmäsi (paitsi tietenkin varmemmin ja tehokkaammin), toisin kuin MySQL, joka toimii täysin PHP:stä erillisenä palvelinohjelmana taustalla ja esimerkiksi pitää osaa tiedostoista jatkuvasti muistissa, jotta haku olisi nopeampi.
SQLiten käyttö vaatii tietenkin, että palvelimelle on asennettu SQLite-tuki (PHP:ssä laajennos pdo_sqlite). Ei sitäkään välttämättä kaikilla palvelimilla ole.
Seuraava koodi esittelee lyhyesti SQLiten käyttöä PHP:llä PDO-rajapinnan kautta:
<?php // Avataan tietokanta. $pdo = new PDO("sqlite:tietokanta.sqlite"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Luodaan tietokantaan taulu. $pdo->exec(" CREATE TABLE IF NOT EXISTS testi ( id INTEGER PRIMARY KEY AUTOINCREMENT, juttu TEXT ) "); // Lisätään tauluun rivejä. $lisays = $pdo->prepare("INSERT INTO testi (juttu) VALUES (?)"); $lisays->execute(array("testijuttu")); $lisays->execute(array("toinen testijuttu")); // Haetaan rivi id:llä 1. $haku = $pdo->prepare("SELECT * FROM testi WHERE id = ?"); $haku->execute(array(1)); $rivit = $haku->fetchAll(PDO::FETCH_ASSOC); if (empty($rivit)) { echo "Ei osumia!\n"; } else foreach ($rivit as $rivi) { $id = $rivi["id"]; $juttu = $rivi["juttu"]; echo "Juttu {$id}: {$juttu}\n"; }
Muista laittaa tietokantatiedosto turvalliseen paikkaan niin, ettei sitä voi nettiselaimella ladata!
Jee, sehän toimii. Pääsen harjoittelemaan
Joo. Pääsin ton esimerkin ja oppaan avulla aikahyvin perille kuinka homma pelittää.
Vielä siitä, kun nyt tallentuu palvelimelle tiedostoja, jotka tallentuu tiedosto.sqlite, niin onko toi tiedosto myöhemmin mahdollisesti yhteensopiva MySQLin kanssa. Jos mulla on koko sivusto tossa tiedostossa niin aika homma siirtää uuteen.
On muuten hyvä toi SQLite Database browser. Pystyy vaikkapa muokkaamaan sivua jollain editorilla ja laittamaan ton ohjelman avulla tietokantaan.
EDIT:Onhan tietty mahdollista tehä ohjelma, joka kopioi tietokannan MySQl yhteensopivaksi.
Siis et kai tunge HTML-sivuja tietokantaan? Yleensä niin ei kannata tehdä.
Jokaisen tietokantajärjestelmän tiedostot ovat erilaiset, mutta ei tosiaan ole iso vaiva siirtää tietoja pienellä skriptillä. Monista tietokannoista saa myös jollain työkalulla ulos SQL-koodin, jonka voi sitten suoraan ajaa toisessa tietokannassa.
Metabolix kirjoitti:
Siis et kai tunge HTML-sivuja tietokantaan? Yleensä niin ei kannata tehdä.
Tietokantaan ajattelin laittaa sivukohtaisen muuttuvan sisällön. Kuvagalleriat ym. php koodia sisältävät toisin tietysti muuten, mutta html tageja tietokantaan tulisi otsikko, linkki ja kuvatagien muodossa.
Jotenkin näin ehkä tulisi +------------------------+----------------+------------------------+ |id |sijoittelu menussa |otsikko menussa |Sivukohtainen sisältö | |----+-------------------+----------------+------------------------+ |1 | 1:2:2 |Etusivu |<h1>Etusivu</h1>Tekstiä | |2 | 1:2:3 |Tokasivu | ... ............... ..| |3 | 2:1:1 |kolmasivu | .. .................. |
Parempia ideoita otetaan vastaan, projekti vasta niin alussa, että kaikki mahdolllisuudet vielä auki
Toteutus on melkein aina väärin, jos kannasta löytyy mitään muuta kuin laskennallista tai informatiivista dataa. Ota se HTML pois sieltä, muotoilut hoidetaan PHP:llä tai sitten suoraan kovakoodataan jonnekin sisältötiedostoon.
The Alchemist kirjoitti:
Toteutus on melkein aina väärin, jos kannasta löytyy mitään muuta kuin laskennallista tai informatiivista dataa. Ota se HTML pois sieltä, muotoilut hoidetaan PHP:llä tai sitten suoraan kovakoodataan jonnekin sisältötiedostoon.
Minuakin kiinnostaisi tietää, että miten pystytään säilyttämään sivujen muotoilut, ellei niitä tallenneta tietokantaan joko html-tageina tai sitten vaihtoehtoisesti jollain ubb-tageina yms... Miten esim. Drupal tai Joomla! homman hoitaa?
Triton kirjoitti:
The Alchemist kirjoitti:
Toteutus on melkein aina väärin, jos kannasta löytyy mitään muuta kuin laskennallista tai informatiivista dataa. Ota se HTML pois sieltä, muotoilut hoidetaan PHP:llä tai sitten suoraan kovakoodataan jonnekin sisältötiedostoon.
Minuakin kiinnostaisi tietää, että miten pystytään säilyttämään sivujen muotoilut, ellei niitä tallenneta tietokantaan joko html-tageina tai sitten vaihtoehtoisesti jollain ubb-tageina yms... Miten esim. Drupal tai Joomla! homman hoitaa?
CSS määrittelyillä? :o
qeijo kirjoitti:
Triton kirjoitti:
The Alchemist kirjoitti:
Toteutus on melkein aina väärin, jos kannasta löytyy mitään muuta kuin laskennallista tai informatiivista dataa. Ota se HTML pois sieltä, muotoilut hoidetaan PHP:llä tai sitten suoraan kovakoodataan jonnekin sisältötiedostoon.
Minuakin kiinnostaisi tietää, että miten pystytään säilyttämään sivujen muotoilut, ellei niitä tallenneta tietokantaan joko html-tageina tai sitten vaihtoehtoisesti jollain ubb-tageina yms... Miten esim. Drupal tai Joomla! homman hoitaa?
CSS määrittelyillä? :o
Vaatiihan se css:kin sen, että jotain on määritelty html-tageina:h1,div,class,li.... hyperlinkeistä puhumattakaan
//Hyvin basic esimerkki.. /* Palvelimella: /htdocs/sivu/index.php /htdocs/sivu/tyyli.css /htdocs/sivu/kantayhteys.php /htdocs/sivu/valikko.html /htdocs/sivu/sisalto/etusivu.html /htdocs/sivu/sisalto/tuotteet.html /htdocs/sivu/sisalto/palvelut.html /htdocs/sivu/tuotekuvat/ /htdocs/sivu/.htaccess */ //index.php tiedosto <html> <head> <link rel="stylesheet" href="tyyli.css" type="text/css" media="screen" /> <title>Minun loistava esimerkkini taas..</title> <?php include("kantayhteys.php"); ?> </head> <body> <?php include("valikko.html"); if(!isset($_REQUEST[sivu])) { $sivu="etusivu.html"; } else { $sivu = $_REQUEST[sivu].".html"; } if(is_file("/htdocs/sivu/sisalto/".$sivu)) { include("sisalto/".$sivu); } else { print('<div class="errori">Hakemaasi sivua ei löytynt!</div>'); } mysql_close($yhteys); ?> </body> </html> //valikko.html tiedosto <a href="/sivu/etusivu">Etusivu</a> <a href="/sivu/tuotteet">Tuotteet</a> <a href="/sivu/palvelut">Palvelut</a> //tyyli.css tiedosto
#body { background-color: #e2e2e2; } div.sisalto { background-color: blue; color: #fff; } div.errori { color: red; background-color: pink; border: 1px dotted red; }
//.htaccess tiedosto (Olettaen että on mod_rewrite käytössä palvelimella) RewriteEngine on RewriteRule ^sivu/([^/\.]+)/?$ index.php?sivu=$1 //kantayhteys.php tiedosto $yhteys = mysql_connect('localhost', 'kayttaja', 'salasana'); mysql_select_db('kanta'); //etusivu.php tiedosto <div class="sisalto"> <p>Etusivun tiedot:</p> <div class="etusivu"> Tämä on etusivun rakenne. Tätä ei (minusta) kannata tukkia kantaan. <p>Kannasta haetaan dynaaminen sisältö kuten esim:</p> <div class="jokutyyli"><?php include "kayttajan_tiedot.php"; ?></div> <div class="jokutyyli"><?php include "kayttajan_tilaukset.php"; ?></div> </div> </div> //tuotteet.php tiedosto <div class="sisalto"> <p>Sivuston tuotteet:</p> <?php $vastaus = mysql_query("SELECT * FROM tuotteet"); while($tuote=mysql_fetch_array($vastaus)) { print('<p>Tuote: '.$tuote[nimi].' Maksaa:'.$tuote[hinta].' euroa. <img src="../tuotekuvat/'.$tuote[kuva].'"></p>'); } ?> </div> //palvelut.php <div class="sisalto"> <p>Sivuston palvelut:</p> <?php $vastaus = mysql_query("SELECT * FROM palvelut"); while($palvelu=mysql_fetch_array($vastaus)) { print('<p>Palvelu: '.$palvelu[nimi].' Maksaa:'.$palvelu[hinta].' e/h.</p>'); } ?> </div> Eli tieto kannasta, tyylit ja tagit 'kovakoodatut'..
Miksei html sisältäisi muotoilua ja sisältö noudetaan vain tietokannasta kyseisten muotoilujen sisään?
<h1> <?php echo $otsikko; ?> </h1>
Jos välttämättä tarvitsee muotoiluja tallentaa tietokantaan (foorumi / vieraskirja) kannattanee käyttää esim. BBCodea jolloin tietokannasta tulostettaessa voidaan tulostettavat asiat ajaa suoraan htmlspecialchars-funktion lävitse jonka jälkeen parsitaan BBCode-tageille oikeat tagit. Näin ollen jos muutkin käyttäjät pystyvät sisältöä muokkaamaan tai lisäämään voidaan välttää XSS-aukot.
Asiasta seitsemänteen niin nykyäänhän on paljon tarjolla wysiwyg editoreita upotettavaksi nettisivulle. Jos käyttäjä tällaisella editorilla tuottaa html-koodia, niin onko mitään järkeä lähteä sitä muuntamaan BB-codeksi tms kantaan?
Toki siitä asiakkaan tarjoamasta HTML-paskeesta pitää parsia pois muut kuin luvalliset tagit...
Othnos kirjoitti:
Miksei html sisältäisi muotoilua ja sisältö noudetaan vain tietokannasta kyseisten muotoilujen sisään?
<h1> <?php echo $otsikko; ?> </h1>Jos välttämättä tarvitsee muotoiluja tallentaa tietokantaan (foorumi / vieraskirja) kannattanee käyttää esim. BBCodea jolloin tietokannasta tulostettaessa voidaan tulostettavat asiat ajaa suoraan htmlspecialchars-funktion lävitse jonka jälkeen parsitaan BBCode-tageille oikeat tagit. Näin ollen jos muutkin käyttäjät pystyvät sisältöä muokkaamaan tai lisäämään voidaan välttää XSS-aukot.
Esimerkki (konvertoi tietokanta-ajatteluun):
<article id="blog_entry_238"> <h1>Otsikkoteksti</h1> <footer>Julkaistu <time datetime="yyyy-mm-ddThh:mmZ">hetki sitten</time></footer> <p>Blah <em>blah</em>...</p> <ul> <li>Jonkin listan 1. alkio</li> <li>Ja toinen...</li> </ul> <p>Blah blah..</p> <figure> <img src="..." alt="..."> <figcaption>tekstiä...</figcaption> </figure> <!-- ... ---> </article>
Osa ideoista taipuu kantaan helpommin, osa vaatii jonkinlaisen merkkauksen säilyttämistä myös säilötyssä tekstissä. Huomioon pitää ottaa myös parsimisen helppous presentaatiovaiheessa: esimerkiksi listan - numeroidun ja numeroimattoman - voi säilöä puhtaasti tekstinä; se, kannattaako näin tehdä, on mielipidekysymys.
Bbcode on kyllä ihan mahdollinen vaihtoehto. Sitä joskus käytinkin, kunnes kehitin wysiwyg-editorin sivun päivitykseen. Tietty vois siitä tulevat tagit kääntää bbcodeksi tietokantaan.
Ja ton otsikon toki voi otta eriseen tietokantaa, mutta lihavoinnit ym. tuntuisi vaativan jonkin merkkauksen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.