Spletni PHP krožek

3. teden

Živjo!

Ta teden se bomo osredotočili na polja (arrays). Nekateri jim rečejo tudi tabele.

Kaj so polja spremenljivk?

Predstavljaj si, da imaš 10 spremenljivk, recimo:

$stevilo1, $stevilo2, $stevilo3, $stevilo4,..., $stevilo10. Prvi problem je, da ne moremo na hiter in univerzalen način npr. sešteti vseh 10 (kar bomo počeli enkrat naslednjič), drugi pa, da je pri večjih količinah spremenljivk problem v nadzoru, saj nam stvari kaj kmalu uidejo iz rok. Da bi se tega problema rešili, so programerji "izumili" polja spremenljivk.

Polja spremenljivk imajo lahko n dimenzij, najbolj preprosto polje je 1-dimenzionalno:

Primer polja z imenom stevila, v katerem smo določili 5 "prostorčkov":

1 2 3 4 5

To odgovarja 5 spremenljivkam - $stevilo1, $stevilo2, $stevilo3, $stevilo4 in $stevilo5, s tem da je tukaj poimenovanje malce drugačno - če bi recimo v 1. prostorček želeli shraniti število 15, bi napisali:

$stevila[0] = 15;

Zadeva se uporablja podobno kot spremenljivke, samo da je na koncu imena polja v oglatih oklepajih še oznaka njenega ključa ("predalčka") v oglatih oklepajih. En par oglatih oklepajev pomeni eno dimenzijo.

Še dva primera uporabe:

print $stevila[2]; // na zaslon izpišemo vrednost 3. predalčka
$vsota = $stevila[1] + $stevila[4]; // v spremenljivko vsota damo seštevek 2. in 5. predalčka
Štetje predalčkov se začne pri 0; 1. predalček ima tako ključ z oznako 0, 2. predalček ključ z oznako 1, 3. 2 in tako naprej. (Predalčkom se reče tudi indeksi.)

Primer 2-dimenzionalnega polja, ki najbolj "klasično" odgovarja tabeli (v tem primeru sem v celice tabele zapisal "koordinate" namesto vrednosti):

0, 0 0, 1 0, 2 0, 3 0, 4 0, 5
1, 0 1, 1 1, 2 1, 3 1, 4 1, 5

Primer izpisa vrednosti rumeno označenega prostorčka:

print $stevila[1][4];

Podobno bi naredili tudi 3-dimenzionalno polje.

Ustvarjanje polj

PHP pri ustvarjanju polj ne komplicira preveč. Neko n-dimenzionalno polje lahko ustvarimo tako, da mu določimo vrednost na nekem mestu v polju; spodaj sta primera za 3-dimenzionalno polje in za preprosto 1-dimenzionalno polje:

$test[4][3][6] = "Marko"; // ustvarimo neko 3-dimenzionalno polje in mu določimo element na
                          // poziciji 4,3,6

/* ustvarimo še 1-dimenzionalno polje s 3 elementi: */

$test2[0] = "zaba";
$test2[1] = "krava";
$test2[2] = "kobilica";

V zgornjih primerih smo pri definiranju vedno navedli tudi št. prostorčka, kar ni nujno potrebno. Oglejmo si še en primer:

$testiramo[] = "a"; // ustvarimo 5 zaporednih prostorčkov v 1-dimenzionalnem polju
$testiramo[] = "b";
$testiramo[] = "c";
$testiramo[] = "d";
$testiramo[] = "e";

print $testiramo[1]; // izpiše "b"
print $testiramo[4]; // izpiše "e"

Še ena možnost je, da uporabimo funkcijo array():

$polje = array("jabolko","banana","hruska","grenivka");

V tem primeru smo ustvarili 1-dimenzionalno polje s 4 elementi, do katerih dostopamo prek "spremenljivk"

$polje[0] (tukaj je vrednost "jabolko"), $polje[1] ("banana"), $polje[2] ("hruska") in $polje[3] ("grenivka").

Seveda lahko funkcijo array() uporabimo tudi večkrat znotraj le-te - primer 2-dimenzionalnega polja s 3 vrsticami in 2 stolpcema:

$barve = array(array("modra","rdeca"),array("zelena","bela"),array("crna","rumena"));

print $barve[0][1]; // izpiše "rdeca"
print $barve[2][0]; // izpice "crna"

Različna vrsta polj

Ključe v poljih lahko namesto s števili označimo tudi z npr. stringi. Primer je recimo datoteka z nastavitvami za forum:

$nastavitve["username"] = "admin";
$nastavitve["password"] = "dododo123";
$nastavitve["baza"] = "mojforum";
Tudi pri ključih imata dvojni (") in enojni (') narekovaj podobni vlogi kot pri nizih; pomni, da recimo $_GET[username] (brez narekovajev okoli besede username) ni dovoljen način, čeprav v večini PHP različic deluje.

Tukaj odpade klicanje "predalčkov" z npr. $nastavitve[0].

Zanimiv primer uporaba je tudi tale, kjer namesto niza kot imena ključa vstavimo kar spremenljivko:

$ime_kljuca = "baza";

print $nastavitve[$ime_kljuca]; // je enako kot: print $nastavitve["baza"];

Poleg podajanja vrednosti določenim "predalčkom" v polju lahko uporabimo tudi asociativni pristop s funkcijo array():

$polje = array("ime" => "Marko", "priimek" => "Štamcar", "starost" => 20);

print $polje["priimek"]; // izpiše "Štamcar"

/* seveda lahko takšno naštevanje zapišemo tudi na "lepši" način: */

$polje = array(
"ime" => "Marko",
"priimek" => "Štamcar",
"starost" => 20
);

V tem primeru funkciji array() kot argumente podamo pare ključev in vrednosti, ločene z =>.

Funkcije za delo s polji

Naštejmo nekaj najbolj koristnih funkcij za delo s polji:

array() - ustvarjanje novih polj
count() - vrne št. elementov v polju
in_array() - vrne true, če nek element v polju obstaja, drugače pa vrne false
sort() - sortira polje po vrednostih (po abecedi, po velikosti,...)
ksort() - sortira polje po ključih (po abecedi, po velikosti,...)

Opomba: za seznam argumentov, ki jih sprejmejo funkcije, si boš moral ogledati njihovo dokumentacijo na php.net.

Funkcija print_r

Poseben odstavek bom namenil funkciji print_r, ki se obnaša podobno kot funkcija print, le da lahko z njo na lep način izpišemo vsebino nekega polja. Poglejmo si primer:

$barve = array(array("modra","rdeca"),array("zelena","bela"),array("crna","rumena"));

print "<pre>";
print_r($barve);
print "</pre>";

Ker izpis obsega več vrstic in je oblikovan s presledki, moramo zaradi preglednosti uporabiti HTML oznako <pre>. Izpis, ki se nam pokaže, je sicer bolj "tehničen", pride pa prav pri razhroščevanju naših programov.

$_GET in $_POST polji spremenljivk

S polji povezana tema sta tudi v PHP vgrajeni polji $_GET in $_POST. Ob izvajanju naše spletne strani lahko iz njiju izluščimo podatke, poslane prek metod GET in POST.

Za kaj gre? V našo PHP skripto lahko podatke pošljemo prek HTML obrazca (<form>), kjer lahko lastnost method določimo kot get ali post. Pri prvem načinu se vrednosti vnosnih okenc in ostalih delov obrazca pošljejo "zakodirane" v URL naslovu, pri drugem pa "nevidno" prek HTTP protokola. Metoda get se lahko uporablja tudi brez obrazcev, ker lahko na ta način podatke vnesemo neposredno v URL naslov.

Metoda GET

1. Primer: imamo spletni obrazec z dvema vnosnima poljema - "Ime" in "Priimek". Ko uporabnik vnese svoje podatke in klikne gumb pošlji, se nova stran, ki je v <form> navedena pod action (lahko je tudi ista) pokliče takole:

test.php?ime=Marko&priimek=Štamcar

Na ta način so se podatki poslali prek GET metode. ime in priimek sta imeni elementov obrazca, ki smo ju določili z atributom name.

V samem naslovu strani so podatki zapisani v obliki ime=vrednost in ločeni z znakom 'and' - &
Pred začetkom podajanja parov imen in vrednosti moramo dati še vprašaj - ?
(to je lepo razvidno iz zgornjega primera)

V tem primeru torej prek GET-a pošljemo vrednosti za ime in priimek.

To postaneta ključa v polju $_GET:

$_GET["ime"] in $_GET["priimek"]

Primer PHP kode skupaj s HTML kodo za obrazec:

<form method="get">
ime: <input type="text" name="ime"/><br />
priimek: <input type="text" name="priimek"/><br />
<input type="submit" value="Pošlji"/>
</form>

<?php
    print $_GET["ime"] . " " . $_GET["priimek"];
?>

Seveda lahko podatke prek GET pošljemo tudi brez obrazca, recimo takole:

<a href="?ime=Marko&priimek=Štamcar">klikni me</a>

<?php
    print $_GET["ime"] . " " . $_GET["priimek"];
?>

Metoda POST

Pri pošiljanju podatkov prek obrazcev se največkrat uporablja ta metoda. Primer kode bi bil podoben kot zgornji primer z obrazcem, le da namesto method="get" uporabimo method="post" in da nato do vrednosti, poslanih prek obrazca, dostopamo prek polja $_POST.

Polje $_SERVER

$_SERVER je še eno polje, vgrajeno v PHP - v njem so spravljeni različni podatki o strežniku in uporabniku, ki obiskuje stran, recimo:

$_SERVER['REMOTE_ADDR'] - IP naslov uporabnika, ki je obiskal našo stran (skripto)
$_SERVER['DOCUMENT_ROOT'] - pot na strežniku, v kateri se nahaja naša skripta
$_SERVER['HTTP_REFERER'] - stran, prek katere smo prišli do naše skripte (če do nje dostopamo neposredno, bo ta vrednost prazna)
$_SERVER['HTTP_USER_AGENT'] - podatki o brskalniku uporabnika, ki je obiskal našo stran (skripto)

Naslednjič...

Naslednjič se bomo vrgli v pogojni stavek if in zanko for, do takrat pa le pridno reši domačo nalogo :)