Olen ohjelmoinut tavallisia ohjelmia (Q/Basic, C) ja Excel-sovelluksia, mutta nyt kun on aikaa, yritän aloitella webbiohjelmointia. Aluksi olisi tavoitteena:
- tekstitiedosto (tai vaikkapa MYSQL-kanta), jossa on sarakkeissa tietoa, esim. 1 RUOKA1 ja sen aineet AINE1, AINE2, AINE3 jne, sekä lyhyt valmistuohje. Seuraavalla rivillä 2 RUOKA2 jne.
- selaimen käyttäjä antaa jonkun rivin numeron ja saa sivun, jossa on ruuan nimi ja sen raaka-aineet (taulukko).
- käyttäjä valitsee sivulta jonkin aineen, vaikka AINE2 ja nyt pitäisi avautua samalle sivulle toinen taulukko, jossa on lista RUOKAX, RUOKAY, RUOKAZ jne, joissa tämä AINE2 esiintyy.
- käyttäjä voi sen jälkeen valita jonkin muun aineen, vaikka AINE5 ja nyt taulukko päivittyy, ja siinä on lista RUOKAX, RUOKA1, RUOKA8 jne, joissa tämä AINE5 esiintyy.
- ja tästä listasta pitäisi voida valita joku ruoka, esim RUOKAY, jolloin avautuu tämän RUOKAY:n vastaava sivu.
- valmistusohje voisi olla heti sivulla tai siinä on linkki, josta se avautuu (esim. pop-up tai erillinen ikkuna).
Sitten kysymys: Millä työkaluilla tämä kannattaisi toteuttaa?
Miten kannattaisi aloittaa? Malleja?
Varsinainen taulukko pitäisi olla selainkäyttäjien saavuttamattomissa, käyttöliittymän kautta näkyviin tulee yksi ruokasivu kerrallaan ja niissä voi siis seikkailla.
PHP ja HTML on jonkin verran tuttuja. Tarkoitus ei ole tehdä siis jokaisesta ruuasta omaa HTML-sivua.
Voit tehdä tuon helposti millä tahansa web-ohjelmointiin sopivalla kielellä. PHP on sikäli luonteva valinta, että se toimii käytännössä kaikilla palvelimilla, mutta jos vaihtoehtoja suinkin on ja jokin muu kieli kiinnostaa, valitse vapaasti.
Aloita suunnittelemalla tietokanta ja tarvittavat hakukyselyt. Muista hyvät koodaustavat eli kirjoita toiminta ja näkymä erikseen ja suorita kaikki sivun toiminnallisuus (esim. tietokantahaut), ennen kuin rupeat tulostamaan sisältöä.
Tietokannassa esittämäsi yhden taulun systeemi olisi kohtalaisen huono, koska eri ruoissa on eri määriä aineksia, minkä vuoksi sarakkeita tarvittaisiin varalta hirveä määrä (ja useimmat jäisivät yleensä tyhjiksi). Hyvä ratkaisu olisi tehdä erikseen taulu aineksista, taulu ruoista (ohjeineen) ja yhdistävä taulu, jossa olisi yksi ruoka, yksi tarvittava aines ja aineksen määrä. Esimerkiksi kaurapuuro tallentuisi tauluihin näin:
aines:
1: vesi
2: kaurahiutaleet
ruoka:
1: kaurapuuro, "kuumenna vesi kiehuvaksi, lisää hiutaleet, sekoita"
ruoka_ja_aines:
1: 1: 0,5 litraa
1: 2: 0,2 litraa
Tällä kaavalla samanlainen aines esiintyisi tietokannassa vain kerran eikä ainesten määrää ruoassa ole ennalta määrätty. Lisäksi tällaisesta tietokannasta olisi helppo hakea ruokia, joissa on tai ei ole tiettyjä aineksia.
Aivan erinomaista. Olin kertomassa ainemäärät tekstissä, mutta tietenkin parempi näin! Aiemmin olen käytännössä toiminut aina yhden tietokannan varassa, ei ole ollut muuhun tarvetta.
Pohdituttaa vielä se, että miten esimerkiksi sivulle "kaurapuuro" generoituu toiminto, että klikkaamalla sanaa "kaurahiutaleet" toteutuu haku muihin ruokiin, joissa on kaurahiutaleita. Olen PHP:llä toteuttanut yksinkertaisia hakuja, mutta en niiden tuloksiin generoituvia eteenpäin johtavia linkkejä, kun jostain syystä olen ollut käsityksessä, että se ei ole mahdollista.
Tästä dynaamisuudesta jos olisi hyviä esimerkkejä, oikein simppeleitä - sellaisia jotka voisi ymmärtää.
Luulen, että avain sana kyselyyn sinulla on LIKE
esim :
$k ="SELECT id, aines FROM aines WHERE aines LIKE '%kaurahiutale%'"; if(!$t = mysql_query($k)) return; while($row = mysql_fetch_assoc($t)){ $id = intval($row['id']); $ruoka = htmlspecialchars($row['ruoka']); echo '<a href="jokinosoite.php?id='.$id'.">'.$ruoka .'</a>'; }
Jos oikein ymmärsin mitä haet takaa! (ei testattu)
mercier kirjoitti:
Pohdituttaa vielä se, että miten esimerkiksi sivulle "kaurapuuro" generoituu toiminto, että klikkaamalla sanaa "kaurahiutaleet" toteutuu haku muihin ruokiin, joissa on kaurahiutaleita.
Tällöin vain otat kaurahiutaleiden juoksevan id-numeron (jonka olet saanut samalla, kun listaat kyseisen ruoan käytettyjä ruoka-aineita) ja listaat kaikki ruoat, joissa tämä id esiintyy. Tietokannalla tämä on vain yksi haku, joten se onnistuu erittäin yksinkertaisesti.
manninen, vapaassa tekstissä ja LIKE-haussa on montakin huonoa puolta:
Eli kyllä kunnollinen tietokantarakenne auttaa.
Linkki eteenpäin näyttäisi yksinkertaisesti tältä: <a href="aine.php?id=123">kaurahiutaleet</a>
, missä 123 on kaurahiutaleiden id tietokannassa. Jotta linkki olisi kävijälle mukavampi, voit toki tehdä linkin myös aineksen nimellä tai lisätä nimen linkkiin aivan ylimääräisenä tietona (vaikka id=123-kaurahiutaleet
, jolloin PHP:ssä intval-funktiolla saa erotettua numeron).
Jos haluat joskus laajentaa systeemiä, voit liittää ainessivuille (ainakin erikoisempiin) vielä kuvaukset aineksista itsestään, esimerkiksi historiaa tai tietoa mahdollisista allergioista. Lisäksi voit tehdä neljännen taulun, johon käyttäjät voivat syöttää ainesten hintoja (ja eri merkkien laatuarvioita), jolloin kävijä saa oudommastakin purkista jonkinlaisen ennakkokäsityksen.
Alankohan aavistaa logiikkaa.. Tuo laajentaminen tulee toki mieleen heti, kun yhden toimivan viritelmän saan tehtyä, niin käy joka projektissa :-) Sivusto olisi siis:
KAURAPUURO
Ohje: Kuumenna vesi kiehuvaksi, lisää hiutaleet, sekoita.
Aineet:
- Vesi 0,5 litraa
- Kaurahiutaleet 0,2 litraa
Ja kun käyttäjä klikkaa kohtaa "- Kaurahiutaleet", sivusto näyttää tältä (vesi vastaavasti tulostaisi melkein kaikki ruuat):
KAURAPUURO
Ohje: Kuumenna vesi kiehuvaksi, lisää hiutaleet, sekoita.
Aineet:
- Vesi 0,5 litraa
- Kaurahiutaleet 0,2 litraa
Muut, joissa aineena Kaurahiutaleet:
- Kaurapulla (ja tässä linkki joka tekee sivun Kaurapulla)
- Kauramysli (ja tässä linkki joka tekee sivun Kauramysli)
Dynaamisuudessa on jokin pieni? juttu mitä en vielä tajua, kun sellaisen kanssa en ole ollut (tietääkseni) koodin puolelta tekemisissä. Tätä linkkiä ei siis kirjoiteta käsin, vaan miten se synnytetään tietokannasta? Toisessa ruuassa voi olla 5 ainesosa.
<a href="aine.php?id=123">kaurahiutaleet</a>
Jokseenkin näin...
Ennen tuota sinun pitää lukea tietokannasta haluttu rivi taulukkoon $aine
.
Aihe on jo aika vanha, joten et voi enää vastata siihen.