vida
 
 
 

 

PHP kurssi

Sisältö

Luento 1

Mikä on PHP?

Lyhyesti sanottuna:

  • PHP (Hypertext preprocessor) on palvelimella suoritettava skriptikieli, jolla saadaan www-sivustolle dynamiikkaa ja vuorovaikutteisuutta.
  • PHP on tulkattava kieli, eli WWW-sivun sisällä oleva PHP-koodi ajetaan joka kerta kun www-palvelin lähettää sivun selaimelle.
  • PHP ei siis kilpaile JavaScriptin kanssa!
  • PHP koodi sijoitetaan HTML:n sekaan, kuten Microsoftin ASP-kieli, ColdFusionin tekniikka ja Java Server Pages.
  • PHP kieli muistuttaa muita ohjelmointikieliä, kuten Perliä, C:tä ja Javaa.
  • PHP on erittäin tehokas kieli www-ympäristössä, sillä se on suunniteltu nimenomaan webbikäyttöön. PHP:ssa on myös paljon valmiita funktioita, joten aloittelijakin pääsee nopeasti vauhtiin.
  • PHP-sivujen tuottamiseen tarvitset palvelimen, joka tukee PHP:tä.
  • PHP -tiedostot erottaa useimmiten .php päätteestä
  • PHP erotetaan HTML koodista useimmiten merkkiparilla <?php ?>,<? ?>, mutta myös seuraavat merkinnät ovat mahdollisia asetuksistasi riippuen <SCRIPT LANGUAGE="php"></SCRIPT> tai <% %>
  • Kaikki teksti em. merkkien sisällä on suoritettavaa php-koodia.
  • Kommentit merkitään php:ssä joko // tai /* */ merkein.

Lisää historiaa ja tarkempaa tietoa kielen synnystä löydät osoitteesta php.net.

PHP:n hyödyt

  • Lisää dynaamisuutta sivuillesi, tarjoa vuorovaikutteisuutta
  • yhdistä tietokantoja ja niiden sisältöä sivuillesi
  • lähetä lomakkeita ja vastaa niihin
  • personoi www-sivusi osalle käyttäjistä

PHP työskentely-ympäristömme

  • Windows XP:n päälle asennettu php

Muuttujat (variables)

Muuttujat merkitään PHP:ssä $ merkillä, eli esimerkiksi $arvo tai $nimi.

Merkkijonomuuttujat

  • $nimi = "Malli Esimerkki";
  • $arvo = "n";

Integer muuttujat

  • $munnumero = 1;
  • $muntoka = -256;

Double muuttujat

  • $a = 123,123;
  • $b = -98,76e5;

Taulukkomuuttujat

Taulukko koostuu alkioista. Alla on esimerkki taulukosta, johon on koottu viikonpäivät. Huomaa, että taulukon indeksin numerointi alkaa 0:sta, ei 1:stä. Taulukkoon viitataan siis näin:

$taulukko[indeksi];

Taulukkoon syötetään arvoja seuraavasti;

$taulukko[0] = "Maanantai";
$taulukko[1] = "Tiistai";
$taulukko[2] = "Keskiviikko";
$taulukko[3] = "Torstai";
$taulukko[4] = "Perjantai";
$taulukko[5] = "Lauantai";
$taulukko[6] = "Sunnutai";

Constant muuttujat

Kun käytät usein jotain tiettyä muuttujaa, jonka arvo on aina sama, voit määritellä sen käyttöösi define käskyllä.

  • define("PERUSMOI", "Morjens");

Sitä käytettäisiin seuraavasti:

<?php
define("PERUSMOI", "Morjens");
echo(PERUSMOI);
?>

Muut muuttujat

PHP on helppo www-ohjelmointikieli, sillä PHP:n ulkopuolelta tulevaa dataa ei tarvitse erikseen "parsia" jos sitä haluaa käyttää. PHP kerää automaattisesti kaiken saatavilla olevan datan, esimerkiksi HTML-lomakkeista, URL:sta ja evästeistä. Esimerkkinä alla muuttujan "poiminta" lomakkeesta ja URL:sta GET ja HTML-lomakkeesta POST metodeilla.

GET

Kun surffailet Internetissä, törmäät usein sivustoihin, joiden osoite on muotoa:
www.jotakin.com?a=6&page=567

URL:in perässä on usein muuttujia. Oheisesta URL:sta saamme talteen muuttujat $a ja $page. Jos et ole aiemmin ohjelmoinut www-ympäristössä, kiinnitä huomiota edelliseen linkkiin. Huomaa, että ensimmäinen parametri erotetaan osoiteosasta ?-merkillä ja kaikki jälkimmäiset & -merkillä!

POST

<HTML>
<FORM ACTION='lomake.php' METHOD='POST'>
<INPUT TYPE='TEXT' NAME='nimi' VALUE='Mikko'>
< /FORM>
</HTML>

Saamme talteen muuttujan $nimi, jonka arvo on Mikko.

Kun register_globals ei ole päällä ja viittaamme muuttujiin, meidän tulee tietää, onko muuttujat lähetetty eteenpäin GET vai POST metodilla. Viittaamme niihin koodissa seuraavasti:

$nimi = $_GET['muuttujan_nimi'];
$nimi = $_POST['muuttujan_nimi'];

Jos register_globals on päällä, voimme viitata muuttujaan pelkällä muuttujan nimellä esimerkiksi $nimi.

PHP:n asetuksia ja muutoksia voidaan käsitellä php.ini tiedostossa. Sinne voidaan myös tehdä muutos, että meidän ei tarvitse käyttää $_GET tai $_POST -viittausta, vaan voimme suoraan käyttää muuttujan nimeä. Palaamme php.iniin myöhemmin kurssilla.

Ensimmäinen PHP -ohjelmani

<html>
<body>

<?php
$munmuuttuja="Hello World";
echo($munmuuttuja);
echo("Tähän voin kirjoittaa normaalia tekstiä,);
echo("mutta kun erotan tekstin php-kielestä, laitan väliin pisteen,")
echo("enkä & tai + merkkiä, kuten muissa kielissä " . $munmuuttuja):
?>


</body>
</html>

tulostaa näytölle:

Hello World! Tähän voin kirjoittaa normaalia tekstiä, mutta kun erotan tekstin php-kielestä, laitan väliin pisteen, enkä & tai + merkkiä, kuten muissa kielissä Hello World

Luento 2 - ehto- ja toistorakenteet

Operaattorit

+ yhteenlasku
- vähennyslasku
* kertominen
/ jakaminen
% jakojäännös
++ lisääminen muuttujan arvoa yhdellä
-- muuttujan arvon vähentäminen yhdellä

Huomio!
Kun liität merkkijonoja yhteen, yhdistämismerkkinä käytetään pistettä (.), eikä & tai + merkkejä, kuten monissa muissa kielissä.

PHP -koodia voidaan kirjoittaa HTML-koodin väliin. PHP:ssä, kuten muissakin ohjelmointikielissä, on ehto- ja toistolausekkeita.

Ehto-lause

IF

<?php
$arvo = true;
$toinenarvo==2;
if ($toinenarvo==2){
echo("toinen arvo oli 2");
}
?>

Tulostaa näytölle:

toinen arvo oli 2

IF-ELSEIF-ELSE

<html>
<body>
Tässä kuvia:<p>
<?php
$a = 1;
$b = 2;
$c =3;
if ($a==1){
? >
<img src="kuva.gif">
<?php
}elseif($b==2){
? >
<img src="kuva2.gif">
<?php
} else { ?>
<img src="kuva3.jpg">
<?php
}
?>
</body>
</html>

On myös lyhyempiä tapoja kirjoittaa if-lause esim.

if($a>$b)
echo('jee');
else
echo('ei jee');

on sama asia kuin

($a>$b) ? echo('jee') : echo('ei jee');

Huomaa myös, että jos kirjoitat if-lauseen jälkeen enemmän kuin yhden lauseen, tarvitse { -merkin, mutta jos selviät yhdellä rivillä, voit jättää { merkin pois, kuten yllä on tehty.

Toistolauseet

FOR

For -luupilla voidaan käydä läpi esimerkiksi taulukon arvoja. For luupille määritellään alue, jossa luuppi halutaan toteuttaa.

Esimerkki

Halutaan tulostaa näytölle luvun 1-10 järjestyksessä.

<?php
for($r=1;$r<11;$r++){
echo($r);
}
?>

Halutaan tulostaa numerot allekkain

<?php
for($r=1;$r<11;$r++){
echo($r . "<br>");
}
?>

Tulostetaan viikonpäivät taulukon sisältö, jokainen alkio kerrallaan.

<?php
for($r=1;$r<11;$r++){
echo($taulukko[$r]);
}
?>

tulostaa näytölle:

MaanantaiTiistaiKeskiviikkoTorstaiPerjantaiLauantaiSunnuntai

WHILE

While -luuppi toimii kuten for, mutta sinä arvo asetetaan seuraavasti.

<?php
$laskuri = 1;
While ($laskuri < 20){
echo("lasken kahteenkymppiin " . $laskuri);
$laskuri++;
? >

DO WHILE

Toistaa, kunnes tietty määrite toteutuu.

<?php
$a=1;
do{
echo('tulostelen kunnes olen 20);
$a++;
}
while($a==20);
?>

Tuntiharjoitukset

  1. Kirjoita PHP:llä oma nimesi HTML:n <TITLE> tagien väliin.
  2. Muuta edellistä tehtävää siten, että kysyt $_GET muuttujan $nimi sisältöä, ja tulostat sen <TITLE> tagien väliin.
  3. Kirjoita PHP:llä seuraava ohjelma: a=1,b=2, jos a on 1, tulosta näyttöruudulle vihreällä Oikein, muuten tulosta punaisella Väärin. Vihreän ja punaisen värin saat seuraavasti HTML:llä: <FONT COLOR="green">vihreää</FONT>
  4. Tee taulu, johon keräät kuukausien nimet. Tulosta taulukon 8. alkio näytölle.
  5. Tee ohjelma, joka tulostaa arvot 1-7. Toteuta While -luupilla.
  6. Toteuta edellinen tehtävä for -luupilla.
  7. Tee ohjelma, joka tulostaa näytölle luvut 30-1 allekkain siten että 30 on ylin ja 1 alin, eli 30,29,28,27.....1.
  8. Määrittele vakiomuuttuja TERVE, jonka sisältö on "Hyvää huomenta!". Tulosta se näytölle.

Luento 3 - Merkkijonofunktiot

HTML -kertaus

Kertaa HTML -perusteet tai laajenna tietovarastoasi. Netistä löytyy lukuisia hyviä ohjeita HTML:ään. Tässä muutama:

Merkkijonofunktiot

PHP sisältää paljon valmiiksi määriteltyjä komentoja. joiden avulla merkkijonojen käsittely on helppoa. Alle on koottu muutama hyödyllinen merkkijonofuntio.

strlen

Laskee merkkijonon pituuden.

Esimerkiksi:

$nimi ="Pekka Pekkanen";
$pituus = strlen($nimi);
echo("Merkkijonon pituus oli:" . $pituus);

strtolower

Kääntää merkkijonon kirjaimet pieniksi.

Esimerkiksi:

$merkkijono = "AURINKO PAISTAA";
echo strtolower($merkkijono);

tulostaa näytölle:
aurinko paistaa

strrev

Kääntää merkkijonon kirjaimet käänteisiksi.

Esimerkiksi:

<?php
echo strrev("Huomenta");
echo strrev("saippuakauppias");
?>

Tulostaa näytölle:

atnemouH
saippuakauppias

strtoupper

Tekee saman kuin yllä oleva funtio, mutta isoilla kirjaimilla.

trim

Poistaa välilyönnit sekä muut pakotuskoodit, kuten rivinvaihdon n.

Esimerkiksi:

$muuttuja = "       juttu      ";
$uusimuuttuja = trim($muuttuja);
echo $uusimuuttuja;

Tulostaa näytölle:
juttu

Ilman välilyöntejä edessä ja takana.

ucfirst

Muuttaa merkkijonon ensimmäisen kirjaimen isoksi.

substr

Palauttaa osan merkkijonosta.

Esimerkiksi:

$sana ="kukkakaali";
echo substr($sana,5);

Tulostaa näytölle:
kaali

str_replace

Korvaa merkkijonossa määritellyn osan toisella.

Esimerkiksi:

$lause ="Aurinko paistaa ja vettä sataa";
$uusilause = str_replace("vettä","lunta",$lause);

Tulostaa näytölle:

Aurinko paistaa ja lunta sataa.

Tuntiharjoituksia

  • Kopioi seuraava koodi, tallenna se nimellä teht2_1.php ja siirrä kotihakemistoosi ja tutki php-ohjelman toimintaa.
    <?php
    $merkkijono = "Mikko Virtanen";
    $pituus = strlen($merkkijono);
    echo "Nimessä on " . $pituus . " kirjainta.";
    ?>
  • Tee php-ohjelma, jossa sijoitat muuttujaan $nimi, oman nimesi. Tee muuttuja $uusinimi, johon sijoitat oman nimesi kirjoitettuna pienillä kirjaimilla. Käytä funtiota strtolower. Tulosta näytölle uusinimi -muuttujan sisältö.
  • Tee php-ohjelma, jossa on merkkijonomuuttuja $aarresaari. Tulosta substr -funtiolla merkkijonomuuttujasta osa "saari" näytölle.
  • Tee php-ohjelma, jossa on muuttuja $teksti = "Matti Meikäläinen". Korvaa ä-kirjaimet a-kirjaimilla. Käytä str_replace funtiota. Tulosta näytölle uusi lopputulos.
  • Tee php-ohjelma, joka tulostaa näytölle nimesi lopusta alkuun, eli väärinpäin.

Luento 4 - Päivämääräfunktiot

date

date -funktion avulla saamme tulostettua päivämäärän lukuisilla eri tavoilla näytölle. Funktio palauttaa merkkijonon.

Esimerkiksi

<?php
// tulostaa esim. tänään 27.10.2004
echo(date("d.m.Y"));
?>

date -funktiota käytetään siten, että sulkujen sisäpuolelle kirjoitetaan tarvittava kirjain, joka osoittaa tietynmuotoista päivämäärää. Alla on esitetty osa koodeista. Täydellinen koodilista löytyy php:n omilta sivuilta.
Koodi Kuvaus
a am tai pm
A AM tai PM
d kuukauden päivä, nolla edessä jos tarvitaan
D viikonpäivä 3 kirjaimisena lyhenteenä
F Kuukauden nimi
h tunnit 01 -12
H tunnit 00 -23
g tunti 1 12
G tunti 0 - 23
i minuutit
j kuukauden päivä, nollat edessä jos tarvetta
l viikonpäivä
m kuukauden numero 01-12
M Kuukauden nimi (Jan, Feb)
n kuukauden numero 1 -12, ei nollaa edessä
s sekunnit
t päivien määrä ko kuussa
y vuosi kahdella numerolla merkittynä
Y vuosi neljällä numerolla merkittynä
z vuoden päivä 0 -365
t Kuukauden päivien lkm

checkdate

checkdate funktiolla voimme tarkistaa, onko jokin arvo päivämäärä vai ei.

Esimerkiksi

<?php
if(checkdate(2,18,1970)){ //huomaa, jos ehto on totta, palautuu true jota voit merkitä pelkästään näin if(asiaontotta){, kun taas if(!(asiaeioletotta) ){
echo "Sehän on ihan oikea päivämäärä";
}else{
echo "Eipä ole päivämäärä";
}
?>

Huomioi, että päivämäärä annetaan amerikkalaisten käyttämässä päivämäärä muodossa!

Ehto- ja toistolauseiden (kertaus)

Kertaa ehto- ja toistolauseet luennoista 1 ja 2, jos et vielä osaa niitä. Nyt on korkea aika opetella!

Tuntiharjoituksia

Nyt kerrataan edellisten tuntien asioita, iffiä ja foria, string-funktioita ja yhdistetään ne päivämääriin.

  1. Tee php-ohjelma, jossa tulostat tämän päivän päivämäärän muodossa 27.10.2004.
  2. Lisää edelliseen tehtävään perään myös tunnit, minuutit ja sekunnit. Erota tunnit, minuutit ja sekunnit toisistaan : -merkillä. Lopullinen tulos esim. 26.10.2004 13:10:05.
  3. Tee php-ohjelma, jossa tulostat nykyisen kuukauden näytölle englanniksi ja isoilla kirjaimilla.
  4. Tee ohjelma, joka tulostaa ruudulle, monesko vuoden päivä nyt on esim. Tänään 27.10.2004 on vuoden xxx. päivä.
  5. Tee ohjelma, joka tarkistaa,onko syntymäpäiväsi validi päivämäärä, käytä checkdate-funktiota.
  6. Tee php-ohjelma, joka tulostaa ruudulle päivämäärän seuraavassa muodossa: Oct 26 Wed.
  7. Tee php-ohjelma, joka tulostaa näytölle ajankohdan sen mukaan, mitä kello on. Jos kello (date(G)) on
    04-10 tulosta nyt on aamu
    10-16 tulosta nyt on päivä
    16-21 tulosta nyt on ilta
    21-04 tulosta nyt on yö
    Käytä if-else-if -rakennetta tai switch case rakennetta.
  8. Tee php-ohjelma, joka tulostaa näytölle päiväyksen seuraavasti
    27. lokakuuta 2004 Kello 15:00:00
    (tai mitä hyvänsä kello onkin siihen aikaan kun tehtävää teet). Jotta saat kuukaudet suomenkielisiksi, käytä switch case -lausetta ja käännä esim. February vastaamaan helmikuuta.
  9. Tee php-ohjelma, joka tulostaa suomeksi ko. päivän viikonpäivän ruduulle takaperin, eli esim. okkiiviksek.
  10. Tee php-ohjelma, joka tulostaa ruudulle ko. viikonpäivän nimen ja tämän jälkeen viikonpäivän pituuden, eli esim. maanantai, pituus 9 merkkiä.
  11. Tee php-ohjelma, joka tulostaa ruudulle parillinen päivä, mikäli päivä on parillinen, eli esim. 20 26 28 jne. muuten tulosta ruudulle pariton päivä.
  12. Tee php -ohjelma, jossa tulostat lokakuun päivät siten, että joka toinen päivä (päivänumero) on punaisella värillä ja joka toinen mustalla. Punaisen värin saat näin: <FONT COLOR="red">tähän teksti, joka halutaan punaiseksi</FONT>.
  13. HTML:n taitajille BONUS:
    Tee HTML-taulu, jossa joka toinen rivi on taustaväriltään sininen ja joka toinen valkoinen. HUOM. Tarvitset tehtävässä FOR-lausetta ja sen sisällä if-lausetta, selvitä myös, kuinka jakojäännös lasketaan php:llä. Tarvitset tätä tehtävässä.

Luento 5 - lomakkeet ja toiminnallisuus

HTML -lomake

www-sivuilla on lomakkeita, joilla kerätään usein esimerkiksi palautetta ja ilmoituksia. Lomake tehdään HTML-kielellä. Lomake aloitetaan HTML tagilla <FORM> ja lopetetaan </FORM> tagilla. Lomakkeessa voi kysyä käyttäjältä erillaista tietoa erillaisessa muodossa. Yllä olevassa esimerkissä on kysytty nimi tekstitietona, tästä syystä input kentän nimi on text (type="text"). Tietoa voi kysyä myös alasvetovalikossa tai vaikkapa radiobuttoneilla. Ikää on lomakkeessa kysytty radio button arvoilla. Kun kaikkien radiobuttoneiden nimi on ika, käyttäjä voi klikata vain yhtä radiobuttonia kerrallaan. Kun hän klikkaa seuraavaa, edellinen valinta poistuu. Mikäli arvoilla olisi eri nimet, esimerkiksi ika1,ika2,ika3 ja ika4 kaikki iät voisi valita samaan aikaan. Kun käyttäjä haluaa antaa pitkän palautteen, on varattava riittävästi kirjoitustilaa. Tästä syystä on kehitetty textarea tyyppi. Käyttäjä voi syöttää siihen vapaata tekstiä mielin määrin, ellei ohjelmoija itse rajoita kokoa.

Mutta lomakkeita on tylsä tehdä, jollei tietoa saada talteen mihinkään. Viime tunnilla opimme tallentamaan tietoa tiedostoihin. Tänään opimme lähettämään tietoa sähköpostissa.

mail funktio

Mail -funktion avulla voimme postittaa tietoa sähköpostiin. Alla on esimerkki mail -funktion toiminnasta. Tutustu tarkemmin funktion toimintaan osoitteessa http://fi2.php.net/function.mail.

<?php
$to = "ollo.omena@keuda.fi"; // mihin lähetetään
$headers = "MIME-Version: 1.0\r\n"; // headeritietoa
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n"; // mitä kirjainmerkistöä käytetään
$headers .= "From: joku@jokudomain.com"; // keneltä lähetetään
$otsikko = "Tässä on sinulle viesti"; // mailin otsikko
$viesti = "Heipparallaa " . $viesti . "\n" . $nimi . "\n" . $puhelin . "\n" . $sahkoposti . "\n" . $juttu . "\n"; // muuttujien sisältöä lomakkeesta
mail ($to, $otsikko, $viesti, $headers);
header("Location:http://www.minundomain.com/kiitos.php"); // jos haluttaisiin ohjata käyttäjä toiselle sivulle tämän jälkeen
?>

Tuntiharjoituksia

  1. Suunnittele ja toteuta HTML -lomake, jossa käyttäjältä kysytään seuraavia tietoja: Nimi, ikä, sukupuoli, sähköpostiosoite ja haluaako käyttäjä liittyä postituslistalle vai ei. Millaiset HTML -input kentät sopisivat parhaiten lomakkeeseesi eli miten käyttäjä tekisi vähiten virheitä? Tallenna lomakkeesi.
  2. Tee html -lomake, jossa on tekstikenttä, johon on tarkoitus syöttää nimi ja tekstialue, johon käyttäjä voi kirjoittaa terveiset. Laita lomake ohjautumaan sivulle kirjoita.php.
  3. Tee kirjoita.php, jossa kirjoitat lomakkeen sisällön vieraskirja.txt tiedostoon. Huom! Muistathan antaa tiedostollesi riittävästi oikeuksia.
  4. Tee tiedosto luekirjaa.php, jossa tulostat vieraskirjan sisällön ruudulle. Älä käytä include -funktiota lukemiseen!
  5. Tee lomake, jossa kysyt käyttäjän sähköpostiosoitetta sekä millaisen uutiskirjeen käyttäjä haluaa sähköpostiinsa, vaihtoehtoja on 3 a) uutiset b) uutiset ja sää tai c) urheilu.
  6. Lähetä edellisen tehtävän lomakkeen sisältö omaan sähköpostiosoitteeseesi.
  7. Bonus! Lisää vieraskirjatehtävääsi myös päivämäärä, jotta tiedät, milloin vieraasi on käynyt sivuillasi. Kirjoita ko. päivämäärä vaikka kävijän nimen jälkeen.

Luento 6 - tiedostojen käsittely

Tiedoston käsittely php:llä

Php:llä voi kirjoittaa ja lukea tietoa tiedostoihin/tiedostoista. Esimerkiksi www-lomakkeelta tulevat tiedot voidaaan tallentaa tekstitiedostoon. Näin on esimerkiksi toteutettu useita vieraskirjoja netissä.

Tiedoston avaaminen

Jos tiedostoon halutaan kirjoittaa, tiedosto täytyy ensin avata fopen-funktiolla. Funktio palauttaa tiedostotunnisteen, ikäänkuin ovenkahvan tiedoston oveen, jota käytetään myöhemmin avattuun tiedostoon liittyvien toimenpiteiden yhteydessä. fopen -funktioon liittyy muutamia parametrejä, joiden avulla kerrotaan, avataanko tiedosto, lukemista/kirjoittamista vai kumpaakin tehtävää varten. Katso tarkka määrittely parametreistä php.netin sivuilta.

'r' Open for reading only; place the file pointer at the beginning of the file.
'r+' Open for reading and writing; place the file pointer at the beginning of the file.
'w' Open for writing only; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it.
'w+' Open for reading and writing; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it.
'a' Open for writing only; place the file pointer at the end of the file. If the file does not exist, attempt to create it.
'a+' Open for reading and writing; place the file pointer at the end of the file. If the file does not exist, attempt to create it.
'x' Create and open for writing only; place the file pointer at the beginning of the file. If the file already exists, the fopen() call will fail by returning FALSE and generating an error of level E_WARNING. If the file does not exist, attempt to create it. This is equivalent to specifying O_EXCL|O_CREAT flags for the underlying open(2) system call. This option is supported in PHP 4.3.2 and later, and only works for local files.
'x+' Create and open for reading and writing; place the file pointer at the beginning of the file. If the file already exists, the fopen() call will fail by returning FALSE and generating an error of level E_WARNING. If the file does not exist, attempt to create it. This is equivalent to specifying O_EXCL|O_CREAT flags for the underlying open(2) system call. This option is supported in PHP 4.3.2 and later, and only works for local files.

Esimerkki avaamisesta:

$kahva= fopen("/home/kalle/file.txt", "r");
// yllä avataan lukemista varten
$kahva = fopen("/home/kalle/file.txt", "w");
// avataan tiedosto kirjoittamista varten
$kahva = fopen("/home/antti/homma.txt", "a");
// avataan päivittämistä varten - kirjoitetaan edellisen sisällön perään

Tiedoston sulkeminen

fclose sulkee avatun tiedoston (jälleen sen oven kahvan).

fclose($kahva);

Tiedostosta lukeminen

Jos tiedostosta halutaan lukea, se avataan tilaan "r" (read). Funktio fgets lukee seuraavan rivin tiedostosta. Funktion toinen parametri on rivin maksimipituus. Jos tiedoston rivien määrää ei tiedetä, kannattaa tarkistaa funktiolla feof ennen jokaista lukukertaa, että rivejä on vielä jäljellä.

Alla on esimerkki, kuinka tiedoston rivit luetaan yksitellen ja tulostetaan näytölle.

lt;?php
$tiedosto=fopen("vieraskirja.txt","r");
while (!feof($tiedosto)){
$rivi = fgets($tiedosto,4096);
echo($rivi);
}
fclose($tiedosto);
?>

Tiedostoon kirjoittaminen

Jos tiedostoon halutaan kirjoittaa, se avataan tilaan "w" (write). Tämän jälkeen tiedostoon voi kirjoittaa funktiolla fwrite.

<?php
$filename = 'munhomma.txt';
$jotain = "Kirjoita minut tiedostoon";

$ovi = fopen($filename, 'w'); // vaihda "a" - jos päivität
if(!($ovi)){
 echo "En saa avattua tiedostoa ($filename)";
 exit;
}

$onnistuiko = fwrite($ovi, $jotain);
if($onnistuiko){
 echo("kirjoitus tiedostoon onnistui");
}
   
fclose($ovi);
?>
Tiedoston tiedot

PHP sisältää valmiita funktioita, joiden avulla on helppo saada tarkempia tietoja tiedostosta. Nämä funktiot ovat käytössä ainoastaan oman palvelimen tiedostoilla.

  • file_exists kertoo, onko tiedostoa olemassa.
  • filesize palauttaa tiedoston koon tavuina.
  • fileatime palauttaa ajan, jolloin tiedostoa on viimeksi käytetty.
  • filemtime palauttaa ajan, jolloin tiedostoa on viimeksi muokattu.

Katso toimintaa tarkemmin php.netin sivuilta.

Hakemiston tiedostojen läpikäyminen

Hakemiston tiedostojen läpikäyminen onnistuu siten, että ensin avataan hakemisto, sitten luetaan hakemistoa ja hakemisto suljetaan. Aluksi kutsutaan opendir -funktiota, jolle kerrotaan, mikä hakemisto avataan. "." viittaa aina kyseiseen hakemistoon, eli hakemistoon, jossa php -tiedosto itse sijaitsee. readdir-funktio palauttaa aina seuraavan tiedoston hakemistossa.

<?php
//avataan hakemisto
$hakemisto = opendir(".");
//luetaan tiedoston nimiä niin kauan kunnes tiedostot loppuvat
while ($nimi  = readdir($hakemisto)){
//tulostetaan tiedoston nimi ja rivinväli
echo "$nimi<br>";
}
//suljetaan hakemisto
closedir($hakemisto);
?>

Hakemistosta luetaan sekä tiedostot että alihakemistot. Jos haluat tulostaa esimerkiksi pelkät tiedostot, voit testata, onko hakemistolistauksesta tuleva tieto hakemisto vai tiedosto, tähän löytyvät funktiot: is_file ilmoittaa (onko tiedosto) ja is_dir (onko hakemisto). Molemmat palauttavat true:n mikäli ehto on totta eli komento:

<?php

...
if(is_file("munjuttu.txt") {
echo("kyseessä oli tiedosto");
}else{
echo("ei ollut tiedosto") ;
}
...
?>

Tuntiharjoitukset

  1. Tee lomake, jossa on tiedoston lataus kenttä. Tallenna nimellä lataa.php.
  2. Tee php-tiedosto, jolla lataat esimerkiksi tekstitiedoston palvelimelle, omaan kotihakemistoosi (http://harjoitusymparisto/~opiskelija51/...)
  3. Lisää edelliseen tehtävään myös tiedot tiedostosta, eli tulosta ruudulle tiedoston nimi, koko ja tyyppi.
  4. Lisää edelliseen tehtävään vielä koodia, joka tulostaa ruudulle lauseen "Tiedostosi omakuva.JPG ladattiin palvelimelle 12.11.2004 kello 10:36"

Bonus (Tehtäviä guruille ja harrastelijoille)

  1. Lisää edelliseen lataustehtävään tarkistus, että hakemistoosi saa ladata vain txt- ja gif- päätteisiä tiedostoja. Vinkki funktio strstr!
  2. Tee php-tiedosto, joka listaa kotihakemistosi tiedostojen nimet ruudulle allekkain. Vinkki funktiot opendir ja readdir!

Luento 7 - File uploads

Tiedoston lataaminen palvelimelle on php:n tapa vastaanottaa lomakkeen tietoja. File uploadit -(tiedoston lataamistoiminnot suomeksi vapaasti käännettynä ;) ) ovat toimineet Netscape 2 :sta lähtien.

Alla on esimerkki lomakkeesta, jolla tiedosto voidaan ladata:

1 <form enctype="multipart/form-data" action="tallenna.php" method="POST">
2 <input type="hidden" name="MAX_FILE_SIZE" value="30000">
3 Etsi tiedosto: <input name="muntiedosto" type="file">
4 <input type="submit" value="Lataa tiedosto">
5 </form>

  • Rivillä 1 määritellään form -käskyllä lomake.Lomakkeeseen pitää kuitenkin lisätä määre enctype="multipart/form-data", jotta tiedoston lataus on mahdollista.
  • Rivillä 2 tiedoston kokoa säädellään piilotetulla kentällä MAX_FILE_SIZE. php.ini -tiedostossa määritellään kuitenkin maksimikoko, minkä uploadin kautta voi siirtää. Käyttäjä voi siis määrätä maksimikokoa lomakkeessa php.inissä määriteltyjen rajojen sisällä. Kovin kannattavaahan ei ole siirtää suuria tiedostoja, varsinkaan hitailla internetyhteyksillä.
  • Rivillä 3 on HTML lomakkeen tiedoston lataus kenttä, nimeltään file.
  • Rivillä 4 on normaali lomakkeen lähetys nappi ja
  • rivillä 5 lopetetaan lomakkeen määrittely </form> tagiin.

PHP tallentaa ladattavan tiedoston tietoja globaaliin muuttujaan. Globaali muuttuja on kaikkialla ohjelmassa näkyvä. Aiemmin tällä kursilla olet luonut itse muuttujia, kuten esimerkiksi $nimi ="Maija". Globaali muuttuja $_FILES tai $HTTP_POST_FILES (alle 4.1.0 versioissa eli meidän tapauksessamme) sisältää ladatun tiedoston tietoja. Alla on lueteltu ominaisuudet, joita tiedoston latauksessa otetaan talteen. Huomaa, että muuttujan nimi on oltava sama lomakkeessa olevan kentän nimi (koodiesimerkin rivi 4). Nimi voi kuitenkin olla mitä hyvänsä.

$_FILES['userfile']['name']
Alkuperäinen tiedoston nimi koneella, jolta tiedostoa ollaan lataamassa

$_FILES['userfile']['type']
Tiedoston MIME tyyppi, mikäli selain tukee tätä tietoa. Esimerkiksi "image/gif" MIME tyyppi kertoisi meille, että kyseessä on gif-muotoon tallennettu kuva.

$_FILES['userfile']['size']
Tiedoston koko tavuina.

$_FILES['userfile']['tmp_name']
Tiedoston väliaikainen nimi palvelimella, jonne tiedostoa ollaan lataamassa.

funktio - move_uploaded_file()

bool move_uploaded_file ( string filename, string destination)

Tämä funktio tarkistaa, että tiedoston nimi on validi, eli että tämännimistä tiedostoa ei ole ennestään palvelimella tai että nimeäminen on muuten toteutettu oikein. Jos tiedoston nimi on validi, tiedosto siirretään annettuun kohteeseen, jos tiedoston nimi ei ole validi, funktio palauttaa FALSE:n, eikä siirrä tiedostoa.

Funktio toimii siis esimerkiksi näin:

...
$lataushakemisto = '/home/opiskelija31/public_html/'; // tähän määrittelen polun, jonne tiedosto ladataan, eli oma hakemistosi palvelimella
$kokopolku = $lataushakemisto . $HTTP_POST_FILES['tiedostoni']['name']; // tässä yhdistän em. polun ja tiedoston nimen
if (move_uploaded_file($HTTP_POST_FILES["tiedostoni"]["tmp_name"], $kokopolku)) { // tässä siirrän tmp hakemistosta tiedoston omaan hakemistooni
echo "Tiedoston lataus onnistui.\n"; // tässä onnistui
} else {
echo "Tiedoston lataus epäonnistui!\n"; // tässä ei ja anna ilmoituksen
}
...

Lisää

Esimerkki

Lomake, jolla lataan tiedoston omaan kotihakemistooni

<form name="form1" enctype="multipart/form-data" method="post" action="lataa.php">
<input name="tiedosto" type="file" id="tiedosto">
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
<input type="submit" name="Submit" value="Lataa">
</form>

php-tiedosto, jolla lataus suoritetaan omaan kotihakemistoon

...
<body>
<?php
$uploaddir = '/home/opiskelija52/public_html/';
$uploadfile = $uploaddir . $HTTP_POST_FILES['muntiedosto']['name'];
if (move_uploaded_file($HTTP_POST_FILES["muntiedosto"]["tmp_name"], $uploadfile)) {
echo "Tiedosto ladattiin.\n";
} else {
echo "Tiedoston lataus ei onnistunut!\n";
}
?><p>
Tietoja tiedostostasi:
tiedoston nimi:<?php echo($uploadfile); ?><br>
koko on <?php echo($HTTP_POST_FILES["tiedosto"]["size"]); ?><br>
ja tyyppi <?php echo($HTTP_POST_FILES["tiedosto"]["type"]); ?>
</body>
...

Tuntiharjoitukset

  1. Tee lomake, jossa on tiedoston lataus kenttä. Tallenna nimellä lataa.php.
  2. Tee php-tiedosto, jolla lataat esimerkiksi tekstitiedoston palvelimelle, omaan kotihakemistoosi (http://harjoitusymparisto/~opiskelija51/...)
  3. Lisää edelliseen tehtävään myös tiedot tiedostosta, eli tulosta ruudulle tiedoston nimi, koko ja tyyppi.
  4. Lisää edelliseen tehtävään vielä koodia, joka tulostaa ruudulle lauseen "Tiedostosi omakuva.JPG ladattiin palvelimelle 12.11.2004 kello 10:36"

Bonus (Tehtäviä guruille ja harrastelijoille)

  1. Lisää edelliseen lataustehtävään tarkistus, että hakemistoosi saa ladata vain txt- ja gif- päätteisiä tiedostoja. Vinkki funktio strstr!
  2. Tee php-tiedosto, joka listaa kotihakemistosi tiedostojen nimet ruudulle allekkain. Vinkki funktiot opendir ja readdir!

Luento 8 - matemaattisia funktioita

Matemaattisia funktioita

ceil - pyöristäminen ylöspäin

<?php
print(ceil(13.2));
// tulostaa 14
?>

floor - pyöristäminen alaspäin

<?php
print(floor(13.2));
// tulostaa 13
?>

pow -potenssi

<?php
print(pow(2,5));
// tulostaa 32
?>

round - pyöristys lähimpään kokonaislukuun

<?php
print(round(1.4));
// tulostaa 1
?>

<?php
print(round(1.8));
// tulostaa 2
?>

sqrt - neliöjuuri

<?php
print(sqrt(81.0));
// tulostaa 9
?>

rand - arvo luku

Arpoo luvun 1 ja 100 välillä.

<?php
print(rand(1,100));
?>

Luento 9 - tekstinkäsittelyfunktioita

Tekstinkäsittely funktioita

string substr ( string string, int start [, int length])

substr() palauttaa tietyn kohdan merkkijonosta. Huom. numerointi alkaa nollasta.

<?php
$juttu="kukkakaali";
print(substr($juttu,0,4));
// tulostaa kukka
?>

string strstr ( string heinasuopa, string neula)

Palauttaa osan heinäsuopa stringistä ensimmäisestä neulan esiintymästä viimeiseen heinäsuopa stringin merkkiin asti.
Jos neulaa ei löydy, heinäsuovan sisältä, funktio palauttaa FALSE:n.

<?php
$email = 'user@example.com';
$domain = strstr($email, '@');
echo $domain; // prints @example.com
?>

Vielä tiedosto ja hakemistofunktioita...

Alla on esimerkki siitä, kuinka hakemiston sisältö tulostetaan ruudulle.

<?php
$dir = "/home/oppilas55/";

// Avaa hakemisto
if (is_dir($dir)) {
if ($dh = opendir($dir)) { // jos hakemisto /home/oppilas55/ on todella hakemisto
while (($file = readdir($dh)) !== false) { // käy läpi, kunnes loppuu
echo "filename: " . $file . "\n"; // tulosta tiedoston nimi
}
closedir($dh); // sulje hakemisto
} // iffin loppu
} // iffin loppu
?>

Tuntitehtäviä

  1. Tutki php.ini tiedostoa ja vastaa kysymyksiin:
    a) Mikä on palvelimen (harjoitusymparistossäsi) maksimikoko tiedoston lataamisessa?
    b) Mihin hakemistoon tiedostot ladataan väliaikaisesti (file uploads)
    c) Onko asp tagit <% %> käytössä?
  2. tee php-tiedosto, jossa lasket seuraavaa: pyöristä luku 45.67 ylöspäin, alaspäin, lähimpään kokonaislukuun.
  3. Laske luvun 64 neliöjuuri.
  4. Laske 5 potenssiin 7.
  5. Arvo luku välillä 1 ja 50.
  6. Tee php tiedosto, jossa arvot, mille sivulle käyttäjä ohjataa: a) www.keuda.fi, b) www.helsinki.fi tai c) www.kerava.fi.
  7. Tee php-tiedosto, jossa arvot, mikä kuva käyttälle näytetään sivulla. Voit nimetä kuvasi esimerkiksi 1.jpg, 2.jpg jne. Muista ladat kuvat kotihakemistoosi (http://harjoitusymparisto/~oppilasxx)
  8. Tee php-tiedosto, jossa arvot tervehdyksen käyttäjälle. Vaihtoehtoina esim. Moi,Hei,Heippa,Morjens,Terve jne.
  9. Tee php-tiedosto, jossa listaat kotihakemistosi sisältämät tiedostot näytölle.
  10. Tee php-tiedosto, jossa listaat kotihakemistosi tiedostot näytölle, vain jos ne ovat kuvia tai tekstitiedostoja, eli .gif, .jpg tai .txt. Vinkki strstr funktio!
  11. Lisää tehtävään 9 tiedoston nimestä linkki kyseiseen tiedostoon. Eli jos listassa lukee esim, vieraskirja.txt, sitä painamalla näkee tiedoston sisällön.
  12. Tee laskuri.php, joka laskee sivusi kävijöitä. Laskuri toteutetaan siten, että joka kerta, kun sivusi ladataan jokin arvo kasvaa. Voit tallentaa esim. luvun 0 tiedostoon ja kasvattaa sitä aina kun joku kirjoittaa selaimeesi laskuri.php.
  13. Etsi netistä seuraavat funktiot: mysql_connect, mysql_select_db ja tee itsellesi valmiiksi tiedosto kanta.php, jossa otat yhteyden tietokantaan. SQL-lauseita ei siis vielä tarvita tässä tehtävässä.

Luento 10 - tietokantayhteydet

Mysql funktiot php:ssä

Kertaa mysql-käskyt ennen kuin jatkat eteenpäin. Jos et ymmärrä SQL:ää, et tule ymmärtämään seuraavaa luentoa.

mySQL on ilmainen tietokantaohjelma. Sen voi ladata niin Linux kuin Windows ympäristöönkin osoitteesta www.mysql.com. mySQL:n dokumentaatiota löydät osoitteesta http://dev.mysql.com/doc/.

Vaatimukset

Jotta PHP:n mysql funktiot toimivat koneellasi tia palvelimellasi, tarkista, että php versiossasi on mySQL tuki päällä.
In order to have these functions available, you must compile PHP with MySQL support.

Määritykset php.inissä

mySQL:n konfigurointi vaihtoehdot

  • mysql.allow_persistent "On" PHP_INI_SYSTEM
  • mysql.max_persistent "-1" PHP_INI_SYSTEM
  • mysql.max_links "-1" PHP_INI_SYSTEM
  • mysql.trace_mode "Off" PHP_INI_ALL
  • mysql.default_port NULL PHP_INI_ALL
  • mysql.default_socket NULL PHP_INI_ALL
  • mysql.default_host NULL PHP_INI_ALL
  • mysql.default_user NULL PHP_INI_ALL
  • mysql.default_password NULL PHP_INI_ALL
  • mysql.connect_timeout "0" PHP_INI_SYSTEM

Voit määrittää siis useita tietoja valmiiksi php.iniin, kuten esimerkiksi esimerkkikäyttäjätunnuksen ja salasanan tietokantaasi.

Tarvitsemiamme funktioita

mysql_connect
(PHP 3, PHP 4 , PHP 5)

mysql_connect avaa yhteyden mySQL serveriin.

resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]])

Funktio palauttaa link identifierin, mikäli yhteyden muodostus onnistui, ja palauttaa FALSE:n, mikäli yhteyttä ei voitu muodostaa.

Esimerkki:

<?php
$linkki = mysql_connect('localhost', 'juuseri', 'passwordi');
if (!$linkki) {
echo('En saanut yhteyttä ja tässä on sinulle syy miksi: ' . mysql_error());
}else{
echo 'Tietokanta yhteys muodostettu';
}
mysql_close($linkki);
?>

mysql_query
(PHP 3, PHP 4 , PHP 5)

mysql_query lähettää mysql kyselyn.

resource mysql_query ( string query [, resource link_identifier])

mysql_query() lähettää kyselyn aktiiviseen tietokantaan sille serverille, joka on määritelty mysql_connect -funktiolla avattavaksi linkki -muuttujaan yllä. Mikäli linkkiä ei ole määritelty, käytetään viimeiseksi avattua linkkiä tietokantaan. Jos linkkiä ei ole auki ollenkaan, funktio yrittää luoda linkin mysql_connect käskyllä siten, että se ei käytä parametreja mukana ollenkaan. Jos mysql lauseesi on virheellinen, funktio palauttaa FALSE:n ja myös virheen, mikäli olet niin määritellyt.

Esimerkki:

<?php
$lause = "SELECT * FROM kuvat";
$tulos = mysql_query($lause);
if (!$tulos) {
echo('Virhe: ' . mysql_error());
}
?>

mysql_fetch_row
(PHP 3, PHP 4 , PHP 5)

mysql_fetch_row hakee tuloksen

array mysql_fetch_row ( resource result)

Palauttaa taulukon, joka vastaa haettuja rivejä tai FALSE:n, jos rivit ovat loppu.

mysql_fetch_row() hakee yhden rivin dataa. Rivi palautetaan taulukkona, jossa jokainen sarake on tallennettu taulukon sarakkeeseen tulojärjestyksessä. Laskenta aloitetaan alkiosta 0.

Mikäli kirjoitat mysql_fetch_row() käskyn uudestaan, hakee funktio seuraavan rivin tietokannasta. Saadaksesi kaikki rivit taulusta, sinun pitää siis käyttää tätä funktiota niin kauan, kuin tietokannan taulussa on rivejä.

<?php
$lause ="SELECT nimi FROM ihmiset";
$tulos = mysql_query($lause);
if (!$result) {
echo('Virhe: ' . mysql_error());
}
while($rivi=mysql_fetch_row($tulos)){
echo("Nimi: " . $rivi[0] . "<p>");
}
?>

Eli kaikkia edellämainittuja funktioita yhdistämällä, saat tietokannan taulusta tiedot ruudulle. Tässä on vielä koottu esimerkki selityksineen:

<?php
$linkki = mysql_connect('localhost', 'juuseri', 'passwordi');
// avataan yhteys tietokantaan localhost käyttäjätunnuksella juuseri ja salasanalla passwordi
if (!$linkki) {
// jos $linkki muuttujan sisältö on tyhjä
echo('En saanut yhteyttä ja tässä on sinulle syy miksi: ' . mysql_error());
// emme saaneet yhteyttä ja virheilmoitus miksi näin kävi
}else{
// muuten
echo 'Tietokanta yhteys muodostettu';
// saimme yhteyden
}
$lause = "SELECT * FROM kuvat";
// kirjoitetaan sql-lause talteen $lause nimiseen muuttujaan
$tulos = mysql_query($lause);
// suoritetaan sql lause ja otetaan tulos talteen $tulos muuttujaan
if (!$tulos) {
// jos tulos muuttujan sisältö on tyhjä
echo('Virhe: ' . mysql_error());
// tulostetaan mikä virhe tapahtui
}else{ // muuten jatketaan
while($rivi=mysql_fetch_row($tulos)){
// haetaan rivejä, kunnes rivit loppuvat, tallennetaan $rivi taulukkomuuttujaan tulokset
echo("Nimi: " . $rivi[0] . "<p>");
// tulostetaan aina sisältö ruudulle, ennen kuin haetaan seuraava
}// ja mennään looppia läpi ja haetaan seuraava rivi
}// ja lopetetaan if
mysql_close($linkki);
// ja suljetaan yhteys tietokantaan
?>

Tuntitehtävät

  1. Tee php-tiedosto, joka ottaa yhteyden tietokantaan (Opettaja antaa tunnukset tunnin alussa) ja hakee tietokannasta jippii taulusta hep sarakkeen nimi sisällön ruudulle allekkain. Pyydä opettajalta taulun rakenne.
  2. Paranna edellistä tehtävää siten, että tulostat rivit taulukkoon ja otat mukaan myös kentän id. Malli taulukosta.(Valitse selaimesta View -source, niin näet koodin). Huomaa, että <TABLE> tagit tulevat while luuppisi ulkopuolelle ja toistat ainoastaan pätkää <TR>...</TR>.
  3. Tee php-ohjelma, joka arpoo lottovoittajan. Ohjelma arpoo siis luvun, joka vastaa riviä tietokannassa, välillä 1-18. Hae kyseisen rivin voittajan nimi ja tulosta näytölle.
  4. Tee ohjelma, joka hakee hep taulun sisällön taulukkoon siten, että nimet tulevat aakkosjärjestyksessä ruudulle.

Vaikeampia tehtäviä

  1. Tee tehtävä kaksi siten, että joka toinen rivi on eri värinen. (Vinkki jakojäännös!)
  2. Tee php-tiedosto, joka hakee nimen ja iän taulusta ihmiset. Viimeisellä taulukon rivillä on laskettu ihmisten iät yhteen.
  3. Tee verkkokaupan ostoskori. Hae taulusta ostoskori kaikki ne tuotteet, joiden asiakas on 'Pekka'. Laske yhteen pekan ostokset ja laske toiseksi alimmaiselle riville yhteissummaan alvin osuus (22%) ja alimmaiselle riville yhteissumma + alvin summa, eli ostoksien kokonaissumma. Jos osasit tämän tehtävän, sinun ei tarvitse stressata kokeesta.

Luento 11 - tietokantayhteyden jatkuvat

Mysql:n käyttö jatkuu

Kertaa luennolta 11 seuraavat funktiot:

  • mysql_connect
  • mysql_query
  • mysql_fetch_row

tarvitset niitä tänäänkin.

Kuten olet SQL-tunneilla oppinut, tietokantaan voi antaa SELECT,INSERT,UPDATE ja DELETE -käskyjä (Tietysti myös monia muita, mutta tässä käytetyimmät). Alla on kaksi esimerkkiä, toisessa luetaan kaikki rivit tietokannan taulusta ruudulle taulukkoon ja toisessa syötetään tietoa tietokantaan sisään.

Tietokannan taulun lukeminen ja tulostaminen näytölle

<?php
$linkki = mysql_connect('localhost', 'juuseri', 'passwordi');
// avataan yhteys tietokantaan localhost käyttäjätunnuksella juuseri ja salasanalla passwordi
if (!$linkki) {
// jos $linkki muuttujan sisältö on tyhjä
echo('En saanut yhteyttä ja tässä on sinulle syy miksi: ' . mysql_error());
// emme saaneet yhteyttä ja virheilmoitus miksi näin kävi
}else{
// muuten
echo 'Tietokanta yhteys muodostettu';
// saimme yhteyden
}
mysql_select_db("jippii");
$lause = "SELECT * FROM kuvat";
// kirjoitetaan sql-lause talteen $lause nimiseen muuttujaan
$tulos = mysql_query($lause);
// suoritetaan sql lause ja otetaan tulos talteen $tulos muuttujaan
if (!$tulos) {
// jos tulos muuttujan sisältö on tyhjä
echo('Virhe: ' . mysql_error());
// tulostetaan mikä virhe tapahtui
}else{ // muuten jatketaan
// tässä kohtaa lopetan php:n ja teen html:llä taulukon?>
<table>
<?php
while($rivi=mysql_fetch_row($tulos)){ ?>
<tr><td>
<?php
// yllä tulostin <tr> komennolla rivin ja sarakkeen näytölle
// haetaan rivejä, kunnes rivit loppuvat, tallennetaan $rivi taulukkomuuttujaan tulokset
echo("Nimi: " . $rivi[0] . "<p>"); ?>
</td></tr>
<?php
// tulostetaan aina sisältö ruudulle, ennen kuin haetaan seuraava
}// ja mennään looppia läpi ja haetaan seuraava rivi ?>
</table>
<?php
}// ja lopetetaan if
mysql_close($linkki);
// ja suljetaan yhteys tietokantaan
?>

Huomaa, että <TABLE> -käskyt annetaan while loopin ulkopuolella. Tämä johtuu siitä, että tarvitsemme vain yhden taulun, mutta monia (=luupissa) rivejä, joihin tieto haetaan.

Tietojen syöttäminen esimerkiksi lomakkeen avulla tietokantaan

<?php
$linkki = mysql_connect('localhost', 'juuseri', 'passwordi');
// avataan yhteys tietokantaan localhost käyttäjätunnuksella juuseri ja salasanalla passwordi
if (!$linkki) {
// jos $linkki muuttujan sisältö on tyhjä
echo('En saanut yhteyttä ja tässä on sinulle syy miksi: ' . mysql_error());
// emme saaneet yhteyttä ja virheilmoitus miksi näin kävi
}else{
// muuten
echo 'Tietokanta yhteys muodostettu';
// saimme yhteyden
}
mysql_select_db("jippii");
// yhdistetään lomakkeen input kenttien arvot yhdeksi muuttujaksi, lomakkeessa on siis ainakin kentät nimi ja email
$kokojuttu = $nimi . " " . $email . " " . date("d.m.Y");
$lause = "INSERT INTO hep (vierailija) VALUES ('$kokojuttu'')";
// kirjoitetaan sql-lause talteen $lause nimiseen muuttujaan
$tulos = mysql_query($lause);
// suoritetaan sql lause ja otetaan tulos talteen $tulos muuttujaan
if (!$tulos) {
// jos tulos muuttujan sisältö on tyhjä
echo('Virhe: ' . mysql_error());
// tulostetaan mikä virhe tapahtui
}else{ // muuten jatketaan
echo("Tietokantaan lisätty tiedot!");
}// ja lopetetaan if
mysql_close($linkki);
// ja suljetaan yhteys tietokantaan
?>

Ylläolevassa esimerkissä taulussa on vain yksi rivi nimeltää vierailija. Taulussa voi olla monia sarakkeita, esimerkiksi oma nimelle, oma sähköpostille ja oma päivämäärälle. Taulu voi siis näyttää esimerkiksi tältä:

ID nimi email pvm
1 Pekka pekka@hotmail.com 2004-11-20 15:00:50
2 Kaisa-Maija kms@hotmail.com 2004-11-21 15:50:50
3 Pauli pauli@jippii.fi 2004-11-23 12:00:50
4 Matti Manninen matti.manninen@welho.com 2004-11-24 08:00:50

Tehtävään liittyviä taulujen rakenteita:

Tuntitehtävät

Tehdään vieraskirja, joka toimii php:llä ja mysql:llä.

  1. Vieraskirja tehdään kotihakemistoosi (http://harjoitusymparisto/~opiskelijaXX). Jos haluat tehdä tehtävän MBnettiin, sinulla pitää olla tietokanta MBnetin palvelimella.
  2. Sinulle on luotu valmiiksi taulu omalla nimelläsi (nimeämistapa etunimi + sukunimen ensimmäinen kirjain, eli Pekka Puupää --> pekkap). Taulu toimii vasta keskiviikkona 24.11.
  3. Tee php -tiedosto, jolla tulostat tietokannan taulun sisällön ruudulle siten, että ruudulla on taulukko, jonka jokaisella rivillä on yhden vierailijan tiedot allekkain. (Vinkki: Ensimmäinen esimerkki tällä sivulla. Huomaa, että taulukko on vielä tyhjä, joten ruudulle ei kuulukaan näkyä mitään).
  4. Tee lomake, jossa kysyt nimeä, sähköpostiosoitetta ja terveisiä eli 3 kenttää! Lähetä esimerkiksi tiedostoon tallennavieras.php, jonka teet seuraavaksi.
  5. Tee php -tiedosto, jossa tallennat tiedot tietokantaan (Vinkki: INSERT käsky ja ylläoleva esimerkki. Jokainen tieto syötetään omaan sarakkeeseensa). Kokoa päivämäärä sellaiseen muotoon, että se menee mysql kantaan, kuten yllä esimerkissä, eli esim. 2004-11-24 08:00:57. Käytä siis date -funktiota.
  6. Paranna edellistä tehtävää siten, että sivulla jossa näkyy kaikki vieraskirjan viestit, sähköposti näkyy linkkinä kyseiselle ihmiselle eli esim. sanasta pekka@hotmail.com voi klikkaamalla lähettää sähköpostia Pekalle. Linkki tehdään näin <A HREF="mailto:pekka@hotmail.com">pekka@hotmail.com</A>.
  7. Paranna tehtävää siten, että tulostat jokaisen käyttäjän nimen edessä monesko vieras hän on kirjassasi. (Vinkki: Tee muuttuja $lkm,jonka arvoksi annat 0, ennen kuin aloitat while käskyn. Ennen kuin lopetat while käskyn, kasvata lkm muuttujan arvoa yhdellä, eli $lkm++;, tulosta aina $lkm muuttujan arvo ennen nimi muuttujaa.)

Bonukset

  1. Lisää edelliseen tehtävään johonkin kohtaan sivulle, kuinka monta vierailijaa vieraskirjassasi on yhteensä.
  2. Lisää edelliseen tehtävään johonkin kohtaan sivulle, milloin viimeisin vierailija on käynyt sivuillasi/kirjassasi.

Kertaustehtäviä

  1. Tee php-tiedosto, joka tulostaa näytöllesi numerot 1-100 allekkain.
  2. Tee php-tiedosto, joka tulostaa näytöllesi numerot 100 alaspäin, nollaan asti.
  3. Tee php-tiedosto, jossa kysyt URL:sta kahden muuttujan arvoa, a:n ja b:n. Tulosta a:n ja b:n arvot ruudulle. Muuttujan sisältö voi olla mitä vaan, eli esimerkiksi numeroita tai kirjaimia.
  4. Tee php-tiedosto, jossa kysyt URL:sta kahden muuttujan arvoa, a:n ja b:n, jotka ovat numeroita. Jos a on suurempi kuin b tulosta ruudulle "b voitti", jos toisinpäin tulosta "a voitti".
  5. Tee php-tiedosto, jossa kysyt URL:sta kahden muuttujan arvoa, a:n ja b:n, jotka ovat numeroita. Jos a on suurempi kuin b tai jos b = 7, tulosta ruudulle "b voitti", jos toisinpäin tulosta "a voitti".
  6. Tee php-tiedosto, joka tulostaa päiväyksen ruudulle muodossa pp.kk.vvvv.
  7. Lisää edelliseen tiedostoon: tulosta viikonpäivä isoilla kirjaimilla (englannin kielinen käy).
  8. Lisää edelliseen tiedostoon: tulosta kuinka monta merkkiä pitkä on viikonpäivän nimi.
  9. Muuta php:n avulla muuttuja, jonka sisältö on "Matti Meikäläinen" sähköpostimuotoon matti.meikalainen@yritys.com, eli poista mahdolliset å,ä ja ö -merkit ja lisää @ merkki ja loppuosa.
  10. Lisää edelliseen tiedostoon: tulosta kellonaika, esim. 15:50:43.
  11. Tee php -tiedosto, jossa tulostat "Hyvää viikonloppua", jos on viikonloppu.
  12. Tee käkikello ohjelma. Jos kello on tasan, esimerkiksi tasan kello 14, kirjoita ruudulle teksti "TASAN 14", muuten tulosta pelkkä kellonaika.
  13. Käännä toisinpäin seuraava teksti. "php on helppoa".
  14. Tee php:llä myydään ja ostetaan ilmoitustaulu. Tarvitset 3 tiedostoa, lomakkeen, tiedoston joka syöttää tiedot ja tiedoston, joka näyttää ilmoitustaulun sisällön. Käyttäjät syöttävät lomakkeeseen nimen, puhelinnumeron ja viestin, mitä myyvät tai haluavat ostaa. Ilmoitustaulun sisältö näyttää allekkain ilmoitustaulun viestiti.
  15. Tee php -tiedosto, joka arpoo numeron. Numero vastaa kuvaa hakemistossasi. Eli esim. arvottu numero 7 voisi palauttaa kuvan 7.jpg. Ohjelma arpoo siis sivulle haettavan kuvan.
  16. Tee yksinkertainen kuvagalleriasovellus. Tarvitset 3 tiedostoa: a) lomakkeen, jolla kuvia ladataan b) tiedoston, joka lataa kuvat palvelimelle ja tallentaa tiedot tietokantaan c) gallerian, joka näyttää ladatatut kuvat. Käytä php:n file upload toimintoa (kappaleessa 9) kuvien lataamiseen. Tallenna kuvasta kuvan nimi esim. omakuva.jpg tietokannan tauluun omanimi + sukunimen ensimmäinen kirjain + kuva, (esim. pekkatkuvat). Galleria tiedosto listaa taulun sisällön ruudulle allekkain. Lisää taulusta tulevan kuvamuuttujan ympärille seuraavat määreet, niin kuva näkyy sivuillasi. <IMG SRC="<?php echo($rivi[1]); ?>">.

Extra - tiedoston oikeudet palvelimella

chmod - muutama sana tiedoston oikeuksista

  • chmod-komennon avulla voidaan muuttaa tiedostojen ja hakemistojen käyttöoikeuksia.
  • chmod komennolle annetaan kolminumeroinen parametri ja tämän jälkeen tiedostojen ja/tai hakemistojen nimet, joiden oikeudet halutaan muuttaa.
  • Kolminumeroisen sarjan ensimmäinen numero kertoo omistajan oikeudet, seurava numero ryhmän oikeudet ja viimeinen koko maailman oikeudet. Mitä isompi numero on, sitä enempi oikeuksia on. 7 = kaikki oikeudet ja 0 = ei yhtään oikeuksia. Tiedostoon tai hakemistoon voi olla luku- (r), kirjoitus- (w) ja ajo-oikeudet (x).
  • Kun otat hakemistolistauksen komennolla ls, kirjaimet r, w ja x kertovat, että oikeudet löytyvät, jos niiden paikalla on viiva (-), oikeuksia ko. tiedostossa tai hakemistossa ei ole.
  • Ensimmäinen merkki kertoo onko kyseessä tiedosto (-) vai hakemisto (d). Seuraavat kolme merkkiä ovat omistajan, sitä seuraavat ryhmän ja kolme viimeistä merkkiä ovat maailman oikeudet.

Jos asia kiinnostaa vielä laajemmin, täältä löytyy lisätietoja.

 

 

 
www-sivut estime