Avdeling for informatikk og e-læring, Høgskolen i Sør-Trøndelag Helge Hafting 16.10.2007 Lærestoffet er utviklet for faget LV476D/LN476D Linux systemdrift Innhold 8 1 8.1 Databasen MySQL............................. 1 8.1.1 Installere.............................. 2 8.1.2 Eksempel, personaldatabase.................... 2 8.1.3 Opprette eksempeldatabasen med sql............... 3 8.1.4 Mer om databaser.......................... 5 8.1.5 phpmyadmin............................ 5 8.2 Dynamiske sider med PHP og MySQL................... 7 8.2.1 Eksempelside............................ 7 8.3 Oppsummering............................... 8 8 Resymé: I denne leksjonen ser vi på databasen mysql, og hvordan den brukes for å lage dynamiske websider ved hjelp av PHP. Denne leksjonen bygger på den forrige. 8.1 Databasen MySQL MySQL er en populær og fritt tilgjengelig databasemotor. Den følger med de fleste linuxdistribusjoner. MySQL er et frittstående produkt og kan brukes overalt hvor man trenger en
side 2 av 9 database. Vi skal se spesielt på anvendelse for webapplikasjoner. 8.1.1 Installere Programpakkene installeres slik: aptitude install mysql-server php5-mysql Debian vil spørre etter et passord for databasen. Finn på noe passende. Dette installerer databasetjeneren, og koblinger til php. For å teste databasen og se at installasjonen virker, kan du gjøre som vist nedenfor. Det du trenger skrive, er satt i fet kursiv. # mysql --password Enter password: sqlpassordet Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 16 Server version: 5.0.45-Debian_1-log Debian etch distribution Type help; or \h for help. Type \c to clear the buffer. mysql> show databases; +--------------------+ Database +--------------------+ information_schema mysql +--------------------+ 2 rows in set (0.00 sec) mysql> \q Bye Hvis dette går greit, vet du at databasen fungerer som den skal. Kommandoen show databases viser hvilke databaser som finnes. Her ser vi bare standardbaser, fordi vi ikke har lagd noen egne ennå. \q brukes for å avslutte. 8.1.2 Eksempel, personaldatabase Som eksempel viser jeg en liten personaldatabase. Denne databasen lagrer tre opplysninger om ansatte: navn, tittel og nærmeste overordnete. Se tabell 8.1 på neste side for hvordan en slik databasetabell kan se ut. En linje i en slik tabell kalles en post. Det er altså en post for hver ansatt. Etter å ha sett på denne idéen, ser vi noen problemer. For det første er det mange som har samme sjef. I et større firma kan det bli veldig mange. Vi sløser dermed med plass til å lagre det samme navnet mange ganger. Og hva om «Per» bytter navn til «Leif-Per» for å få
Databasen MySQL side 3 av 9 Navn Tittel Overordnet Ola Korneliussen Adm.dir Trine Franzen Tekn.sjef Ola Korneliussen Per Korneliussen Personalsjef Ola Korneliussen Hans Hansen Programmerer Trine Franzen Nina Olsen Webdesigner Trine Franzen Preben Nielsen Regnskapsfører Per Korneliussen Nina Olsen Vaktmester Per Korneliussen Tabell 8.1: Personaldatabase bedre drag på damene? I så fall må vi oppdatere postene til alle ansatte som har ham som overordnet. I stedet for å lagre navnet på sjefen, kan vi la tabellen inneholde en referanse til sjefens egen post i databasen. Dermed lagres navn bare én gang. Et annet problem er at flere ansatte kan ha samme navn. Her har vi to som heter «Nina Olsen». Som regel trenger databasen å kunne identifisere hver enkelt ansatt, og da er ikke navn bra nok. Dette kan vi ordne ved å innføre et ansattnr, som skal være forskjellig for hver ansatt. Se tabell 8.2 for forslag til en tabell som løser disse problemene. Ansattnr Navn Tittel Overordnet 1 Ola Korneliussen Adm.dir 2 Trine Franzen Tekn.sjef 1 3 Per Korneliussen Personalsjef 1 4 Hans Hansen Programmerer 2 5 Nina Olsen Webdesigner 2 6 Preben Nielsen Regnskapsfører 3 7 Nina Olsen Vaktmester 3 Tabell 8.2: Bedre personaldatabase 8.1.3 Opprette eksempeldatabasen med sql Slik oppretter vi en database. Det som må skrives inn, står med fet kursiv.
side 4 av 9 # mysql --password Enter password: sqlpassordet Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 20 Server version: 5.0.45-Debian_1-log Debian etch distribution Type help; or \h for help. Type \c to clear the buffer. mysql> create database personaldb; Query OK, 1 row affected (0.00 sec) mysql> use personaldb; Database changed mysql> create table ansatt ( -> ansattnr int auto_increment primary key not null, -> navn varchar(40) not null, -> tittel varchar(40), -> overordnet int, -> foreign key (overordnet) references ansatt(ansattnr) -> ) engine=innodb; Query OK, 0 rows affected (0.09 sec) mysql> \q Bye Det er forhåpentligvis opplagt hva kommandoer som create database og use... gjør. create table oppretter tabellen med personalopplysninger. Første linje lager feltet «ansattnr», som er heltall (int). Det skal telles opp automatisk for hver ny ansatt, dermed slipper vi å lage slike numre selv. Feltet kan ikke være tomt, alle ansatte skal altså ha et nummer. «primary key» betyr at dette feltet er hovednøkkel for tabellen her får MySQL beskjed om at vi ønsker å slå opp ansatte via nummeret. Dermed sørger programmet for at basen lages på en måte som gjør slike oppslag effektive. Neste linje lager navnefeltet, som er på 40 tegn. Heller ikke dette feltet kan være tomt, alle har et navn. De kan også ha en tittel, men det går an å ikke fylle ut tittelen. Deretter oppretter vi feltet «overordnet», som også er et heltall. Dette feltet kan være tomt, fordi en eller annen nødvendigvis er øverst i organisasjonen og dermed ikke har noen overordnet. Linja med «foreign key...» gir MySQL beskjed om at «overordnet» ikke er et hvilket som helst heltall. Det er en fremmednøkkel 1 som refererer til «ansattnr» i tabellen «ansatt». Dermed vil MySQL sørge for at tallene vi lagrer her passer. Hvis vi senere prøver å legge inn et nummer som ikke hører til noen eksisterende ansatt, vil MySQL avvise hele posten. Linja med «engine=innodb» velger hva slags databasemotor MySQL skal bruke for denne tabellen. Databasemotoren «innodb» er nødvendig for tabeller som bruker fremmednøkler. I enklere tilfeller kan man også bruke «myisam». 1 En fremmednøkkel er et felt som refererer til et nøkkelfelt i en eller annen tabell. Vanligvis nøkkelfeltet i en annen tabell, men i dette kompakte eksempelet foregår alt innenfor den samme tabellen.
Databasen MySQL side 5 av 9 8.1.4 Mer om databaser Databaser er et stort fagfelt i seg selv. For å lære mer om databasemodellering og sqlprogrammering, har vi kursene «Databaser» og «Databaseadministrasjon». 8.1.5 phpmyadmin phpmyadmin er et web-basert brukergrensesnitt for å administrere mysql-databaser. Du kan for eksempel bruke phpmyadmin for å legge inn testdatabasen, i stedet for å kjøre mysql fra kommandolinja. Du installerer programmet slik: aptitude install phpmyadmin Du vil bli spurt om hvilken apache-versjon phpmyadmin skal tilpasses for. Velg «apache2». For å prøve ut programmet tar du en titt på URLen: http://localhost/phpmyadmin. Du bør få opp et bilde som ligner figur 8.1 på neste side. Passordet er det samme passordet som du valgte da du installerte MySQL. Når du har logget inn, kan du velge hvilken database du vil arbeide med. Databasene «information_schema» og «mysql» lar vi være, de trenger mysql selv for å virke. Velger vi «personaldb», får vi opp et vindu som ligner figur 8.2 på side 7. Her har vi mange muligheter. Vi kan legge til tabeller, og vi kan legge til eller fjerne felter i tabellen «ansatt». Hvis du synes bildet er rotete med mange muligheter, så husk at phpmyadmin ikke er beregnet på sluttbrukere. Dette programmet er for vedlikehold av databasen, og er beregnet på programmerere og driftspersonale. For å legge inn noen poster i databasen, bruker vi ikonet eksempel ser du i figur 8.3 på side 7 som vi finner under «action». Et Legg merke til at det ikke er nødvendig å fylle ut ansattnummeret. Vi opprettet feltet med «auto increment», så MySQL kan lage nye ansattnumre selv. Etter å ha lagt inn firmaet, kan vi prøve ut noen spørringer mot databasen også. Klikk på tabben merket SQL. Prøv f.eks. «select * from ansatt», da skal du få opp en liste over alle ansatte, med all informasjon. For å få bare navn og tittel, bruk «select navn,tittel from ansatt». For å se hvem som har ansatt nr.2 som sjef, bruk «select navn,tittel from ansatt where overordnet=2» For et mer komplisert eksempel, kan vi lage en liste over ansatte med navn på sjefene i stedet for ansattnumre. Dette krever litt kjennskap til sql, og viser at phpmyadmin er et utmerket testverktøy når man utvikler databaseapplikasjoner.
side 6 av 9 Figur 8.1: phpmyadmin Komplisert sql-eksempel select ansatt.navn, ansatt.tittel, sjef.navn from ansatt left join ansatt as sjef on ansatt.overordnet=sjef.ansattnr navn tittel navn Ola Korneliussen Adm.dir NULL Trine Franzen Teknisk sjef Ola Korneliussen Per Korneliussen Personalsjef Ola Korneliussen Hans Hansen Programmerer Trine Franzen Nina Olsen Webdesigner Trine Franzen Preben Nielsen Regnskapsfører Per Korneliussen Nina Olsen Vaktmester Per Korneliussen
Dynamiske sider med PHP og MySQL side 7 av 9 Figur 8.2: Personaldatabasen i phpmyadmin Figur 8.3: Legge inn ny post i phpmyadmin 8.2 Dynamiske sider med PHP og MySQL 8.2.1 Eksempelside Vi har allerede sett på en slik side nemlig phpmyadmin. Nå er ikke dette egentlig et kurs i å lage databasedrevne websider, men webtjeneren vår er ikke komplett uten en slik side. Denne siden forutsetter at personaldatabasen er lagt inn som beskrevet før i leksjonen, og at det er lagt inn noen personer. Siden «db-liste.php» er lagt ved oppgaveteksten. Legg den på /var/www/, deretter kan den åpnes med en webleser. SQL-passordet må du selvsagt bytte ut med ditt eget sql-passord.
side 8 av 9 Kort forklaring Siden er skrevet i html og php. Php-delen åpner en forbindelse til MySQL med kommandoen mysql_connect(). Deretter brukes mysql_select_db() for å velge vår database. Spørring mot databasen gjøres med mysql_query(), som kjører samme spørring som vist på side 6. Deretter stenges databaseforbindelsen med mysql_close(). Svaret på spørringen havner i variabelen $liste. Resten av programmet er en løkke som plukker ut én og én post med mysql_result(), og formatterer innholdet som rader i en html-tabell. Nederst på siden er det noen linker som gir ulike oppslag i databasen. Disse forutsetter at ansatte med numrene 1, 2 og 3 er sjefer for andre ansatte. 8.3 Oppsummering Vi har sett på databasen MySQL. Videre har vi koblet databasen til php, og brukt dette til å lage databasedrevne dynamiske websider.
Oppsummering side 9 av 9 Figur 8.4: sql i phpmyadmin