Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Helppokäyttöinen tietokannan päivitys

Sivun loppuun

Jaska [21.09.2009 00:50:26]

#

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?

MIB [21.09.2009 10:18:36]

#

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>";
?>

Teuro [21.09.2009 10:32:25]

#

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.

Chiman [21.09.2009 10:38:00]

#

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.

MIB [21.09.2009 10:43:38]

#

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... }

Teuro [21.09.2009 10:49:56]

#

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.

MIB [21.09.2009 10:53:38]

#

Nojuu, kyllähän se ihan paikkaansa pitää. Harmi, että on sellaisia ihmisiä, jotka ihan tarkoituksella tulevat tuohoamaan toisten tietoja. :/

trilog [21.09.2009 11:50:15]

#

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.

tsuriga [21.09.2009 12:00:34]

#

Muutama kommentti tuohon ensimmäiseen vastaukseen näin aamunillityksenä, ja ehkä näistä on jotain hyötyäkin:

os [21.09.2009 13:54:57]

#

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 :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta