|
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-lauseIF
<?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
- Kirjoita PHP:llä oma nimesi HTML:n <TITLE> tagien väliin.
- Muuta edellistä tehtävää siten, että kysyt $_GET muuttujan $nimi sisältöä, ja tulostat sen <TITLE> tagien väliin.
- 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>
- Tee taulu, johon keräät kuukausien nimet. Tulosta taulukon 8. alkio näytölle.
- Tee ohjelma, joka tulostaa arvot 1-7. Toteuta While -luupilla.
- Toteuta edellinen tehtävä for -luupilla.
- 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.
- 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.
- Tee php-ohjelma, jossa tulostat tämän päivän päivämäärän
muodossa 27.10.2004.
- 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.
- Tee php-ohjelma, jossa tulostat nykyisen kuukauden näytölle englanniksi
ja isoilla kirjaimilla.
- Tee ohjelma, joka tulostaa ruudulle, monesko vuoden päivä nyt
on esim. Tänään 27.10.2004 on vuoden xxx. päivä.
- Tee ohjelma, joka tarkistaa,onko syntymäpäiväsi validi päivämäärä,
käytä checkdate-funktiota.
- Tee php-ohjelma, joka tulostaa ruudulle päivämäärän
seuraavassa muodossa: Oct 26 Wed.
- 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.
- 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.
- Tee php-ohjelma, joka tulostaa suomeksi ko. päivän viikonpäivän
ruduulle takaperin, eli esim. okkiiviksek.
- 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ä.
- 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ä.
- 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>.
- 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
- 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.
- 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.
- Tee kirjoita.php, jossa kirjoitat lomakkeen sisällön vieraskirja.txt
tiedostoon. Huom! Muistathan antaa tiedostollesi riittävästi oikeuksia.
- Tee tiedosto luekirjaa.php, jossa tulostat vieraskirjan sisällön
ruudulle. Älä käytä include -funktiota lukemiseen!
- 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.
- Lähetä edellisen tehtävän lomakkeen sisältö
omaan sähköpostiosoitteeseesi.
- 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
- Tee lomake, jossa on tiedoston lataus kenttä. Tallenna nimellä
lataa.php.
- Tee php-tiedosto, jolla lataat esimerkiksi tekstitiedoston palvelimelle,
omaan kotihakemistoosi (http://harjoitusymparisto/~opiskelija51/...)
- Lisää edelliseen tehtävään myös tiedot tiedostosta,
eli tulosta ruudulle tiedoston nimi, koko ja tyyppi.
- 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)
- Lisää edelliseen lataustehtävään tarkistus, että
hakemistoosi saa ladata vain txt- ja gif- päätteisiä tiedostoja.
Vinkki funktio strstr!
- 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
- Tee lomake, jossa on tiedoston lataus kenttä. Tallenna nimellä
lataa.php.
- Tee php-tiedosto, jolla lataat esimerkiksi tekstitiedoston palvelimelle,
omaan kotihakemistoosi (http://harjoitusymparisto/~opiskelija51/...)
- Lisää edelliseen tehtävään myös tiedot tiedostosta,
eli tulosta ruudulle tiedoston nimi, koko ja tyyppi.
- 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)
- Lisää edelliseen lataustehtävään tarkistus, että
hakemistoosi saa ladata vain txt- ja gif- päätteisiä tiedostoja.
Vinkki funktio strstr!
- 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ä
- 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ä?
- tee php-tiedosto, jossa lasket seuraavaa: pyöristä luku 45.67
ylöspäin, alaspäin, lähimpään kokonaislukuun.
- Laske luvun 64 neliöjuuri.
- Laske 5 potenssiin 7.
- Arvo luku välillä 1 ja 50.
- Tee php tiedosto, jossa arvot, mille sivulle käyttäjä ohjataa:
a) www.keuda.fi, b) www.helsinki.fi tai c) www.kerava.fi.
- 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)
- Tee php-tiedosto, jossa arvot tervehdyksen käyttäjälle. Vaihtoehtoina
esim. Moi,Hei,Heippa,Morjens,Terve jne.
- Tee php-tiedosto, jossa listaat kotihakemistosi sisältämät
tiedostot näytölle.
- 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!
- 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.
- 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.
- 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
- 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.
- 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>.
- 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.
- Tee ohjelma, joka hakee hep taulun sisällön taulukkoon siten,
että nimet tulevat aakkosjärjestyksessä ruudulle.
Vaikeampia tehtäviä
- Tee tehtävä kaksi siten, että joka toinen rivi on eri värinen.
(Vinkki jakojäännös!)
- Tee php-tiedosto, joka hakee nimen ja iän taulusta ihmiset. Viimeisellä
taulukon rivillä on laskettu ihmisten iät yhteen.
- 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ä.
- Vieraskirja tehdään kotihakemistoosi (http://harjoitusymparisto/~opiskelijaXX).
Jos haluat tehdä tehtävän MBnettiin, sinulla pitää
olla tietokanta MBnetin palvelimella.
- 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.
- 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).
- Tee lomake, jossa kysyt nimeä, sähköpostiosoitetta ja terveisiä
eli 3 kenttää! Lähetä esimerkiksi tiedostoon tallennavieras.php,
jonka teet seuraavaksi.
- 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.
- 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>.
- 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
- Lisää edelliseen tehtävään johonkin kohtaan sivulle,
kuinka monta vierailijaa vieraskirjassasi on yhteensä.
- Lisää edelliseen tehtävään johonkin kohtaan sivulle,
milloin viimeisin vierailija on käynyt sivuillasi/kirjassasi.
Kertaustehtäviä
- Tee php-tiedosto, joka tulostaa näytöllesi numerot 1-100 allekkain.
- Tee php-tiedosto, joka tulostaa näytöllesi numerot 100 alaspäin,
nollaan asti.
- 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.
- 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".
- 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".
- Tee php-tiedosto, joka tulostaa päiväyksen ruudulle muodossa pp.kk.vvvv.
- Lisää edelliseen tiedostoon: tulosta viikonpäivä isoilla
kirjaimilla (englannin kielinen käy).
- Lisää edelliseen tiedostoon: tulosta kuinka monta merkkiä
pitkä on viikonpäivän nimi.
- 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.
- Lisää edelliseen tiedostoon: tulosta kellonaika, esim. 15:50:43.
- Tee php -tiedosto, jossa tulostat "Hyvää viikonloppua",
jos on viikonloppu.
- Tee käkikello ohjelma. Jos kello on tasan, esimerkiksi tasan kello
14, kirjoita ruudulle teksti "TASAN 14", muuten tulosta pelkkä
kellonaika.
- Käännä toisinpäin seuraava teksti. "php on helppoa".
- 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.
- 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.
- 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.
|