sivut.web

ohjeita web-sivuston tekijälle

PHP-opas: MySQL-tietokantayhteys

Yksinkertaistetut tietokantayhteydet ovat varmasti yksi PHP:n parhaista ominaisuuksista. PHP:ssa on valmiit funktiot tunnetuimmille ja yleisimmille tietokantaohjelmistoille, kuten Informix, MySQL, Oracle ja PostgreSQL. Tässä lyhyessä katsauksessa tutustumme MySQL:n ja PHP:n toimintoihin, sillä MySQL on yleisimmin web-palvelimilla saatavilla oleva tietokantaohjelmisto.

Monet tietokannat käyttävät kielenään SQL:ää (Structured Query Language). SQL on varsin helppoa, sillä käskyt tulevat suoraan englannin kielestä. Hyvästä kielitaidosta on siis hyötyä.

Luokaamme esimerkki kaupasta, joka käyttää tietokantaa tuotetietojen tallentamiseen. Oletuksena on, että tietokannaksi on etukäteen valittu "kauppa".

CREATE TABLE tuotteet (
koodi int(10) NOT NULL,
tuotenimi varchar(50),
hinta float,
PRIMARY KEY(koodi)
);

Lisätkäämme tuotteita kauppaan INSERT-komennolla:

INSERT INTO tuotteet
	VALUES(1231231231,"Ykkösmaito 1l",4.00);
INSERT INTO tuotteet
	VALUES(1231231232,"Kevytmaito 1l",5.00);
INSERT INTO tuotteet
	VALUES(1231231233,"Taloussuklaa 200g",10.00);

Nyt olemme valmiita tuomaan tuotelista kaiken kansan ulottuville.

// Avataan yhteys tietokantapalvelimeen
mysql_connect("localhost","kayttajatunnus","salasana");

// Valitaan tietokanta
mysql_selectdb("kauppa");

// Suoritetaan haku tietokannasta ja tallennetaan linkki
// vastauksiin muuttujaan $result
$query = "SELECT koodi,tuotenimi,hinta FROM tuotteet
		ORDER BY koodi";

$result = mysql_query($query);

?>
<table cellspacing=0 cellpadding=4 border=1>
<tr>
<th>Koodi</th>
<th>Tuote</th>
<th>Hinta</th>
</tr>
<?
/*
Vastausten läpi käydään silmukalla, joka suoritetaan niin monta
kertaa kuin vastausrivejä tuli kyselystä.

Jokaisella rivillä kutsutaan mysql_result-funktiota, jolla saadaan
tietyn sarakkeen arvo kyseiseltä riviltä.
*/
for($laskuri = 0; $laskuri < mysql_numrows($result); $laskuri++) {
?><tr>
<td><?echo mysql_result($result,$laskuri,"koodi")?></td>
<td><?echo mysql_result($result,$laskuri,"tuotenimi")?></td>
<td><?echo mysql_result($result,$laskuri,"hinta")?> mk</td>
</tr>
<?
}
?>
</table>
<?

// Suljetaan tietokantayhteys
mysql_close();

esimerkit/mysql.php
lähdekoodi

Lisätietoa tietokantojen mahdollisuuksista saa mm. MySQL:n ohjesivuilta.


Käyttäjien kommentit

4.7.2003 13:34
Amatööri

Mitäs varten tuossa esimerkissä ei ole PHP alku ja loppu tagia...siis tämä kohdassa jossa sanotte "nyt olemme valmiita tuomaan tuotelistan kaiken kansan ulottuville".

Jos kukaan ei tiedä mitään MySQL:stä niin miten luulet hänen tietävänsä miten ylipäätään tietokannan voi tehdä. Sitähän vaaditaan kohdassa "Luokaamme esimerkki kaupasta, joka käyttää tietokantaa tuotetietojen tallentamiseen. Oletuksena on, että tietokannaksi on etukäteen valittu "kauppa". Voisitte edes kertoa mistä sen MySQL edes ylipäätään saa.

8.10.2003 15:06
Varjagi <varjagi1@luukku.com>

... Täydellisyyttä ei voi odottaa edes maksullisilta palveluilta.. Joten. Hyvä opashan tämä loppupeleissä kaikin puolin on, vaikken puoliakaan tajua.

17.10.2003 17:35
zDen <juhar@pilotti.kuopio.fi>

Esimerkki koodissa oli muutama virhe. Itse sain koodin toimimaan kun lisäsin mysql_connectin (yllättäen :) ja $query muuttujassa oli liikaa merkkijono "sivut" liikaa. Toimiva koodi löytyy http://pilotti.kuopio.fi/~juhar/mysql.php.txt
Hyvä opas! :)

27.11.2003 18:28
0000

Aika surkea opas kun ei tos ees kerrota miten tota käytetään. Tossa vaan oli jotain koodia ,että olisit voinu kertoa tarkemmin noi asiat.

3.2.2004 22:31
IsoJaxon

Loistavaa, hyvät sivut.. vähän lisää esimerkkejä!

13.2.2004 19:00
Ryydeman

Juu, hyvä opas on. Hienoa että jotkut jaksavat!

14.2.2004 00:15
vamma

Hyvä opas mutta lisää sisältöä kaivattaisiin.

24.2.2004 09:20
mc

Kannattaako täällä nyt kenenkään alkaa haukkumaan paskaksi tätä opasta, jos ei ole itsellä tarjota parempaa? Kyllä kehittävät kommentit on eri asia kuin haukkuminen.

Hyvä ja selkeä opas, pääsin hyvin hajulle siitä mitä php on ja nyt voin alkaa sitä opiskelemaan kunnolla! Se on ilmeisesti tän oppaan tarkoituskin.

25.2.2004 21:28
Juha-Pekka Järvenpää <jp@sivut.org>

Aivan. Näitä sivuja ei kukaan tee kuin omaksi ja muiden iloksi ja hyödyksi. Niitä päivitetään sen mukaan kun tärkeämmät asiat antavat periksi.

Kaikki kommentointi, myös haukunta, on rakentavaa, mutta mielelläni luen myös miksi opas ei vastannut tarpeita. Juuri tällä tavalla tätäkin kehitetään, lukijoiden ehdoilla.

2.3.2004 14:00
Jari <grim@jippii.fi>

mitenkäs tuo tietoturvan laita tuossa connectissa jos koodissa näkyy käyttäjätunnukset? ihmettelin vain...

2.3.2004 21:00
Juha-Pekka Järvenpää <jp@sivut.org>

Tietoturva on tässäkin asiassa tärkeä.

Skripteille ei kannata antaa lukuoikeuksia muille kuin itselle. Salasana kannattaa myös tallentaa johonkin, mihin ei webin kautta pääse käsiksi. Tälläisiä hakemistoja on usein käyttäjätunnusten kotihakemistot. Sieltä niitä voidaan käyttää esimerkiksi PHP:n require- tai include-funktioilla.

11.3.2004 19:20
J <jaanzen@jippii.fi>

Nämä on erittäin hyvät sivut, kiitokset ja hatunnosto sivujen luojalle ja ylläpitäjälle!
Olen saanut paljon apua html-koodaamiseeni näillä sivuilla!

27.3.2004 17:02
JsS

Ai tähänkö tää php jo loppuikin. No ihan hyviä vinkkejä täältä sai. Mielenkiinto ainakin heräsi, pitänee yrittää itse väsäillä jotain.

31.5.2004 14:33
samuli

muuten tosta create table jutust puuttuu
``-merkkejä ilman niit tulee parse error

2.6.2004 17:08
masuli

voiko ton $result homman lukee jotenkin taulukkoon

3.6.2004 13:30
Juha-Pekka Järvenpää <jp@sivut.org>

SQL-tuloksen voi lukea taulukkoon monella eri tapaa. Muutama hyödyllinen ohje:

http://fi.php.net/manual/en/function.mysql-fetch-array.php
http://fi.php.net/manual/en/function.mysql-fetch-row.php
http://fi.php.net/manual/en/function.mysql-fetch-assoc.php

15.8.2004 03:38
mikki <mikki@kompleksi.com>

mmmm...

ei näin
for($laskuri = 0; $laskuri < mysql_numrows($result); $laskuri++) {

näin
for($laskuri = 0; $laskuri < mysql_num_rows($result); $laskuri++) {

muuten ihan jees.


kyllä funktioiden ja luokien käyttö kannattaisi opetella kunhan perusteet ovat hallinnassa. sivujen latautuminen nopeutuu _huomattavasti_

jos liikaa kiinnostaa niin klikkaile: ->

http://kompleksi.com/~mikki/swap/Page.txt
http://kompleksi.com/~mikki/swap/index.txt

kanta
http://kompleksi.com/~mikki/swap/musakanta.txt

ja tk-kaavio
http://kompleksi.com/~mikki/swap/tk-speks.doc


tosiaan. erittäin hyvä malli aloittelevalle, hukassaolevalle veppikoodarille, mutta todellinen toimivuus jää varmaan hiukan heikoksi.

muuten onnittelut!

11.9.2004 23:45
ledzeppelin

eikö ois helpompi tehdä html:lillä?

20.10.2004 10:44
Mr j

puuttuuko tuosta dblink.php vai onko se tuon page.php koodin sisällä?

Fatal error: Cannot redeclare class page in c:\program files\apache group\apache\htdocs\musakanta\Page.php on line 10

tulee virheeksi.

Onko myös pakko tehdä tuo login.php.Kiitos neuvoista

25.1.2005 11:51
Jarkko

Varmaan kannattaisi korvata nuo short tagit eli <? ihan tavallisilla tageilla eli <?php, joska monet palvelimet (MBnet) ovat ottaneet short tagit pois käytöstä.

2.2.2005 22:04
Häh

mitä nois oli erikoista...eiks tollaset taulukot ja muut muka saa html:kin niin miks noin helppoihin pitäis php:tä käyttää

2.2.2005 22:06
Häh

Ei oo voitu yhtään kunnon esimerkkiä täs näyttää...

18.3.2005 22:18
Joose

No eihän MBNetissä oo edes tietokantoja...

8.4.2005 03:03
mane

Kiitokset hyvästä sivustosta!
Täällä vietetään yötä tehdessä omille sivuille tälläistä kommenttipalstaa vieraskirja tarkoitukseen, ja näistä sivuista oli apua aluksi käsittämään mitä PHP ja MySql on.

Mistään (niin täältä kuin monista kirjoistakaan) ei tunnu löytyvän miten SQL tietokanta tehdään, oletus oli että sellainen on jo olemassa. Jotka sellaisen haluavat oppia tekemään (ja hyvillä ohjeilla) kannattaa etsiä käsiinsä Rami Heinisuon kirja PHP ja MySQL.

Että semmottii, tsemmppiä vaan sullekki.

30.6.2005 16:26
Antti

Kiitti tuosta PHP&MySQL-kirjavinkistä! Pitäis tässä kesän aikana väsätä sen verran kookkaat sivut, että parempi varmaan opetella tuo PHP-homma. Ongelma on vaan, että netti on melko satunnaisesti käytössä, niin jos sitä onnistus opettelu tuommosesta kirjasta paremmin. Oon vaan sikakauan ihmetelly että miten kaikki tekee tosi nättejä sivuja PHP:llä kun PHP-oppaissa ei oo semmosia juttuja opetettu. Avainsana taitaakin olla tuo MySQL, saapa nähä...

27.7.2005 21:44
Vesku <voj@luukku.com>

Muuten ihan kiva ohjesivu, mutta PHP:n ja MySQL:n kanssa kanssa kannattaisi mainita myös phpMyAdmin ohjelma (tai paremminkin itselle asennettava PHP-sivusto), jonka kanssa MySQL kantojen luominen ja ylläpito on tosi helppoa. Lisäksi phpMyAdmin on nykyään tosi hyvin suomennettu.

25.11.2005 22:14
Jorkke

Alussa sain täältä hyvin apuja ja näiden sivujen ansiosta pääsin käsiksi PHP:n

Kiitos sille joka jaksoi :)

30.1.2006 11:25
JannuVaan

Osaatteko sanoa missä vika?

Warning: Wrong parameter count for mysql_result() in /home/thewarof/public_html/config/settingsload.php on line 7

<?php

include("config.php");
$link = mysql_connect("$host","$username","$password");
mysql_select_db($database,$link);
$result = mysql_query("SELECT adminemail FROM config");
echo mysql_result($result);
mysql_close($link);

?>

30.1.2006 11:33
Juha-Pekka Järvenpää <jp@sivut.org>

Virheilmoitus 'Wrong parameter count for mysql_result()' johtuu siitä, ettet ole antanut tarpeeksi parametrejä tuolle funktiolle.

Funktion syntaksi löytyy dokumentaatiosta http://fi.php.net/mysql_result . Pakollisia parametrejä on kaksi (annoit vain yhden, $result:n). Tämän lisäksi täytyy antaa rivin numero, jolta tulos haetaan.

Voisi ehkä kuvitella, että haet tätä:

echo mysql_result($result,0);

30.1.2006 14:23
Pete Jaaskola

Anteeksi, mutta tässä voisi olla hieman juttua fieldeistä ja roweista. Itselläni oli hankaluuksia saada dataa luettua mysql:stä koska yritin kovasti saada toimimaan mutta kun kokeilin mysql_num_rows nii se anto 0, mutta kun kokeilin mysql_num_fields niin se antoi 2. Luulin että minulla oli 2 rowia eikä 2 fieldiä. Mitäköhän eroa näilläkin on?

30.1.2006 14:49
Juha-Pekka Järvenpää <jp@sivut.org>

row = rivi
field = kenttä

Rivi on siis tietue, jossa on useampia kenttiä. Saman resultin riveillä on aina samat kentät. Kentät taas ovat tietueen 'sarakkeita'.

6.2.2006 17:08
Unnabe <kaisellgren@gmail.com>

Eli tällä tehdään lisää tuotteita kauppaan:
INSERT INTO tuotteet
VALUES(1231231233,"Taloussuklaa 200g",10.00);

Niin millä poistetaan tuote kaupasta? Tietty tuote?
PS. Voisitko mailata vastauksen tai mailata kun olet vastannut tänne? Kiitos.

7.2.2006 09:08
Juha-Pekka Järvenpää <jp@sivut.org>

SQL:n DELETE-komennolla voidaan poistaa taulusta rivejä.

'DELETE FROM tuotteet WHERE koodi = 101010' poistaa tuotteen, jonka koodi on 101010.

'DELETE FROM tuotteet' tyhjentää koko taulun. Varo tätä!

12.3.2006 13:44
laya


"Voisitte edes kertoa mistä sen MySQL edes ylipäätään saa."

Kuinka amatööri oikeen saa olla, että yrittää rakentaa teitokantasovellusta tältä pohjalta. Keskittyminen kun yhteen asiaan ei kestä edes yhden Google-haun vertaa.

Varmaan oltiin taas tekemässä jotain überhienoa verkkokauppaa jostain irc-vihjeestä innostuneena... mutta se oli 3 vuotta sitten.

Itse tutoriaali on hyvä.

12.3.2006 13:53
laya

mikki:

"kyllä funktioiden ja luokien käyttö kannattaisi opetella kunhan perusteet ovat hallinnassa. sivujen latautuminen nopeutuu _huomattavasti_"

Mistä olet tälläista lukenut?

27.4.2006 18:22
unknow


tuhoo koko taulu

drop table taulu;

18.12.2006 09:28
joni

Hyvä opas! :D

17.1.2007 15:08
takkuli

Oikein hyvät sivu - kiitos ylläpitäjälle!

2.2.2007 14:34
Jarmo

Googleta XAMPP 1.5.5. Paketissa Apache, MySQL yms..

12.2.2007 21:18
Cross_Of_Death <mixa-88@netti.fi>

Muutoin kyllä mielestäni hyvä html opas sivu, mutta en tajunnut tästä PHP osiosta yhtään mitään... Ja vielä vähemmän MySQL:stä... vaikka ne ovat asioita joita juuri haluan oppia...

15.6.2007 07:57
roope

Mite

21.5.2008 18:24
Jore

Hyviä linkkejä pojat lähettäny. Meni vähän aikaa kahtoessa kaikki...

Lisää oma kommentti


Juha-Pekka Järvenpää
jp@sivut.org
http://www.jarvenpaa.net/