Olen hieman hukassa miten meikäläisen kannattaisi alkaa rakentamaan sivustoa, ja toivon teiltä paremmin asioista perillä olevilta putkalaisilta ideoita ja vastauksia ko. projektiini. Eli tarkoitukseni on tehdä sivusto, jonka lähes kaikki tieto tulisi MySQL-kannasta. Sivuille tulisi mm:
- Ottelut: Tuhansia otteluiden tuloksia kausittain jaoeltuina, joita klikkaamalla pääsisi ottelun tapahtumiin käsiksi (maalintekijät, jäähyt, kokoonpanot yms).
- Pelaajat: Jokaiselle pelaajalla tulisi oma sivu, jossa on tietoja ko.pelaajasta, lista pelatuista otteluista ym. tilastoja. Pelaajia on myös tuhansia.
- Tilastot: Erillinen tilastosivu, johon lasketaan tulosten ja tapahtumien perusteella erilaisia tilastoja: sarjataulukot, pistepörssit jne.
Mulla on MySQL -kannassa pian kaikki tarvittava tieto ja pian pitäisi alkaa saamaan se sieltä järkevästi ulos. Pistetään vinkkiä miten se suurinpiirtein sieltä löytyy:
- Pelaajat: id, nimi, pelipaikka, kansalaisuus jne.
- Joukkue: id, nimi, kaupunki jne.
- Ottelut: id, pvm, koti(joukkue_id), vieras(joukkue_id), kotimaalit, vierasmaalit, yleisömäärä jne.
- Maalit: id, ottelu_id, joukkue_id, aika, maalintekijä(pelaaja_id), syöttäjä(pelaaja_id) jne.
- Jäähyt: id, ottelu_id, joukkue_id, aika, pelaaja_id, jäähysyy jne.
- Kokoonpanot: id, ottelu_id, joukkue_id, pelaaja_id jne.
Osaan tehdä sql-haut ja saan tiedot php:llä ihan taulukkomuodossa sivuille. Myös ihan normi css/html sivut hoituu, mutta miten teidän mielestä tälläinen sivukokonaisuus pitäisi toteuttaa. Tarvitaanko tähän jotain sisällönhallintajärjestelmää? Jos, niin mitä suosittelisitte? Kuitenkin uusi sisältö tulisi käytännössä vain kantaan uutta tietoa syöttämällä. Erillisiä ottelu- ja pelaajasivuja tulisi useita tuhansia, joten ilmeisesti ottelun ja pelaajan id-numeroa hyödyntämällä pitäisi saada tieto ulos? Mikään koodariguru en ole, joten toteutus pitäisi olla suht yksinkertainen. Onko mahdollista?
Toivottavasti saan vastauksia!
Kyllä, id:n perusteella voi hakea tiedot, osoitteet voivat aluksi olla muotoa pelaaja.php?id=123, ja PHP-koodissa parametrin voi lukea $_GET-taulukosta. Voit esimerkiksi tehdä ensin HTML:llä mieleisesi sivut, jotka vain näyttävät aina samat tiedot, ja sitten voit lisätä sivuille PHP:tä niin, että saat tietokannasta oikeat tiedot. Toinen vaihtoehto on pulauttaa pyydetyt tiedot PHP:llä vaikka JSON-muodossa, jolloin käyttöliittymän voi tehdä aivan erikseen HTML:llä ja JavaScriptilla. Muista joka tapauksessa PHP:llä ohjelmoidessasi laittaa virheilmoitukset esiin ja huomioida tietoturva.
Sisällönhallintajärjestelmä (CMS) ei yleensä erityisemmin auta tällaisessa projektissa. CMS sopii, kun kirjoitetaan käsin sisältöä keskenään muuten samanlaisille sivuille, esim. juttuja blogiin tai toiminnan esittelyä yhdistyksen kotisivuille. CMS ei olennaisest auta siinä, että saisit omista tietokantatauluistasi tehtyä omanlaisesi nettisivut. Toki CMS tarjoaa valmiit kirjautumistoiminnot ja helpon ulkoasun vaihdon ym., joten siinä mielessä CMS-alustaltakin voi joskus aloittaa, mutta jos mitään muuta CMS:n toiminnallisuutta ei tarvita, mielestäni ei kannata sellaista asentaa.
Edelliseen lisättynä pääset helpolla ulkoasun osalta, kun käytät esim. Bootstrapia: http://getbootstrap.com
Jos haluat syvällisempiä vinkkejä, kerro millaisena näet sivuston tulevaisuuden. Onko toiveena saada sivustolle paljon käyttäjiä vai onko se vain apuväline itselle tai kaveripiirille?
Tiedon levittämisen oikeudet voivat olla rajoitetut. Esim. Liigan nettisivulla sanotaan seuraavaa:
lainaus:
Jääkiekon SM-liiga Oy:n Internet-sivustolla olevat peli- ja pelaajatilastot ovat Jääkiekon SM-liiga Oy:n yksinomaista omaisuutta ja tilastojen tai niiden sisältämien tietojen käyttö kaupallisiin tarkoituksiin tai muuten elinkeinotoiminnassa sekä kaikki käyttö osana yleisölle tarjottavia tietopalveluita tai muita tuotteita on sallittu vain Jääkiekon SM-liiga Oy:n etukäteisellä kirjallisella suostumuksella.
Itse varmaan tekisin RESTful apin itse datalle, ja käyttöliittymän erikseen. näin siitä saisi myös helpolla porttauksen mahdolliselle mobiilisovellukselle tarvittaessa.
Metabolix kirjoitti:
Sisällönhallintajärjestelmä (CMS) ei yleensä erityisemmin auta tällaisessa projektissa.
Näin se taitaa olla. Suuremmin mitään uutisia tai artikkeleita sivuilta ei tule löytymään, johon WordPressit yms. lienevät omiaan. Lisäksi haluan ulkoasusta juuri omanlaisensa ja uskon sen hoituvan itselle helpoiten ilman CMS:ää. Kiitos hyvistä vinkeistä!
Chiman kirjoitti:
Jos haluat syvällisempiä vinkkejä, kerro millaisena näet sivuston tulevaisuuden. Onko toiveena saada sivustolle paljon käyttäjiä vai onko se vain apuväline itselle tai kaveripiirille?
Toivon tietenkin käyttäjiä. Sivusto on oikeastaan ihan harrastepohjalta tehty "katsaus" erään seuraan historiaan. Pelkät tilastot eivät siis ole ainoa mitä sivuilta tulee löytymään, mutta erittäin tärkeässä roolissa kuitenkin. mm. kuvia tulee löytymään runsaasti.
Chiman kirjoitti:
Tiedon levittämisen oikeudet voivat olla rajoitetut. Esim. Liigan nettisivulla sanotaan seuraavaa:
Erittäin hyvä huomio!
groovyb kirjoitti:
(21.06.2016 21:19:49): Itse varmaan tekisin RESTful apin itse datalle...
Pystytkö hieman avaamaan lisää RESTful apista? Kuulin siitä nyt ensimmäistä kertaa. Nopealla googlailulla en ainakaan toistaiseksi päässyt ihan perille miten sitä voin hyödyntää ko.projektissa?
IceGuy kirjoitti:
groovyb kirjoitti:
(21.06.2016 21:19:49): Itse varmaan tekisin RESTful apin itse datalle...
Pystytkö hieman avaamaan lisää RESTful apista?
Sivusta sanon sen verran, että moni ratkaisun yksityiskohta riippuu siitä, mitä halutaan saavuttaa ja millä vaivalla. RESTful API on nykyaikainen ja hyödyllinen toteutusperiaate, mutta se vaatii hieman perehtymistä.
Yksi iso asia on sisällön muokkaaminen tai käyttäjäkohtaisesti vaihteleva sisällön näyttäminen. Jos vähintään toinen näistä halutaan mahdolliseksi, tarvitsee toteuttaa ehkä laajakin käyttäjähallinta salasanoineen, oikeuksineen ja asetuksineen. Tällöin valmis CMS tai ainakin jokin framework olisi avuksi.
Kaikkein helpoin toteutustapa olisi tarjota nettisivulla vain lukuoikeudet kaikille käyttäjille samalla tavalla. Sisältöä muokattaisiin eri reittiä. Tällöin (esim. PHP-)skriptit olisivat suoraviivaisia tietokannasta tulostamisia.
lyhyesti RESTful API:lla tarkoitetaan rajapintaa joka kuuntelee pisteessä x, ja jota hyödynnetään HTTP metodien GET/POST/PUT/DELETE/ kautta.
esimerkki:
Sivustosi on osoitteessa www.latkaliiga.fi
REST Servicesi on osoitteessa api.latkaliiga.fi
Olet rakentanut sivustosi niin, että saavuttaessa osoitteeseen www.latkaliiga.fi/pelaaja/123, haetaan esim ajax kutsulla osoitteesta GET api.latkaliiga.fi/1.0/pelaaja/123 palauttama tieto, ja palautunut tieto näytetään käyttöliittymässä.
kyseisellä sivulla päivität pelaajan tietoja, ja lähetät ajaxilla pelaajan osoitteeseen PUT api.latkaliiga.fi/1.0/pelaaja/123 - jolloin servicesi päivittää pelaajan tiedot. Sivu refreshaa päivityksen jälkeen, ja hakee pelaajan tiedot uudestaan ylläolevan mallin mukaisesti (GET)
Eli,
Luotaessa uusi pelaaja, lähetät POST:ina pelaajan osoitteeseen api.latkaliiga.fi/1.0/pelaaja - metodi palauttaa uuden pelaajan id:n.
haettaessa pelaaja, lähetät GET:inä kutsun osoitteeseen api.latkaliiga.fi/1.0/pelaaja/{id}
haettaessa kaikki pelaajat, lähetät GET:inä kutsun osoitteeseen api.latkaliiga.fi/1.0/pelaaja
Päivitettäessä pelaajaa, lähetät PUT:inä päivitetyn pelaajan osoitteeseen api.latkaliiga.fi/1.0/pelaaja/{id}
Poistettaessa pelaajaa, lähetät DELETE:nä kutsun osoitteeseen api.latkaliiga.fi/1.0/pelaaja/{id}
eli REST service toimii rajapintana sovelluksellesi, ja itse toimintalogiikka tallennuksiin, päivityksiin, poistoihin ja hakuihin on itse rajapinnassa.
Chiman kirjoitti:
Yksi iso asia on sisällön muokkaaminen tai käyttäjäkohtaisesti vaihteleva sisällön näyttäminen. Jos vähintään toinen näistä halutaan mahdolliseksi, tarvitsee toteuttaa ehkä laajakin käyttäjähallinta salasanoineen, oikeuksineen ja asetuksineen. Tällöin valmis CMS tai ainakin jokin framework olisi avuksi.
Näillä näkymin olen ainoa joka sivuja tulee päivittämään. Aikanaan oli tarkoitus väsäillä selainpohjainen tiedonsyöttösivu, mutta huomasin (huomattuani rajalliset koodaritaitoni) phpmyadminillakin sen onnistuvan ihan hyvin. Ei välttämättä fiksuin tai tehokkain tapa, mutta mielestäni ihan toimiva. Uskon jatkossakin pärjääväni ko.työkalulla :)
groovyb kirjoitti:
Kiitos selvennyksestä, tulen varmasti tutustumaan tähän vielä paremmin!
Ehkä ns.pelkkä tulostelu on tässä se juttu välittämättä niin päivittävyydestä tai käyttäjähallinnasta. Tärkein prioriteetti on nyt saada sitä dataa ulos mahdollisimman yksinkertaisesti. Melkein otsikon "järkevästi" pitäisi olla "simppelisti". Eli yhdellä koodilla kaikkien otteluiden tiedot ulos jne.
Pari päivää taisteltu ja ihan toivottua tulosta en ole saanut aikaan. Toivottavasti joku pystyy havainnollistamaan tai pistämään koodirakennetta kehiin, niin pääsisin eteenpäin.
Eli miten saan urlille pelaaja?id=123 haettua pelaajataulusta id:n 123:sen etunimen ja sukunimen, sekä maalit-taulusta kaikki 123:sen tekemät maalit (ottelu_id ja aika riittäisi tässä esimerkissä).
No mikä tuossa nyt on ongelma? Et osaa lukea muuttujia urlista käyttäen $_GET-muuttujaa? Vai etkö osaa rakentaa SELECT-kyselyä? Joku muu varmasti tulee kohta antamaan sulle täysin valmista koodia copy-pastettavaksi, mutta itse haluan yleensä nähdä sen väärin toimivan koodin, jonka kanssa kysyjä väittää käyttäneensä aikaa. Tai ainakin voisi eritellä sen todellisen ongelman. Käytännössä sinä vain pyydät valmista koodia kertomatta sen tarkemmin, mihin oma yrityksesi on tyssännyt.
Mä näkisin että tuossa on parikin asiaa mitkä pitää selvittää.
Yksi on että miten PHP:n saa vastaamaan urliin pelaaja?id=123
Itse aloittaisin ehkä sillä, että saisin sen vastaamaan urliin pelaaja.php?id=123
Tähänhän yleensä riittää se, että tekee palvelimelle pelaaja.php tiedoston. Tuohon ilman päätettä ("nätti" URL) vaatii yleensä että palvelimen asetukset konffataan sopivasti.
Sitten tosiaan otat tuon $_GET['id'] talteen, mielellään vaikka intval kautta, ja teet perus kyselyitä jotka käyttää sitä ja tulostat niitä missä vaan muodossa. Sitten kun tiedot saat haettua kannasta voit alkaa miettiä miten saat ne haluamaasi muotoon.
The Alchemist kirjoitti:
No mikä tuossa nyt on ongelma? Et osaa lukea muuttujia urlista käyttäen $_GET-muuttujaa? Vai etkö osaa rakentaa SELECT-kyselyä? Joku muu varmasti tulee kohta antamaan sulle täysin valmista koodia copy-pastettavaksi, mutta itse haluan yleensä nähdä sen väärin toimivan koodin, jonka kanssa kysyjä väittää käyttäneensä aikaa. Tai ainakin voisi eritellä sen todellisen ongelman. Käytännössä sinä vain pyydät valmista koodia kertomatta sen tarkemmin, mihin oma yrityksesi on tyssännyt.
Ymmärrän pointtisi! Lähinnä $_GET tuottanut ongelmia, vaikka tulee niitä vielä milloin mistäkin. Koen kuitenkin juuri hieman edistyneeni, sillä alla olevalla koodilla onnistuin saamaan jo id:n mukaisesti nimet näkyviin. Koodia saa kommentoida ja parannusehdotuksia tms. saa heitellä! Niitä varmasti löytyy, sillä muistutan PHP:n olevan itselle vielä aika vieras.
<?php if (isset($_GET['id'])) { $henkilo = mysql_escape_string($_GET['id']); // muodostetaan yhteys tietokantaan try { $yhteys = new PDO("mysql:host=localhost;dbname=test", "root", ""); } catch (PDOException $e) { die("VIRHE: " . $e->getMessage()); } // virheenkäsittely: virheet aiheuttavat poikkeuksen $yhteys->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // merkistö $yhteys->exec("SET NAMES utf8"); // valmistetaan kysely $kysely = $yhteys->prepare("SELECT * FROM henkilo WHERE id = $henkilo"); // suoritetaan kysely $kysely->execute(); // tarkistetaan onko tuloksia if(isset($_GET['id'])) { echo "<table>"; // käsitellään tulostaulun rivit while ($rivi = $kysely->fetch()) { echo "<tr>"; echo "<td>" . htmlspecialchars($rivi["etunimi"]) . "</td>"; echo "<td>" . htmlspecialchars($rivi["sukunimi"]) . "</td>"; echo "</tr>"; } echo "</table>"; } } ?>
Mmmmmmmh.
Kyselyitähän kannattaa toki treenata ihan ajamalla pelkkiä kyselyitä komentokehoitteessa ja katsomalla saatuja tuloksia. Tuohon kyselyysi kun lisäät joinin, niin se tekee sen homman, mitä alkujaan tavoittelit. Left joinilla saa mukaan pelaajat, joilta maali vielä puuttuu.
SELECT a.*, b.ottelu_id, b.aika FROM henkilo a LEFT JOIN maalit b ON a.id = b.maalintekijä WHERE a.id = ?
Pdo:n käytössä kannattaa lukea Putkan asiaa käsittelevä opas, koska sitä ei pidä käyttää yhtä huonosti kuin mysql-alkuisia funktioita aikanaan. Ja mysql_real_escape_string-niminen funktio on jo poistettu php:stä kokonaan, joten sitä ei ainakaan kannata käyttää. Ja sen kanssa saa muutenkin aikaan vain ongelmia.
The Alchemist kirjoitti:
Pdo:n käytössä kannattaa lukea Putkan asiaa käsittelevä opas, koska sitä ei pidä käyttää yhtä huonosti kuin mysql-alkuisia funktioita aikanaan. Ja mysql_real_escape_string-niminen funktio on jo poistettu php:stä kokonaan, joten sitä ei ainakaan kannata käyttää. Ja sen kanssa saa muutenkin aikaan vain ongelmia.
Kiitos vinkeistä! Ei auta kuin jatkaa vain opiskelua ja harjoituksia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.