OPPITUNTI 12 MySQL-tietokannan käyttö



Samankaltaiset tiedostot
Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä:

Tuotteiden tiedot: Lisää uuden tuotteen tiedot. Muuta tai poista tuotteen tiedot. Selaa kaikkien tuotteiden tietoja.

LINUX-HARJOITUS, MYSQL

OPPITUNTI 11 DBM-funktioiden käyttö

OPPITUNTI 19 Tilan tallentaminen evästeiden ja kyselymerkkijonojen avulla

OPPITUNTI 5 Ohjelman kulku

SELVITYSRAPORTTI LABRA-VERKON MYSQL:n JA PHP:n KÄYTTÖÖNOTOSTA. Jarkko Kähkönen

Ohjelmoinnin perusteet Y Python

Proseduurit, funktiot ja herättimet - esimerkkeinä Oracle, SQL Server, MySQL ja OCELOT. Jouni Huotari S2008

PROSEDUURIT, FUNKTIOT JA HERÄTTIMET - ESIMERKKEINÄ ORACLE, SQL SERVER, MYSQL JA OCELOT JOUNI HUOTARI K2009

OPPITUNTI 3 Ensimmäinen skripti

TIETOKANTOJEN PERUSTEET MARKKU SUNI

Johdanto Javaan ja tietokantojen käsittelyyn Java Database Connectivity (JDBC)

Written by Administrator Monday, 05 September :14 - Last Updated Thursday, 23 February :36

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet

Harjoitustyö: virtuaalikone

OPPITUNTI 24 Esimerkki (Osa 2)

6. Funktiot 85. Kuinka funktioita määritellään ja kutsutaan. Kuinka funktioille viedään arvoja ja niistä palautetaan arvoja

TIEDONHALLINTA - SYKSY Luento 11. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

Ohjelmoinnin peruskurssi Y1

SQL Buddy JAMK Labranet Wiki

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

ITKP102 Ohjelmointi 1 (6 op)

JavaScript alkeet Esimerkkikoodeja moniste 2 ( Metropolia)

Tiedonhallinnan perusteet. H11 Ovien ja kulun valvontajärjestelmän tietokanta

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

OPPITUNTI15 Päivämäärien käsittely

SQL - STRUCTURED QUERY LANGUAGE

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Tiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas

Opettajana Mika Sorsa, HAMK:n ammatillisen opettajakoulutuksen opetusharjoittelija

Ohjelmoinnin perusteet Y Python

TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö

Ohjelmoinnin perusteet Y Python

Kirjasto Relaatiotietokannat Kevät Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina

Zeon PDF Driver Trial

MUITA TIETOKANTAOBJEKTEJA NÄKYMÄT, SYNONYYMIT, INDEKSOINTI, VALTUUDET JA SYSTEEMIHAKEMISTO

Insert lauseella on kaksi muotoa: insert into taulu [(sarakenimet)] values (arvot)

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

7. Taulukot 105. Kuinka taulukoiden tietoa käsitellään ja lajitellaan

HELIA TIKO-05 1 (22) ICT03D Tieto ja tiedon varastointi E.Räty, O.Virkki

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

WWW-PALVELUN KÄYTTÖÖNOTTO LOUNEA OY

Makrojen mystinen maailma lyhyt oppimäärä

Luento 5. Timo Savola. 28. huhtikuuta 2006

Tällä viikolla. Kotitehtävien läpikäynti Aloitetaan Pelifirman tietovaraston suunnittelu Jatketaan SQL-harjoituksia

Muita tietokantaobjekteja. Näkymät, synonyymit, indeksointi, valtuudet ja systeemihakemisto

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Asiointipalvelun ohje

Harjoitus 3 (viikko 39)

Osa. Listaus 2.1. HELLO.CPP esittelee C++ -ohjelman osat. 14: #include <iostream.h> 15: 16: int main() 17: {

Ohjelmoinnin perusteet Y Python

11. Javan toistorakenteet 11.1

Fakta versio Forecast versio

12. Javan toistorakenteet 12.1

CSE-A1200 Tietokannat

OPPITUNTI 20 Tilan tallentaminen istuntofunktioilla

Taulukot. Jukka Harju, Jukka Juslin

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

Tietokannat. CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi);

Ohjelmoinnin perusteet Y Python

Tietotyypit ja operaattorit

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

811120P Diskreetit rakenteet

Ohjelmoinnin perusteet Y Python

Excel-taulukkoon X- ja Y-sarakkeisiin tallennettujen koordinaattien muuntaminen paikkatietokohteiksi

Ylläpitodokumentti Labra

12. Javan toistorakenteet 12.1

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

ICT1TN004. Lomakkeet. Heikki Hietala

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin jatkokurssi, kurssikoe

OpenOffice.org Base 3.1.0

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Tietokannat. CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi);

Ohjelmoinnin perusteet Y Python

3.1 Mitä tarkoittaan heredoc? Milloin sitä kannattaa käyttää? Kirjoita esimerkki sen käyttämisestä.

Toimittajaportaalin rekisteröityminen Toimittajaportaalin sisäänkirjautuminen Laskun luonti Liitteen lisääminen laskulle Asiakkaiden hallinta Uuden

Tietuetyypin määrittely toteutetaan C-kielessä struct-rakenteena seuraavalla tavalla:

JavaScript alkeet Esimerkkikoodeja moniste 2

8. Oliot 123. Kuinka luokkia luodaan ja olioita saadaan aikaan. Kuinka luodaan ja käsitellään ominaisuuksia ja metodeja

Webpalvelin muistitikulle - Ohje

14. Hyvä ohjelmointitapa 14.1

Käytin tehtävän tekemiseen Xubuntu käyttöjärjestelmää aikaisemmin tekemältäni LiveUSB-tikulta.

Toimittajaportaalin pikaohje

811120P Diskreetit rakenteet

5.6. C-kielen perusteet, osa 6/8, Taulukko , pva, kuvat jma

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Toteutusdokumentti. Aija. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteenlaitos

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

SQL. ! nykystandardi SQL3 eli SQL'99. ! CREATE TABLE, ALTER TABLE ja DROP TABLE. ! CREATE VIEW ja DROP VIEW. ! CREATE INDEX ja DROP INDEX

Ohjelmoinnin perusteet Y Python

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

Osoitin ja viittaus C++:ssa

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Transkriptio:

12. MySQL-tietokannankäyttö 211 OPPITUNTI 12 MySQL-tietokannan käyttö PHP-kieleen kuuluu olennaisesti tietokantojen käyttämisen helppous. Tällä tunnilla keskitymme MySQLtietokantaan, mutta samanlaisia funktioita on myös monille muille tietokannoille, joita PHP tukee. Miksi juuri MySQL? Se sopii hyvin PHP:n henkeen, koska sekin on ilmainen tavalliselle käyttäjälle; kyseessä on kuitenkin tehokas työkalu, joka sopii vaativiinkin käytännön projekteihin. MySQL-versiota on lisäksi saatavilla useille eri alustoille. Voit ladata MySQL-työkalun osoitteesta http://www.mysql.org. Tämän tunnin aiheita ovat seuraavat: Muutamia SQL-näytteitä Kuinka MySQL-tietokantapalvelimelle kytkeydytään Kuinka tietokanta valitaan Virheiden käsittely Tiedon lisääminen taulukkoon Tiedon saaminen taulukosta Taulukossa olevan tiedon muuttaminen Tietokannan rakenne

212 12. MySQL-tietokannankäyttö Lyhyt SQL-johdanto SQL tulee sanoista Structured Query Language. Se tarjoaa standardin syntaksin, jolla voidaan tehdä kyselyjä tietokannasta. Useimmat SQL-tietokantatuotteet tarjoavat omia laajennuksiaan kieleen samalla lailla kuin selaimilla on omia HTML-erikoiskoodejaan. SQL-syntaksin ymmärtäminen antaa kuitenkin eväät useimpien tietokantatuotteiden käyttämiseen; myös alustat voivat vaihdella. Tämä kirja ei pyri millään lailla kuvaamaan SQL:n koko kontekstia eikä se ota esille myöskään MySQL:n taustoja. MySQL pyörii palvelindemonina, johon käyttäjät voivat kytkeytyä joko samalta koneelta tai etäkoneilta. Kun palvelimeen on kytkeydytty, voidaan valita tietokanta, mikäli käyttöoikeudet sen sallivat. Tietokannan sisällä on vaihteleva määrä tietoa taulukoissa. Kukin taulukko koostuu riveistä ja sarakkeista. Rivin ja sarakkeen leikkaus muodostaa solun, johon tieto tallennetaan. Kukin sarake hyväksyy tiettyjä ennalta määritettyjä tietotyyppejä: esimerkiksi kokonaislukuja varten on INT-tietotyyppi ja merkkejä varten VARCHAR-tietotyyppi. Uusi taulukko luodaan tietokantaan seuraavanlaisella SQL-kyselyllä: CREATE TABLE mytable ( first_name VARCHAR(30), second_name VARCHAR(30), age INT); Nyt uudessa taulukossamme on kolme saraketta. Sarakkeen (kentän) first_name ja second_name sisältönä voi olla enintään 30 merkkiä. Sarakkeessa age voi olla kokonaisluku. Tietoa lisätään taulukkoon INSERT-lauseella: INSERT INTO mytable ( first_name, second_name, age ) VALUES ( 'John', 'Smith', 36 A ); Kenttien nimet on annettu ensimmäisten sulkumerkkien sisällä; sijoitettavat arvot ovat vastaavasti toisen sulkumerkkiparin sisällä. Tietoa voidaan ottaa esille tietokannasta SELECT-lauseella: SELECT * FROM mytable; Koodissa oleva asteriski (*) on jokerimerkki ja tarkoittaa kaikki kentät. Saadaksemme tietoa yhdestä kentästä on sarakkeen nimi kirjoitettava jokerimerkin sijaan: SELECT age FROM mytable; Taulukossa olevia tietoja voi muuttaa UPDATE-lauseella:

12. MySQL-tietokannankäyttö 213 UPDATE mytable SET first_name = 'Bert'; Lause muuttaa kentän first_name arvoksi Bert jokaisella rivillä. Voimme kaventaa SELECT- ja UPDATElauseiden vaikutusaluetta WHERE-osalla. Esimerkiksi näin: SELECT * FROM mytable WHERE first_name = 'Bert'; Nyt lause palauttaa vain ne rivit, joissa first_name-kenttä sisältää merkkijonon Bert. Tämä seuraava esimerkki muuttaa arvon Bert kaikkien niiden rivien first_name-kenttiin, joilla second_name-kenttä sisältää arvon Baker : UPDATE mytable SET first_name = "Bert" WHERE second_name = "Baker"; Saat lisätietoa SQL-kielestä esimerkiksi Samsin teoksista. Tietokantapalvelimeen kytkeytyminen Ennen kuin alat työskennellä tietokannallasi, sinun tulee kytkeytyä palvelimelle. Siihen PHP tarjoaa funktion mysql_connect(). Funktio ei vaadi mitään argumentteja, mutta sille voidaan antaa kolme merkkijonoa: palvelimen nimi, käyttäjätunnus ja salasana. Jos jokin argumenteista tai ne kaikki jätetään pois, funktio olettaa, että localhost on palvelin. Mitään salasanaa tai käyttäjätunnusta ei myöskään ole asetettu mysqluser-taulukossa, ellei oletuksia ole asetettu php.ini-tiedostossa. Argumentit voidaan tietenkin jättää pois vain testitietokantaa käytettäessä. Esimerkeissämme käytämme aina käyttäjätunnusta ja salasanaa. Funktio palauttaa linkkitunnisteen, jos kytkeytyminen on onnistunut. Voit tallentaa palautusarvon muuttujaan, jotta voit jatkaa työskentelyä tietokantapalvelimen kanssa. Seuraava koodilohko käyttää mysql_connect()- funktiota MySQL-tietokantapalvelimelle kytkeytymiseen: $link = mysql_connect( "localhost", "root", "n1ckel" ); if (! $link ) die( "Couldn't connect to MySQL" ); Jos käytät PHP:tä Apachen kanssa, voit kytkeytyä tietokantapalvelimeen myös mysql_pconnect()- funktiolla. Itse asiassa siinä on merkittävä ero. Jos käytät tätä funktiota, yhteys ei katkea, kun skriptisi lopettaa suorituksen tai jos kutsut mysql_close()-funktiota (joka lopettaa standardiyhteyden MySQLpalvelimelle). Sen sijaan yhteys jää aktiiviseksi odottaen toista prosessia kutsumaan mysql_pconnect()- funktiota. Toisin sanoen uutta yhteyttä ei tarvitse avata palvelimelle, jolloin resursseja säästyy; aiempi kutsu on jättänyt yhteyden auki.

214 12. MySQL-tietokannankäyttö Tietokannan valitseminen Kun olet nyt toteuttanut yhteyden MySQL-demoniin, voitkin valita tietokannan, jolla haluaisit työskennellä. Tietokanta valitaan mysql_select_db()-funktiolla. Funktio ottaa argumentikseen tietokannan nimen ja valinnaisen linkkitunnisteen. Jos tunniste jätetään pois, käytetään oletuksena edellisessä kytkeytymisessä palautettua tunnistetta. Funktio palauttaa arvon true, jos tietokanta on olemassa ja sitä voidaan käsitellä. Seuraava koodilohko valitsee tietokannan nimeltä sample: $database = "sample"; mysql_select_db( $sample ) or die ( "Couldn't open $sample ); Virheistä selviytyminen Toistaiseksi olemme testanneet MySQL-funktion palautusarvot ja käyttäneet die()-funktiota lopettamaan skriptin suoritus, jos ongelmia ilmenee. Voisit kuitenkin lisäksi tulostaa tietoa virheestä selaimelle voidaksesi paremmin korjata virheen. MySQL asettaa virhenumeron ja virhemerkkijonon aina, kun toiminto ei onnistu. Saat virhenumeron esille funktiolla mysql_errno() ja virhetekstin funktiolla mysql_error(). Listaus 12.1 sisältää aiemmat esimerkkimme; siinä kytkeydytään tietokantapalvelimelle ja valitaan tietokanta. Käytämme mysql_error()-funktiota selkeyttämään virheilmoituksia. Listaus 12.1 Yhteyden avaaminen ja tietokannan valitseminen 1: <html> 2: <head> 3: <title>listing 12.1 Opening a connection and 4: selecting a database</title> 5: </head> 6: <body> 7: <?php 8: $user = "harry"; 9: $pass = "elbomonkey"; 10: $db = "sample"; 11: $link = mysql_connect( "localhost", $user, $pass ); 12: if (! $link ) 13: die( "Couldn't connect to MySQL" ); 14: print "Successfully connected to server<p>"; 15: mysql_select_db( $db ) 16: or die ( "Couldn't open $db: ".mysql_error() ); 17: print "Successfully selected database \"$db\"<p>"; 18: mysql_close( $link );

12. MySQL-tietokannankäyttö 215 19:?> 20: </body> 21: </html> Jos muutamme $db-muuttujan arvoksi notthere, yritämme avata tietokantaa, jota ei ole olemassa. Tällöin die()-funktion tulostus näyttää jokseenkin seuraavalta: Couldn't open sample2: Access denied for user: 'harry@localhost' to database 'sample2' Tiedon lisääminen taulukkoon Kun olemme nyt saaneet esille tietokannan, voimme lisätä tietoa sen taulukoihin. Seuraavissa esimerkeissä oletetaan, että olemme kehittämässä sivustoa, jonka kautta voidaan ostaa domain-nimiä. Olemme luoneet domains-nimisen taulukon sample-tietokantaan. Taulukossa on viisi saraketta: peruavain nimeltä id, joka kasvaa automaattisesti yhdellä, kun uusi tietue lisätään taulukkoon, domain-kenttä, jossa on vaihteleva määrä merkkejä (VARCHAR), sex-kenttä, jossa on yksittäinen merkki ja mail-kenttä, joka sisältää käyttäjän email-osoitteen. Seuraava SQL-lause luo taulukon: create table domains ( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY( id ), domain VARCHAR( 20 ), sex CHAR(1), mail VARCHAR( 20 ) ); Lisätäksemme tietoa taulukkoon meidän tulee muodostaa SQL-kysely ja ajaa se. PHP tarjoaa tähän tarkoitukseen mysql_query()-funktion. Funktio ottaa argumentikseen merkkijonon, jossa on SQL-kysely ja valinnaisen linkkitunnisteen. Jos tunniste jätetään pois, kysely lähetetään sille tietokantapalvelimelle, johon viimeksi kytkeydyttiin. Funktio palauttaa positiivisen arvon, jos kysely onnistuu. Jos kyselyssä on syntaksivirhe tai jos tietokannan käyttöön ei ole riittäviä oikeuksia, funktio palauttaa false-arvon. Huomaa, että onnistunut kysely ei välttämättä johda muutettuihin riveihin. Listaus 12.2 on laajennettu versio edellisestä esimerkistämme; siinä käytetään mysql_query()-funktiota lähettämään INSERT-komento sample-tietokannan domains-taulukolle. Listaus 12.2 Rivin lisääminen taulukkoon 1: <html> 2: <head> 3: <title>listing 12.2 Adding a row to a table</title> 4: </head>

216 12. MySQL-tietokannankäyttö 5: <body> 6: <?php 7: $user = "harry"; 8: $pass = "elbomonkey"; 9: $db = "sample"; 10: $link = mysql_connect( "localhost", $user, $pass ); 11: if (! $link ) 12: die( "Couldn't connect to MySQL" ); 13: mysql_select_db( $db, $link ) 14: or die ( "Couldn't open $db: ".mysql_error() ); 15: $query = "INSERT INTO domains ( domain, sex, mail ) 16: values( '123xyz.com', 'F', 'sharp@adomain.com' )"; 17: mysql_query( $query, $link ) 18: or die ( "Couldn't add data to \"domains\" table: " 19:.mysql_error() ); 20: mysql_close( $link ); 21:?> 22: </body> 23: </html> Huomaa, että emme laittaneet arvoa id-kenttään. Kyseinen kenttä kasvattaa automaattisesti itseään. Aina kun lataamme listauksen 12.2 skriptin, sama tieto lisätään tietenkin uudelle riville. Listauksessa 12.3 käyttäjän antamat tiedot lisätään tietokantaamme. Listaus 12.3 Käyttäjän syöttämien tietojen lisääminen tietokantaan 1: <html> 2: <head> 3: <title>listing 12.3 Adding user input to a database</title> 4: </head> 5: <body> 6: <?php 7: if ( isset( $domain ) && isset( $sex ) && isset( $domain ) ) 8: { 9: // tarkista syöttötieto!

12. MySQL-tietokannankäyttö 217 10: $dberror = ""; 11: $ret = add_to_database( $domain, $sex, $mail, $dberror ); 12: if (! $ret ) 13: print "Error: $dberror<br>"; 14: else 15: print "Thank you very much"; 16: } 17: else { 18: write_form(); 19: } 20: 21: function add_to_database( $domain, $sex, $mail, &$dberror ) 22: { 23: $user = "harry"; 24: $pass = "elbomonkey"; 25: $db = "sample"; 26: $link = mysql_pconnect( "localhost", $user, $pass ); 27: if (! $link ) 28: { 29: $dberror = "Couldn't connect to MySQL server"; 30: return false; 31: } 32: if (! mysql_select_db( $db, $link ) ) 33: { 34: $dberror = mysql_error(); 35: return false; 36: } 37: $query = "INSERT INTO domains ( domain, sex, mail ) 38: values( '$domain', '$sex', '$mail' )"; 39: if (! mysql_query( $query, $link ) ) 40: { 41: $dberror = mysql_error(); 42: return false;

218 12. MySQL-tietokannankäyttö 43: } 44: return true; 45: } 46: 47: function write_form() 48: { 49: global $PHP_SELF; 50: print "<form action=\"$php_self\" method=\"post\">\n"; 51: print "<input type=\"text\" name=\"domain\"> "; 52: print "The domain you would like<p>\n"; 53: print "<input TYPE=\"text\" name=\"mail\"> "; 54: print "Your mail address<p>\n"; 55: print "<select name=\"sex\">\n"; 56: print "\t<option value=\"f\"> Female\n"; 57: print "\t<option value=\"m\"> Male\n"; 58: print "</select>\n"; 59: print "<input type=\"submit\" value=\"submit!\">\n</form>\n"; 60: } 61:?> 62: </body> 63: </html> Pitääksemme esimerkin lyhyenä olemme jättäneet pois merkittävän prosessin listauksesta 12.3. Luotamme käyttäjiimme. Itse asiassa meidän tulisi tarkistaa, millaista tietoa käyttäjä syöttää. Käsittelemme merkkijonofunktioita, jotka helpottavat testaamista, luvussa 17, Merkkijonojen käsittely. Tarkistamme koodissamme muuttujat $domain, $sex ja $mail. Jos ne ovat olemassa, voimme olla melko varmoja siitä, että muuttujat on lähetetty käyttäjän toimesta ja voimme kutsua sitten add_to_database()-funktiota. Funktio ottaa neljä argumenttia: muuttujat $domain, $sex ja $mail sekä merkkijonomuuttujan $dberror. Viimeiseen muuttujaan laitetaan mahdolliset virhetekstit ja siksi $dberror on nyt viittaustyyppinen parametri. Kaikki muutokset, jotka tapahtuvat muuttujalle funktion toimesta, muuttavat alkuperäistä muuttujaa, eikä kyseessä siis ole kopio. Yritämme avata yhteyden MySQL-palvelimelle. Jos se epäonnistuu, sijoitamme virhetekstin $dberrormuuttujaan ja lopetamme muuttujan ajamisen palauttamalla arvon false. Valitsemme tietokannan, jossa on domains-taulukko ja muodostamme SQL-kyselyn, joka laittaa käyttäjän lähettämät tiedot tietokantaan. Kyselyteksti viedään mysql_query()-funktiolle, joka hoitaa kyselyn suorittamisen. Jos joko mysql_select_db() tai mysql_query() epäonnistuu, sijoitetaan mysql_error()-funktion palauttama arvo $dberror-muuttujaan ja palautetaan false kutsuvalle ohjelmalle. Jos kaikki menee hyvin, funktio palauttaa arvon true.

12. MySQL-tietokannankäyttö 219 Kutsuvassa koodissa testataan add_to_database()-funktion palauttama arvo. Jos se on true, voimme olla varmoja siitä, että tiedot on lisätty tietokantaan ja voimme kiittää käyttäjää siitä. Muutoin tulostamme virhetekstin selaimelle. Tiedämme, että $dberror sisältää nyt tärkeää tietoa, joten laitamme sen mukaan virheilmoitukseen. Jos alussa oleva if-lause ei onnistu löytämään $domain-, $sex- tai $mail-muuttujia, oletamme, että mitään tietoa ei ole lähetetty, ja kutsumme toista käyttäjän määrittelemää funktiota, write_form(), joka tulostaa HTML-lomakkeen selaimelle. Automaattisesti inkrementoidun kentän arvon saaminen Edellisissä esimerkeissämme lisäsimme tietoa tietokantaan murehtimatta id-sarakkeesta, joka kasvaa automaattisesti yhdellä aina uutta tietoa lisättäessä. Jos meidän on saatava esille tuon kentän arvo, voimme aina käyttää SQL-kyselyä. Entäpä, jos arvoa tarvittaisiin aivan heti? Olisi tuhlaavaista lähteä hakemaan sitä SQL-kyselyllä. Onneksi PHP tarjoaa käyttöön mysql_insert_id()-funktion, joka palauttaa automaattisesti kasvatetun kentän arvon INSERT-tyyppisen SQL-kyselyn suorittamisen jälkeen. Funktio ottaa valinnaiseksi argumentiksi linkkitunnisteen. Jos mitään argumentteja ei anneta, funktio käyttää viimeksi toteutettua linkkiä. Jos siis haluamme kertoa käyttäjälle numeroarvon, joka uudelle tietueelle generoitiin, voimme käyttää mysql_insert_id()-funktiota heti tietojen lisäämisen jälkeen. $query = "INSERT INTO domains ( domain, sex, mail ) values( '$domain', '$sex', A '$mail' )"; mysql_query( $query, $link ); $id = mysql_insert_id(); print "Thank you. Your transaction number is $id. Please quote it in any A queries."; Tiedon ottaminen esille Kun osaat nyt lisätä tietoa tietokantaan, on aika tutkia menettelytapoja, joilla tieto saadaan esille. Kuten arvaatkin, voit käyttää mysql_query()-funktiota ja tehdä SELECT-kyselyn. Kuinka sitten pääset tutkimaan palautettuja rivejä? Kun olet suorittanut onnistuneen SELECT-kyselyn, mysql_query() palauttaa tulostunnisteen. Voit viedä tuon tunnisteen muille funktioille käsitelläksesi tulosjoukkoa. Kyselyn antaman rivimäärän selvittäminen SELECT-kyselyn tuloksena saatujen rivien määrä saadaan esille mysql_num_rows()-funktiolla. Se ottaa argumentikseen tulostunnisteen ja palauttaa joukossa olevien rivien määrän. Listaus 12.4 käyttää SELECTkyselyä kaikkien domains-taulukossa olevien rivien palauttamiseen. Sen jälkeen esimerkissä käytetään mysql_num_rows()-funktiota määrittämään taulukon koko.

220 12. MySQL-tietokannankäyttö Listaus 12.4 SELECT-kyselyn palauttamien rivien määrän selvittäminen 1: <html> 2: <head> 3: <title>listing 12.4 Using mysql_num_rows()</title> 4: </head> 5: <body> 6: <?php 7: $user = "harry"; 8: $pass = "elbomonkey"; 9: $db = "sample"; 10: $link = mysql_connect( "localhost", $user, $pass ); 11: if (! $link ) 12: die( "Couldn't connect to MySQL" ); 13: mysql_select_db( $db, $link ) 14: or die ( "Couldn't open $db: ".mysql_error() ); 15: $result = mysql_query( "SELECT * FROM domains" ); 16: $num_rows = mysql_num_rows( $result ); 17: print "There are currently $num_rows rows in the table<p>"; 18: mysql_close( $link ); 19:?> 20: </body> 21: </html> Kyselyfunktion palauttama tulostunniste viedään mysql_num_rows()-funktiolla, joka palauttaa rivien määrän. Tulosjoukon käsittely Kun olet suorittanut SELECT-kyselyn ja saanut esille tulostunnisteen, voit käydä silmukassa läpi jokaisen rivin vuoron perään. PHP ylläpitää sisäistä osoitinta, joka kertoo sijainnin rivijoukossa. Osoitin siirtyy seuraavalle riville yhden rivin käsittelyn jälkeen. Voit saada helposti esille rivillä olevien kenttien taulukon mysql_fetch_row()-funktiolla. Se ottaa argumentikseen tulostunnisteen ja palauttaa taulukon, joka sisältää rivin kaikki kentät. Kun tulosjoukon loppu kohdataan, mysql_fetch_row() palauttaa arvon false. Listaus 12.5 tulostaa domain-taulukon kokonaan selaimelle.

12. MySQL-tietokannankäyttö 221 Listaus 12.5 Taulukon kaikkien rivien ja kenttien tulostaminen 1: <html> 2: <head> 3: <title>listing 12.5 Listing all rows and fields in a table</title> 4: </head> 5: <body> 6: <?php 7: $user = "harry"; 8: $pass = "elbomonkey"; 9: $db = "sample"; 10: $link = mysql_connect( "localhost", $user, $pass ); 11: if (! $link ) 12: die( "Couldn't connect to MySQL" ); 13: mysql_select_db( $db, $link ) 14: or die ( "Couldn't open $db: ".mysql_error() ); 15: $result = mysql_query( "SELECT * FROM domains" ); 16: $num_rows = mysql_num_rows( $result ); 17: print "There are currently $num_rows rows in the table<p>"; 18: print "<table border=1>\n"; 19: while ( $a_row = mysql_fetch_row( $result ) ) 20: { 21: print "<tr>\n"; 22: foreach ( $a_row as $field ) 23: print "\t<td>$field</td>\n"; 24: print "</tr>\n"; 25: } 26: print "</table>\n"; 27: mysql_close( $link ); 28:?> 29: </body> 30: </html>

222 12. MySQL-tietokannankäyttö Kun olemme kytkeytyneet palvelimelle ja valinneet tietokannan, käytämme mysql_query()-funktiota lähettämään SELECT-lause tietokantapalvelimelle. Palautettu tulososoitin tallennetaan $result-muuttujaan. Käytämme sitä löydettyjen rivien määrän esille ottamiseen, kuten ennenkin. While-lauseen testiehdossa sijoitetaan mysql_fetch_row()-funktion palauttama tulos $a_row-muuttujaan. Muista, että sijoitusoperaattori palauttaa operaattorin oikealla puolella olevan arvon, joten sijoituslauseen tulos on true niin kauan kuin mysql_fetch_row() palauttaa positiivisen arvon. While-lauseen rungossa käydään läpi kukin $a_row-taulukko ja tulostetaan kukin elementti selaimelle, taulukon soluun. Voit saada esille myös kenttien nimet kahdella eri tavalla. Funktio mysql_fetch_array() palauttaa numeerisen taulukon samalla lailla kuin mysql_fetch_row(). Se palauttaa myös assosiatiivisen taulukon, jonka avaimina ovat kenttien nimet. Seuraava koodilohko kirjoittaa listauksen 12.5 while-lauseen uudelleen ja hyödyntää siinä mysq_fetch_array()-funktiota: print "<TABLE BORDER=1>\n"; while ( $a_row = mysql_fetch_array( $result ) ) { print "<TR>\n"; print "<TD>$a_row[mail]</TD><TD>$a_row[domain]</TD>\n"; print "</TR>\n"; } print "</TABLE>\n"; Voit saada kentät esille riviltä myös objektin ominaisuuksina funktiolla mysql_fetch_object(). Kenttien nimistä tulee ominaisuuksien nimiä. Seuraava koodilohko kirjoittaa listauksen 12.5 while-lauseen taas uudelleen, tällä kertaa siinä käytetään mysql_fetch_object()-funktiota: print "<table border=1>\n"; while ( $a_row = mysql_fetch_object( $result ) ) { print "<tr>\n"; print "<td>$a_row->mail</td><td>$a_row->domain</td>\n"; print "</tr>\n"; } print "</table>\n"; Sekä mysql_fetch_array()- että mysql_fetch_object()-funktio helpottavat tiedon saamista riveiltä. Kumpikaan funktioista ei vie suoritusaikaa juurikaan enempää kuin mysql_fetch_row().

12. MySQL-tietokannankäyttö 223 Tiedon muuttaminen Voit muuttaa tietoa mysql_query()-funktiolla käyttämällä UPDATE-lausetta. Onnistunut päivitys ei välttämättä muuta taulukon rivejä. On kutsuttava mysql_affected_rows()-funktiota selvittämään, ovatko taulukon tiedot muuttuneet. Funktio ottaa valinnaiseksi argumentikseen linkkitunnisteen. Jos sitä ei anneta, funktio käyttää viimeksi generoitua linkkitunnistetta. Funktiota voidaan käyttää SQL-kyselyssä taulukon rivin tietojen muuttamiseen. Listaus 12.6 muodostaa skriptin, joka sallii hallintahenkilön muuttaa mitä tahansa domain-taulukon saraketta. Listaus 12.6 Rivien muuttaminen mysql_query()-funktiolla 1: <html> 2: <head> 3: <title>listing 12.6 Using mysql_query() 4: to alter rows in a database</title> 5: </head> 6: <body> 7: <?php 8: $user = "harry"; 9: $pass = "elbomonkey"; 10: $db = "sample"; 11: $link = mysql_connect( "localhost", $user, $pass ); 12: if (! $link ) 13: die( "Couldn't connect to MySQL" ); 14: mysql_select_db( $db, $link ) 15: or die ( "Couldn't open $db: ".mysql_error() ); 16: if ( isset( $domain ) && isset( $id ) ) 17: { 18: $query = "UPDATE domains SET domain = '$domain' where id=$id"; 19: $result = mysql_query( $query ); 20: if (! $result ) 21: die ("Couldn't update: ".mysql_error()); 22: print "<h1>table updated ". mysql_affected_rows(). 23: " row(s) changed</h1><p>"; 24: } 25:?>

224 12. MySQL-tietokannankäyttö 26: <form action="<? print $PHP_SELF?>" method="post"> 27: <select name="id"> 28: <? 29: $result = mysql_query( "SELECT domain, id FROM domains" ); 30: while( $a_row = mysql_fetch_object( $result ) ) 31: { 32: print "<OPTION VALUE=\"$a_row->id\""; 33: if ( isset($id) && $id == $a_row->id ) 34: print " SELECTED"; 35: print "> $a_row->domain\n"; 36: } 37: mysql_close( $link ); 38:?> 39: </select> 40: <input type="text" name="domain"> 41: </form> 42: </body> 43: </html> Avaamme yhteyden tietokantapalvelimelle ja valitsemme tietokannan normaalisti. Sitten testaamme, ovatko muuttujat $domain ja $id olemassa. Jos ovat, muodostamme UPDATE-kyselyn, joka muuttaa sen rivin domain-kentän arvoa, jossa id on sama kuin muuttujassa $id. Emme tule aiheuttaneeksi virhettä, jos idarvoa ei ole olemassa tai jos $domain sisältää saman arvon kuin rivin domain-kenttä. Sen sijaan mysql_affected_rows() palauttaa tuolloin pelkän nollan. Tulostamme palautusarvon (tavallisesti 1 tässä esimerkissä) selaimelle. Tulostamme HTML-lomakkeen, jonka kautta hallintahenkilö voi tehdä muutoksia. Huomaa, että käytämme mysql_query()-funktiota uudelleen siepataksemme id- ja domain-kenttien arvot ja yhdistääksemme ne SELECT-komponenttiin. Hallintahenkilö voi käyttää tätä alasvetovalikkoa valitakseen muutettavan domainin. Jos hallintahenkilö on jo lähettänyt lomakkeen ja hänen valitsemansa id-arvo vastaa juuri tulostettavaa idkenttää, lisäämme merkkijonon SELECTED OPTION-alkioon. Näin varmistamme, että muutettu arvo on heti näkyvillä valikossa. Tietokantaa koskevan tiedon selvittäminen Toistaiseksi olemme tutkineet tiedon lisäämistä tietokantaan ja sen esille ottamista tietokannasta. PHP tarjoaa käyttöön funktioita, joilla saadaan esille numerotietoa ja rakennetietoa tietokannasta.

12. MySQL-tietokannankäyttö 225 Tietokantojen luetteleminen Luettelo kaikista nykyisen yhteyden päässä olevista tietokannoista saadaan funktiolla mysql_list_dbs(). Funktio hyväksyy valinnaisen linkkitunnisteen ja palauttaa tulostunnisteen, jota voidaan käyttää tulostamaan kaikki saatavilla olevat tietokannat. Tulostaminen tehdään mysql_tablename()-funktiolla. Funktio ottaa kaksi argumenttia: tulososoittimen ja tietokannan indeksin. Se palauttaa viitatun tietokannan nimen. Tietokantojen indeksointi alkaa nollasta (0). Tietokantojen määrä saadaan selville kutsumalla mysql_num_rows()-funktiota, jonka argumenttina on mysql_list_dbs()-funktion palauttama tulostunniste. Listaus 12.7 kytkeytyy MySQL-demoniin ja tulostaa luettelon tietokannoista selaimelle. Listaus 12.7 Yhteyden tietokantojen luetteleminen 1: <html> 2: <head> 3: <title>listing 12.7 Listing the databases 4: available in a connection</title> 5: </head> 6: <body> 7: <?php 8: $user = "harry"; 9: $pass = "elbomonkey"; 10: $link = mysql_connect( "localhost", $user, $pass ); 11: if (! $link ) 12: die( "Couldn't connect to MySQL" ); 13: $db_res = mysql_list_dbs( $link ); 14: $num = mysql_num_rows( $db_res ); 15: for( $x = 0; $x < $num; $x++ ) 16: print mysql_tablename( $db_res, $x )."<br>"; 17: mysql_close( $link ); 18:?> 19: </body> 20: </html> Funktion mysql_list_dbs() kutsu palauttaa tulososoittimen. Voimme käyttää tulososoitinta saadaksemme löydettyjen kohteiden kokonaismäärän. Tulososoitin viedään mysql_num_rows()-funktiolle argumenttina. Sijoitamme tuon määrän $num-muuttujaan, jota käytetään sitten for-lauseessa. Kullakin silmukkakierroksella viemme mysql_tablename()-funktiolle tulososoittimen ja indeksin $x. Indeksi kasvaa nollasta arvoon $num-1. Kuva 12.1 näyttää listauksen 12.7 tulostuksen. Voisit käyttää myös mysql_list_dbs()-funktion palauttamaa tulostunnistetta samalla lailla kuin mysql_query()-funktion palauttamaa tunnistetta SELECT-

226 12. MySQL-tietokannankäyttö kyselyssä. Voit siis viedä tunnisteen mysql_fetchrow()-funktiolle; se palauttaa taulukon, jonka ensimmäisenä alkiona on tietokannan nimi. KUVA 12.1 Kaikkien tietokantojen listaaminen Tietokannan taulukoiden luetteleminen Tietokannan taulukot voidaan luetella funktiolla mysql_list_tables(); se ottaa argumentikseen tietokannan nimen ja (valinnaisen) linkkitunnisteen. Jos tietokanta löytyy ja sinulla on oikeudet sen käyttämiseen, mysql_list_tables() palauttaa tulostunnisteen, jota voit käyttää fetch()-funktioiden yhteydessä (esimerkiksi mysql_fetch_row()-funktion kanssa). Vaihtoehtoisesti voit käyttää mysql_tablename()-funktiota, kuten teimme mysql_list_dbs()-funktion yhteydessä. Seuraava koodilohko käyttää mysql_list_tables()-funktiota listaamaan tietokannan kaikki taulukot: $result = mysql_list_tables( "sample", $link ); while ( $tab_rows = mysql_fetch_row( $result ) ) print "$tab_rows[0]<br>\n"; Kenttien listaaminen ja tutkiminen Kun saat esille tulostunnisteen SELECT-kyselyä tekevältä mysql_query()-funktiolta, voit laskea palautettujen sarakkeiden määrän mysql_num_fields()-funktiolla. Funktio ottaa tulostunnisteen argumentikseen ja palauttaa kokonaisluvun, joka kertoo löydettyjen kenttien määrän: $result = mysql_query( "SELECT * from domains" ); $num_fields = mysql_num_fields( $result );

12. MySQL-tietokannankäyttö 227 Kullakin kentällä on indeksi (joka alkaa nollasta). Tulostunnisteen ja kentän indeksin perusteella saadaan esille kentän ominaisuudet, esimerkiksi nimi, tyyppi, maksimipituus ja liput. Kentän nimi saadaan esille viemällä mysql_field_name()-funktiolle tulostunniste ja kentän indeksi: $result = mysql_query( "SELECT * from domains" ); $num_fields = mysql_num_fields( $result ); for ( $x=0; $x<$num_fields; $x++ ) mysql_field_name( $result, $x ). "<BR>\n"; Kentän maksimipituus saadaan vastaavasti funktiolla mysql_field_len(): $result = mysql_query( "SELECT * from domains" ); $num_fields = mysql_num_fields( $result ); for ( $x=0; $x<$num_fields; $x++ ) mysql_field_len( $result, $x ). "<BR>\n"; Kentän liput saadaan esille vastaavasti funktiolla mysql_field_flags(): $result = mysql_query( "SELECT * from domains" ); $num_fields = mysql_num_fields( $result ); for ( $x=0; $x<$num_fields; $x++ ) mysql_field_flags( $result, $x ). "<BR>\n"; Kentän tyyppi saadaan esille funktiolla mysql_field_type(): $result = mysql_query( "SELECT * from domains" ); $num_fields = mysql_num_fields( $result ); for ( $x=0; $x<$num_fields; $x++ ) mysql_field_flags( $result, $x ). "<BR>\n"; Tietokannan rakenne: kaikki yhdessä Listaus 12.8 yhdistää kaikki edellä kuvatut tekniikat, joilla lueteltiin tietokannat, taulukot ja kentät.

228 12. MySQL-tietokannankäyttö Listaus 12.8 Jokaisen tietokannan, taulukon ja kentän luetteleminen 1: <html> 2: <head> 3: <title>listing 12.8 Listing every database, table, and field</title> 4: </head> 5: <body> 6: <?php 7: $user = "root"; 8: $pass = "n1ckel"; 9: $db = "sample"; 10: $link = mysql_connect( "localhost", $user, $pass ); 11: if (! $link ) 12: die( "Couldn't connect to MySQL" ); 13: $db_res = mysql_list_dbs( $link ); 14: while ( $db_rows = mysql_fetch_row( $db_res ) ) 15: { 16: print "<b>$db_rows[0]</b>\n"; 17: if (!@mysql_select_db( $db_rows[0], $link ) ) 18: { 19: print "<dl><dd>couldn't connect -- ". mysql_error()." </dl>"; 20: continue; 21: } 22: $tab_res = mysql_list_tables( $db_rows[0], $link ); 23: print "\t<dl><dd>\n"; 24: while ( $tab_rows = mysql_fetch_row( $tab_res ) ) 25: { 26: print "\t<b>$tab_rows[0]</b>\n"; 27: $query_res = mysql_query( "SELECT * from $tab_rows[0]" ); 28: $num_fields = mysql_num_fields( $query_res ); 29: print "\t\t<dl><dd>\n"; 30: for ( $x=0; $x<$num_fields; $x++ ) 31: {

12. MySQL-tietokannankäyttö 229 32: print "\t\t<i>"; 33: print mysql_field_type( $query_res, $x ); 34: print "</i> <i>"; 35: print mysql_field_len( $query_res, $x ); 36: print "</i> <b>"; 37: print mysql_field_name( $query_res, $x ); 38: print "</b> <i>"; 39: print mysql_field_flags( $query_res, $x ); 40: print "</i><br>\n"; 41: } 42: print "\t\t</dl>\n"; 43: } 44: print "\t</dl>\n"; 45: } 46: mysql_close( $link ); 47:?> 48: </body> 49: </html> Kytkeydymme MySQL-palvelimelle tavalliseen tapaan ja kutsumme mysql_list_dbs()-funktiota saadaksemme esille tulostunnisteen. Viemme tunnisteen mysql_fetch_row()-funktiolle, joka palauttaa vuorostaan tietokantojen nimet (ne on tallennettu $db_rows-taulukon ensimmäiseen alkioon). Viemme kunkin tietokannan nimen sitten mysql select_db()-funktiolle. Jos oikeutemme eivät riitä, tulostuu viesti selaimelle ja continue-lauseen kautta jatketaan eteenpäin seuraavalle kierrokselle. Jos tietokanta saadaan valituksi, tulostetaan kyseisen tietokannan taulukoiden nimet. Viemme tietokannan nimen mysql_list_tables()-funktiolle ja saamme uuden tulostunnisteen. Jälleen kerran viemme sen mysql_fetch_row()-funktiolle, joka alkaa tulostaa silmukassa taulukoiden nimiä. Tulostamme taulukon nimen ja käytämme sitten SQL-kielistä SELECT-kyselyä, joka hakee taulukon kaikki kentät ja rivit. Viemme kyselyn mysql_query()-funktiolle ja saamme nyt toisen tulostunnisteen. Se viedään mysql_num_fields()-funktiolle, joka palauttaa kenttien määrän. Sitten käytämme for-lausetta käymään läpi tulosjoukon ja tulostamaan sitten sarakkeiden ominaisuustiedot. Sarakkeiden indeksit (laskurimuuttujassa $x) alkavat nollasta ja maksimiarvo on sarakkeiden määrä vähennettynä yhdellä. Sarakkeiden kohdalla kutsutaan sitten juuri käsiteltyjä kentän testausfunktioita.

230 12. MySQL-tietokannankäyttö Kun skripti on ajettu, selaimella tulisi olla siisti tulostus, jossa näkyvät yhdeyden päässä olevat tietokannat, tietokannoissa olevat taulukot ja taulukoiden kenttätiedot. Kuva 12.2 esittää osan tulostuksesta. KUVA 12.2 Jokaisen tietokannan, taulukon ja kentän luetteleminen. Yhteenveto Tällä tunnilla käsittelimme MySQL-tietokantoja. Tutkimme, kuinka tietoa tallennetaan tietokantoihin ja kuinka sitä saadaan esille tietokannoista. Sinun tulisi nyt osata toteuttaa kytkeytyminen MySQL-tietokantaan käyttäen mysql_connect()- tai mysql_pconnect()-funktiota. Tietokannan valintaan voit sitten käyttää mysql_select_db()-funktiota. Jos valinta epäonnistuu, saat esille virheinformaatiota mysql_error()-funktiolla. SQL-kyselyjä voit laatia mysql_query()-funktiolla. Funktio palauttaa tulostunnisteen, jonka avulla päästään tietoon käsiksi ja saadaan selville muuttuneiden rivien määrä. Sinun tulisi nyt osata käyttää PHP:n MySQL-funktioita saadaksesi esille myös luettelon tietokannoista, taulukoista ja kentistä sekä lisätietoa kenttien ominaisuuksista. K&V Q Tällä tunnilla käsiteltiin MySQL-tietokantoja. Kuinka hyvin voin siirtää näitä esimerkkejä muihin SQLtietokantoihin? V On olemassa MySQL-funktioita, jotka ovat lähes samanlaisia kuin MySQL-funktiot. Muilla tietokantapalvelimilla on vastaavia PHP-funktioita, jotka tukevat niiden piirteitä ja mahdollisuuksia. Eri lähteistä tulevilla tietokantafunktioilla on yhteisenä piirteenä mahdollisuus SQL-kyselyihin. Jos käytät ANSIstandardin mukaista SQL-syntaksia, sinulla ei pitäisi olla ongelmia sovittaa skriptisi eri tietokantapalvelimille.