AMVA50,php ja mysql

 6.1 Yleistä sovelluksesta

6.2 Tietokantayhteyden avaaminen

6.3 Aloitussivu, kaikkien tietueiden hakeminen

6.4 Etsi-toiminnon toteutus

6.5 Ylläpitosivuston aloitussivu

6.6 Päivityssivut

6.7 Tietueen lisäyssivut

 

 

6. ESIMERKKISOVELLUS

 

6.1 Yleistä sovelluksesta

Tässä luvussa käydään läpi yksinkertainen esimerkkisovellus, jossa toteutetaan tietueiden lisäys, poisto, päivitys ja haku MySQL-tietokannan taulukosta. Esimerkkisovellusta voisi tehostaa ja parannella monella tavalla, mutta se on yritetty toteuttaa niin, että tietokannan käsittelytoiminnot tulevat esille mahdollisimman selkeästi.

Tutustu ennen esimerkkikoodeihin siirtymistä valmiiseen esimerkkisovellukseen tästä linkistä: Puhelinluettelo

Ylläpitosivujen käyttäjätunnus on testaaja ja salasana on testi.

Sovellusta varten on luodaan uusi hakemisto puhelin ja siihen alikansio yllapito. Tarkoituksena on, että käyttäjät pääsevät vain katselemaan tietoja ja ylläpito-sivut on suojattu salasanalla.

Sovelluksen hahmottamista voi auttaa tästä linkistä avautuva sivukartta.

Ennen sovelluksen koodaamista tulee olla luotuna tietokanta ja siihen taulu luettelo, jossa on kentät id, sukunimi, etunimi ja puh. Luodaan tietokanta.

Tietokannan taulu luodaan seuraavalla SQL-lauseella.

create table luettelo (
id integer auto_increment primary key,
sukunimi varchar(30),
etunimi varchar(30), puh varchar(15));

sivun alkuun

6.2 Tietokantayhteyden avaaminen

Luodaan hakemistoon puhelin tiedosto funktiot.php, jonka sisältö on seuraava:

<?php 
function AvaaTietokanta()
{
//Asetukset tietokantayhteyttä varten
$palvelin="localhost";
$tietokanta="oma sukunimi";
$user="oma tunnus";
$passwd="oma salasana";

$yhteysnro=mysql_connect($palvelin,$user,$passwd) or die("Tietokantaan ei saatu yhteyttä, " .mysql_error()); mysql_select_db($tietokanta); return $yhteysnro; } ?>

Selityksiä koodiin:

  • $palvelin on osoite, jossa tietokanta sijaitsee. Osoite voi olla IP-osoite. Tässä tapauksessa osoite on localhost, koska hyväksytään vain paikalliselta palvelimelta tulevat yhteyspyynnöt.
  • Tietokantayhteys luodaan funktiolla mysql_connect, jolle annetaan parametrina tietokannan osoite, käyttäjätunnus ja salasana.
  • mysql_connect()-funktio palauttaa yhteyden numeron, jota tarvitaan käsiteltäessä tietokantaa.
  • Tietokantayhteyttä ei tarvitse PHP:ssä sulkea, koska kaikki mysql_connect()-funktiolla avatut yhteydet suljetaan, kun sivulla oleva koodi on käsitelty ja tiedot on lähetetty selaimelle. Se on kuitenkin hyvä sulkea funktiolla mysql_close($yhteysnro).

sivun alkuun

6.3 Aloitussivu, kaikkien tietueiden hakeminen tietokannan taulusta

Luodaan hakemistoon puhelin tiedosto tiedot.php, johon haetaan tietokannasta kaikki tietueet

<?php require "funktiot.php"; ?>
<html> <head> <title>Yritys Oy-Yhteystiedot</title> </head> <body> <form method="get" action="etsi.php"> <input type="text" name="hakusana"> <input type="submit" name="etsi" value="Etsi sukunimi"> </form>
<a href="yllapito/kaikki.php">Ylläpito</a> <hr> <h3>Henkilöstö aakkosjärjestyksessä</h3> Sähköpostiosoitteet ovat muotoa <b>etunimi.sukunimi@yritys.fi</b><p> <!-- taulukko, johon tiedot tulostetaan, alkaa --> <table border="1">
<tr> <td>Sukunimi</td> <td>Etunimi</td> <td>Puh</td> </tr>
<?php $yhteys=AvaaTietokanta(); //liitetään funktiot-tiedosto mukaan

//haetaan kaikki tietueet luettelo-taulusta $sql_lause="select sukunimi,etunimi,puh FROM luettelo ORDER BY sukunimi, etunimi"; $tulos=mysql_query($sql_lause) or die("virhe ".mysql_error()); //tarkistetaan, ettei kysely epäonnistunut if (!$tulos) { echo "Kyselyssä tapahtui virhe"; exit; }
//luetaan muuttujataulukoon $rivi tulosjoukon tietue ja tulostetaan tietue kerrallaan html-taulukkoon while($rivi=mysql_fetch_row($tulos)) { echo "<tr>"; echo "<td>".$rivi[0]."</td><td>".$rivi[1]."</td><td> ".$rivi[2]."</td>"; echo "</tr>"; } echo "</table>";
mysql_close($yhteys); ?> </body>
</html>

Selityksiä koodiin:

  • Etsintälomakkeen lähettämät tiedot lähetetään skriptin etsi.php käsiteltäväksi.
  • <a href="yllapito/kaikki.php">Ylläpito</a> linkillä viitataan nykyisen hakemiston alihakemistoon kaikki, jonne tehdään myöhemmin ylläpitosivut.
  • if(!$tulos) tulos tutkii, epäonnistuiko kyselyn suorittaminen.
  • Funktio mysql_fetch_row($tulos)noutaa seuraavan tietueen tiedot tulosjoukosta.
  • Komennolla $rivi=mysql_fetch_row($tulos) sijoitetaan seuraavan tietueen tiedot muuttujataulukkoon $rivi. Tietueen ensimmäinen kenttä sijoitetaan taulukon indeksiin [0], toinen kenttä indeksiin [1], jne.
  • while-silmukalla luetaan aina seuraava tietue taulukkoon $rivi, kunnes tullaan tulosjoukon loppuun.
  • echo "<table border=\"1\">"; koodissa on \-merkki ennen lainausmerkkejä, jotta border-määreen lainausmerkit eivät sekoitu echo-komennon lainausmerkkeihin.

sivun alkuun

6.4 Etsi-toiminnon toteutus

Luodaan hakemistoon puhelin tiedosto etsi.php, joka hakee tietokannasta etsittävän sukunimen. Etsittävä sukunimi saadaan tiedoston tiedot.php lähettämästä lomakekentästä hakusana.

<html>
<head>
<title>yritys Oy-henkilökunta, Etsinnän tulos</title>
</head>
<body>
<?php 
require "funktiot.php";
$yhteys=AvaaTietokanta();
$hakusana=$_GET['hakusana'];
$sql_lause="SELECT sukunimi,etunimi,puh FROM luettelo WHERE sukunimi LIKE '%$hakusana%'";
$tulos=mysql_query($sql_lause)
   or die("virhe ".mysql_error());
if (!$tulos)
{  
   echo "Kyselyssä tapahtui virhe";
   exit;
}
echo "<table border=\"1\">";
echo "<tr>";
echo "<td bgcolor=\"silver\">Sukunimi";
echo "<td bgcolor=\"silver\">Etunimi";
echo "<td bgcolor=\"silver\" >Puh";
echo "</tr>";
while($rivi=mysql_fetch_row($tulos))
{
   echo "<tr>";
   echo "<td>" .$rivi[0] ."<td>".$rivi[1]. "<td>". $rivi[2];
   echo "</tr>";
}
echo "</table>";
?>
</body>
</html>

Selityksiä koodiin:

  • SQL-lauseen WHERE-osa on muotoa: "WHERE sukunimi LIKE '%$hakusana%'". Like ehdossa on hakusanan molemmilla puolilla %-katkaisumerkki, jolloin haku toimii myös merkkijonon osilla. Haku ei erottele isoja ja pieniä kirjaimia. Hakusanat "Ankka" ja "ankka" tuottavat saman tuloksen. Jos haku haluttaisiin tehdä täsmällisesti vain kirjoitetulla hakusanalla, olisi WHERE-osa muotoa: "WHERE sukunimi='$hakusana'"
  • Muutoin koodi on sama kuin tiedostossa tiedot.php, joten sitä ei ole kommentoitu enempää.

sivun alkuun

6.5 Ylläpitosivuston aloitussivu

Luodaan hakemistoon yllapito tiedosto kaikki.php, joka hakee tietokannasta kaikki tietueet. Id toimii muokattavan tietueen tunnisteena ja linkkinä muokkaussivulle.

<html>
<head>
<title>yritys Oy-henkilökunta,Ylläpito</title>
</head>
<body>
<h1>Yhteystietojen ylläpito</h1>
<a href="lisaaminen.php">Lisää uusi henkilö</a><p>
<b>Muokkaa tietoja valitsemalla Id.</b></p>

<?php
require "../funktiot.php";
$yhteys=AvaaTietokanta();
$sql_lause="select id,sukunimi,etunimi,puh FROM luettelo ORDER BY sukunimi, etunimi";
$tulos=mysql_query($sql_lause)
   or die("virhe ".mysql_error());
if (!$tulos)
{
   echo "Kyselyssä tapahtui virhe";
   exit;
}
echo "<table border=\"1\">";
echo "<tr>";
echo "<td bgcolor=\"silver\">Id";
echo "<td bgcolor=\"silver\">Sukunimi";
echo "<td bgcolor=\"silver\">Etunimi";
echo "<td bgcolor=\"silver\" >Puhelin";
echo "</tr>";
while($rivi=mysql_fetch_row($tulos))
{
   echo "<tr>";
   echo "<td><a href=\"muokkaus.php?id=$rivi[0]\">" .$rivi[0]
       ."</a><td>".$rivi[1]. "<td>". $rivi[2]. "<td>". $rivi[3];
   echo "</tr>";
}
echo "</table>";
?>
</body>
</html>

Selityksiä koodiin:

  • Koska tiedosto on nyt alemman tason kansiossa kuin tiedosto funktiot.php, pitää siihen viitata seuraavasti: require "../funktiot.php". kahdella pisteellä siirrytään Unix:sin hakemistorakenteessa yksi taso ylöspäin.
  • echo "<td><a href=\"muokkaus.php?id=$rivi[0]\">" .$rivi[0] ."</a> luo Id:stä linkin muokkaus.php tiedostoon. Samalla välitetään ?-merkin jälkeen parametrina muokattavan tietueen id-parametri. Parametrin arvo tulee tietokannasta, muuttujasta $rivi[0]. Muuttujan arvo välittyy get-menetelmällä URL:n jatkona.

sivun alkuun

6.6 Päivityssivut

Luodaan hakemistoon yllapito tiedosto muokkaus.php, joka näyttää lomakekentissä muokattavan tietueen tiedot. Lomakkeella voi päivittää tietoja tai poistaa tietueen. Muokattavan tietueen id-saadaan kaikki.php-sivulta linkin mukana URL:n jatkeena.

<?php
require "../funktiot.php";
$yhteys=AvaaTietokanta();

//haetaan kaikki tietueet luettelo-taulusta
$haku=$_GET['id']; //urlin mukana välitetty id:n arvo
$sql_lause="select sukunimi,etunimi,puh FROM luettelo WHERE id=$haku";
$tulos=mysql_query($sql_lause)
   or die("virhe ".mysql_error());
//luetaan muuttujataulukkoon
$rivi=mysql_fetch_row($tulos);
?>

<html>
<head>
<title>Tietojen päivitys</title>
</head>
<body>
<form method="get" action="muokattu.php">
<input type="hidden" name="id" value="<?php echo $haku ?>">
Sukunimi: <input type="text" name="sukunimi" value="<?php echo $rivi[0] ?>"><p>
Etunimi: <input type="text" name="etunimi" value="<?php echo $rivi[1] ?>"><p>
Puhelin: <input type="text" name="puh" value="<?php echo $rivi[2] ?>"><p>
<input type="submit" name="toiminto" value="Tallenna">
<input type="submit" name="toiminto" value="Poista">
</form>
</body>
</html>
</html>
Selityksiä koodiin:
  • SQL-lauseen WHERE-ehto on muotoa "WHERE id=$haku". Id tulee sivulle parametrinä ja sen avulla pystytään hakemaan muokattava tietue tietokannasta. Otsikkoriviltä huomataan, että muokkaus.php-sivulle on tultu kaikki.php-sivulta linkin kautta, joka on muotoa http://okol.osakk.fi/~tmustani/php/puhelin/yllapito/muokkaus.php?id=x, missä x on muokattavan linkin id.
  • Lomakkeella on piilokenttä <input type=hidden name="id" value="<?php echo $haku ?>">. Kenttää tarvitaan tietojen välittämiseen muokattu.php sivulle. Id välitetään piilokentän kautta, koska sitä ei voi päivittää. Kentän arvo tulee automaattisesi laskurin luomana, kun uusi tietue lisätään.
  • Molempien submit-kenttien name on toiminto. Value on eri ja sen perusteella voidaan välittää tiedostolle muokattu.php tieto siitä, kumpaa painiketta on painettu.

Lomakkeelle kirjoitetut muuttuneet tiedot lähetetään tietokantaan päivitettävksi skriptille muokattu.php. Luodaan hakemistoon yllapito tiedosto muokattu.php, joka päivittää tai poistaa tietueen.

<?php
require "../funktiot.php";
$yhteys=AvaaTietokanta();
if($_GET['toiminto']=="Tallenna")
{
   $sukunimi=$_GET['sukunimi'];
   $etunimi=$_GET['etunimi'];
   $puh=$_GET['puh'];
   $id=$_GET['id'];

   $sql_lause="update luettelo set sukunimi='$sukunimi',etunimi='$etunimi',puh='$puh'
      where id='$id'";
   if(!$tulos=mysql_query($sql_lause))
   {
       $teksti="Tietojen päivitys ei onnistunut";
       $virhe=mysql_error();
    }
   else
   {
       $teksti="Tiedot on päivitetty!";
   }
}
elseif($_GET['toiminto']=="Poista")
{
   $id=$_GET['id'];
   $sql_lause="delete from luettelo where id='$id'";
   if(!$tulos=mysql_query($sql_lause))
    {
       $teksti="Tietojen poiso ei onnistunut";
       $virhe= mysql_error();
    }
   else
   {
       $teksti="Tiedot on poistettu!";
   }
}
?>
<html>
<head>
<title>yritys Oy-henkilökunta,Ylläpito</title>
</head>
<body>
<?php
echo $teksti ."<br>";
echo $virhe."<p>";
?>
<a href="kaikki.php">Paluu ylläpidon pääsivulle</a>
</body>
</html>

Selityksiä koodiin:

  • if ($toiminto= ="Tallenna") ehto tutkii, onko muokkaus.php sivulla painettu Tallenna-painiketta. Elseif osassa tutkitaan, onko painettu Poista-painiketta.
  • Mikäli toiminto on Tallenna, niin suoritetaan UPDATE-lause ja tarkistetaan, että lauseen suoritus onnistui.
  • Mikäli toiminto on Poista, niin suoritetaan DELETE-lause.
  • Huomioi sisäkkäiset if-rakenteet!

sivun alkuun

6.7 Tietueen lisäyssivut

Luodaan hakemistoon yllapito tiedosto lisaaminen.php, jossa on lomake uuden tietueen lisäämistä varten.

<html>
<head>
<title>yritys Oy-henkilökunta,Uuden Henkilön lisääminen</title>
</head>
<body>
<b>Uuden henkilön lisääminen</b>
<form action="lisatty.php" method="get">
Sukunimi<br>
<input type="text" name="sukunimi"><br>
Etunimi<br>
<input type="text" name="etunimi"><br>
Puhelin<br>
<input type="text" name="puh" size="30"><p>
<input type="submit" name="tallenna" value="Tallenna">
<input type="reset" name="reset" value="Tyhjennä">
</form>
</body>
</html>

Luodaan hakemistoon yllapito tiedosto lisatty.php, joka lisää tietueen tietokantaan.

<html>
<head>
<title>yritys Oy-henkilökunta,Uusi henkilö lisätty</title>
</head>
<body>
<?php
require "../funktiot.php";
$yhteys=AvaaTietokanta();
$sukunimi=$_GET['sukunimi'];
$etunimi=$_GET['etunimi'];
$puh=$_GET['puh'];
$sql_lause="INSERT INTO luettelo (sukunimi,etunimi,puh)VALUES ('$sukunimi', '$etunimi','$puh')";
if(!$tulos=mysql_query($sql_lause))
{
   echo "Tallennus epäonnistui!";
}
else
{
   echo "<b>Uuden henkilön tiedot lisättiin tietokantaan:</b><br>";
   echo "$sukunimi $etunimi, $puh<p>";
}
?>
<a href="kaikki.php">Paluu ylläpidon pääsivulle.</a>
</body>
</html>

sivun alkuun