Miten kannattaa toteuttaa web-sivulle tietokanta, jota olisi mahdollisimman helppo päivittää? Ajattelin tehdä jalkapallojoukkueelle MySQL-tietokannan, joka päivittäisi pelaajan ottelutilastoja kauden mittaan. Vai kannattaisiko homma toteuttaa esimerkiksi PHP:llä muuttujina?
ottelu_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, vastaustaja TEXT, aika INT, tulos INT
Esimerkiksi tuollaisella pohjalla voisi laittaa tulokset tietokantaan. Sinne lisääminen on helppoa:
INSERT INTO jalkapallo_ottelut(vastustaja, aika, tulos) VALUES('Fc Mutakylpy', 1234567890, '3-2')
Jaska kirjoitti:
Vai kannattaisiko homma toteuttaa esimerkiksi PHP:llä muuttujina?
Anteeksi miten? Ai kirjoittaisit koodiin muuttujiin tiedot? Paljon hankalampaa kuin kannan käyttäminen.
<?php $yhteys = mysql_connect("localhost", "root", "salasana"); mysql_select_db("jalkapallo_ottelut"); if(isset($_GET["lisaa"])) { $vastustaja = $_POST["vastustaja"]; $tulos = $_POST["tulos"]; $aika = strtotime($_POST["aika"]); mysql_query("INSERT INTO jalkapallo_ottelut(vastustaja, aika, tulos) VALUES('$vastustaja', $aika, '$tulos')"); header("Location: " . $_SERVER["PHP_SELF"] . "?"); } else { echo "<form action=\"?lisaa\" method=\"POST\">\n"; echo "Vastustaja:<br><input type=\"text\" name=\"vastustaja\"><br><br>\n"; echo "Tulos:<br><input type=\"text\" name=\"tulos\"><br><br>\n"; echo "Aika:<br><input type=\"text\" name=\"aika\"><br><br>\n"; echo "<input type=\"submit\" value=\"Tallenna tulokset\">\n"; echo "</form>"; } ?>
Näin yksinkertaisesti lisätään kantaan tietoa. Ja näin yksinkertaisesti saa tiedot sieltä ulos:
<?php $yhteys = mysql_connet("localhost", "root", "salasana"); mysql_select_db("jalkapallo_ottelut"); echo "<table>"; $haku = mysql_query("SELECT * FROM jalkapallo_ottelut ORDER BY id DESC"); for($i = 0; $i < mysql_num_rows($haku); $i++) { $tiedot = mysql_fetch_array($haku); echo "<tr><td>" . $tiedot["vastustaja"] . "</td><td>" . date("d.m.Y H:i", $tiedot["aika"]) . "</td><td>" . $tiedot["tulos"] . "</td></tr>"; } echo "</table>"; ?>
MIB: Miten tuosta saa laskettua tehdyt maalit vs päästetyt maalit? Se on kuitenkin aika yleinen tilastotieto, jota seurataan ihan seuran johdossakin. Lisäksi vastustajien nimen lisääminen tekstinä on kohtalaisen iso virhe. Mielummin jokaiselle joukkueelle oma id numero -> joukkueille oma taulu. Eniten maaleja tehnyt pelaajakin olisi ihan kiva tietää -> pelaajille oma taulu ja maaleille oma taulu.
Elikä uudelleen suunnitteluun tuo MIB:n ehdotus. Tietojen tulostusta ei ehkä kannata vielä miettiä, koska kannan suunnittelukin on pahasti vaiheeessa.
joukkuetaulu id, nimi pelaajataulu id, nimi maalitaulu indeksi, pelaaja, päästänyt, aika
Noista voisi alkaa miettimään onko siellä tarpeeksi kenttiä, jotta käyttö olisi helppoa.
Seuraavat virheet/heikkoudet bongasin MIBin koodista:
- funktio kirjoitettu väärin: "mysql_connet"
- tietokannan root-tunnusta käytetty (todennäköisesti tarpeettoman laajat oikeudet)
- käyttäjän syöte ($_POST) välitetään suoraan tietokantaan ilman putsausta.
Chiman kirjoitti:
Seuraavat virheet/heikkoudet bongasin MIBin koodista:
- funktio kirjoitettu väärin: "mysql_connet"
- tietokannan root-tunnusta käytetty (todennäköisesti tarpeettoman laajat oikeudet)
- käyttäjän syöte ($_POST) välitetään suoraan tietokantaan ilman putsausta.
1. Joo, heitin nopeasti vaan jotain, niin kävi virhe. Pitäisi oppia jo tarkistamaan omat koodit, ennen kuin postaa mihinkään ;)
2. Omalla serverillä kun koodaan, niin eipä ole tullut mieleen käyttää kuin root tunnusta.
3. Minusta tuota ei tarvitse "putsata", koska yleensä tuommoiset on laitettu vain admineille oikeuksiksi, siis lisätä tietoa. Yksinkertaisesti if lauseella saa tehtyä suojauksen:
<?php ... if($_POST["salasana"] == "salakala") { jatketaan suoritusta... }
MIB: tietokanta kannattaa aina suojata ilkeiltä syötteiltä, kuten alkerin avaamassa ketjussa huomattiin. Sinnekin oli mahdollista lisätä sisältöä vain rekisteröityneillä käyttäjillä, mutta lopulta koko tietokantaa ei ollut olemassa.
Samalla tavalla tuossa sinun koodissasi ilkeämielinen käyttäjä voisi aiheuttaa tuhoa kannalle. Muutoinkaan ei kannata heittää vaan jotakin ohjetta, vaan mielummin ihan ajatuksen kanssa kirjoitettua koodia.
Nojuu, kyllähän se ihan paikkaansa pitää. Harmi, että on sellaisia ihmisiä, jotka ihan tarkoituksella tulevat tuohoamaan toisten tietoja. :/
Tietysti pitää escapettaa aina tietokantaan menevä syöte, vaikka tulisikin vain ylläpidon käyttöön, koska muuten joku ylläpitäjistä voi tietämättään sekoittaa kannan.
Muutama kommentti tuohon ensimmäiseen vastaukseen näin aamunillityksenä, ja ehkä näistä on jotain hyötyäkin:
SELECT
, INSERT
, UPDATE
, ja DELETE
.mysql_real_escape_string
.strtotimen
palauttama arvo riippuu siitä. Oletusarvoisesti käytetään US English -aikanotaatiota.tsuriga kirjoitti:
- for on komentorakenne, ei funktio, jolloinka sen ja aloittavan sulun väliin jätetään yksi tyhjä väli konventioiden mukaan.
Tämä ainakin taitaa täyttää nillityksen tuntomerkit :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.