Innhold

Innledning

Med PHP kan du programmere dynamiske, interaktive websider. Det betyr at det som vises i nettleseren genereres i samme øyeblikk som noen besøker sidene. PHP er et fullverdig programmeringsspråk og kan dermed brukes til å lage enkle så vel som de mest avanserte webløsninger. Du kan lage flybestillingssystemer, nettbutikker, ditt personlige bildearkiv, gjestebok for din hjemmeside, et nyhetspubliseringssystem og en hel rekke andre ting.

PHP er basert på fri kildekode (open source), og er veldig populært. Det er mange grunner til å bruke PHP i webutvikling:

Det er naturlig å bruke PHP i dette kurset. Målet med kurset er å gi innblikk i en del sentrale teknikker ved webutvikling. Med PHP er det enkelt å illustrere og prøve ting i praksis, både bruk av cookies, søk, databaser og mye mer. Koblingen mot databaser er spesielt enkel i PHP,  og du vil ganske snart få lære i grove trekk hvordan koden er for å trekke ut informasjon fra en database, og hvordan du kan programmere en webløsning spm legge inn informasjon i databasen. Dermed er det mulig å lage egne, databasedrevne systemer.

Legg merke til at du gjennom lærestoffet om PHP i dette kurset på ingen måte får noen komplett gjennomgang eller dybdekunnskap om PHP. Du vil lære litt overordnet, og du vil få nok kodeeksempler til at du kan prøve ut ting som likner på standardeksemplene i praksis. Det er altfor lite plass til å forklare ting i dybden. Det er en fordel om du kjenner til konseptene fra grunnleggende programmering før du starter (typisk variabel, if, while, funksjon og matrise/array).

Hvordan fungerer PHP

For å bruke PHP kreves det at du har installert en webserver, gjerne Apache. Du kan installere denne lokalt på din egen Windows-maskin, Linux, eller Mac dersom du har det. På Mac kommer for øvrig både Apache og PHP ferdig installert (det er bare å hake av noen kryss så er du i gang). Mange velger å utvikle lokalt (på egen maskin) for så å senere legge php-filene ut på en webtjener som er tilgjengelig på Internett. En webtjener som du kan bruke, er AITeL sin webtjener. Mer informasjon får du i kurset. Du kan også legge ut sidene dine hos nesten alle webhoteller.

I det videre antar vi at du alt har installert webtjener med PHP på din maskin og ser på et eksempel på hva som skjer når du besøker en webside med PHP-kode.


Illustrasjon av samspillet mellom klient og tjener. Opphavsrett © Svend Andreas Horgen

Det første som skjer er at klienten (Kari Nordmann) ber tjeneren om å få siden http://enTjener.no/forste.php, typisk ved å skrive inn adressen i nettleserens adressefelt. Dette er en forespørsel som tjeneren kan og vil behandle. Tjeneren (mer nøyaktig webtjeneren) finner ut at forste.php er et PHP-script, og dermed er det PHP-modulen på tjeneren som tar jobben med å kjøre scriptet. Dette er viktig – scriptet utføres altså av PHP-programvare på tjeneren. PHP-programvaren kjenner igjen vanlig HTML, samt noen kommandoer som kommer mellom <?php og ?>. I figuren ser vi at det er to slike PHP-blokker, og to vanlige HTML-blokker. PHP utfører kommandoene, og fletter alt sammen til en vanlig HTML-side som den gir til webtjeneren (her Apache). Webtjeneren sender så svaret tilbake til klienten, som viser fram HTML-siden til brukeren. Brukeren tror kanskje at siden ble laget for flere år siden, men som du nå skjønner, ble alt laget på direkten (on-the-fly).

De fleste websider fungerer på denne måten – at det er script på tjeneren som utføres der-og-da, og at brukeren ser resultatet på sin skjerm. Dette åpner for alle muligheter som kan assosieres med dynamiske websider:


Utvidelse av samspillet mellom klient og tjener hvor database er inkludert. Opphavsrett © Svend Andreas Horgen

Figuren er her utvidet til å ha med en database i punkt 4/5. Dette er gjort for å illustrere at PHP kan hente data fra et eksternt arkiv, for eksempel en database, når PHP skal skreddersy informasjonen som sendes til brukeren. Samspillet mellom PHP og database/fil er helt essensielt for å gi virkelig dynamikk. Du har kanskje hatt databaseteori tidligere og synes databaser er kjedelig? Tro om igjen! Databaser er utrolig morsomt å holde på med når du har litt kunnskap om hvordan du kan bruke PHP til å legge inn og hente ut informasjon fra websidene du lager. Det er faktisk så morsomt at noen finner det mulig å jobbe hele livet med å utvikle slike databasedrevne webløsninger, mens andre skriver bøker og kurs om det. :-)

Et lite eksempel

På den første figuren så du eksempel på et enkelt PHP-script. Dersom du skriver inn koden

<html> 
<body> 
<h2>Velkommen til Norge.no</h2> 
<?php 
  echo "Hovedstaden i Norge er: "; 
  echo "<b>Oslo</b>"; 
  echo "<br>"; 
?> 
I dag er det den 
<?php 
  echo date("d.m.Y"); 
?> 
</body> 
</html> 

i en fil du kaller for forste.php, og lagrer denne på webtjeneren din i mappen wtr under webrota, så kan du skrive i nettleseren: http://adresse.til.webtjener/wtr/forste.php og da vil tjeneren kjøre PHP-scriptet (forutsatt at PHP er riktig installert og konfigurert).

Koden utføres ovenfra og ned. PHP-programvaren støter først på taggene html og body, og en overskrift. Dette sendes rett til klienten. Deretter kommer en PHP-blokk, med tre echo-setninger. En echo er det samme som print, og forteller PHP-programvaren at det mellom ” og ” skal skrives rett ut. Dermed sender PHP-programvaren teksten ”Hovedstaden i Norge er: ” til nettleseren. I slike tekststrenger kan det også stå HTML-kode, som vist i echo nr 2 og 3. Deretter er første PHP-blokk ferdig, og en ny vanlig HTML-blokk møtes: ”I dag er det den” – og denne sendes til nettleseren for visning.

Siste PHP-blokk viser litt av dynamikken – dagens dato skrives ut ved hjelp av funksjonen date(). Vi går ikke inn på formatteringen av datoer, det får du lese mer om på egenhånd.

I praksis vil nok PHP-programvaren sende alle utdata til nettleseren samtidig og ikke linje for linje slik en kan få inntrykk av i kode-forklaringen.

Grunnleggende PHP

Det er ikke plass i en slik overordnet introduksjon å gå i detalj på syntaksen i PHP, men vi gir en introduksjon som gjør at du er godt rustet til å tilegne deg mer kunnskap på egen hånd.

Her er en kort oppsummering av de viktigste tingene du bør være klar over før ser nærmere på skjemabehandling. I neste leksjon tar vi for oss bruk av databaser fra PHP.

Kommentarer

Bruk av // og /* */ er vanligst, men også # er mulig.

// dette er en kommentar som gjelder til neste linjeskift. 
/* her er en kommentar
over flere 
linjer
*/

Variabler og tekststrenger

Her er en kort oppsummering om bruken av variabler og tekststrenger i PHP:

Operatorer

Du kan øke verdier i en variabel på enkel måte ved å skrive ++ bak variabelnavnet:

<?php
	$tall = 24;
	$tall ++; //tall har nå innholdet 25
	echo $tall; //skriver ut 25
?>

De logiske operatorene har en litt annen syntaks enn du kanskje er vant med fra før.

Det er viktig å bruke dobbel &&. Et enkelt & betyr noe annet, det samme gjelder for ||. Ved testing på likhet er det også viktig å bruke dobbel ==, siden enkel = bare betyr tilordning. Det er også mulig å bruke === men da blir uttrykket sant bare hvis det er likhet og samme datatype.

Beslutninger: if

Det er ofte nødvendig å velge med kode. Her er et eksempel som viser blå tekst dersom det er tirsdag i dag, og svart tekst dersom det er en annen dag.

$dagen_i_dag = date("l");  //liten L, ikke ett-tall
if ($dagen_i_dag == "Tuesday") {
	echo "<p style='color:blue'>I dag er det tirsdag</p>"; 
}
else {
	echo "<p>I dag er det en annen dag</p>"; 
}

for-løkke

Det er også mulig å gå gjennom kode med løkker, for eksempel en for-løkke:

for ($i=$start; $i<=$slutt; $i++) {
	//det som skal gjøres her
}

Løkken går fra startverdien til sluttverdien (angitt i de to variablene $start og $slutt), og løkketelleren $i økes med 1 for hver runde. Det er også mulig å hardkode tall, og det gjøres ofte. Her er et praktisk eksempel på hvordan vi enkelt kan bygge opp et skjema som har en nedtrekksliste med mange valg:

echo "<select name='alder'>\n";
for ($teller=1; $teller<=10; $teller++) {
	echo "\t<option>" . $teller . "</option>\n";
}
echo "</select>";}

I stedet for å hardkode i HTML alle option-elementene, kan vi gjøre dette med en løkke. Fordelen er åpenbar – det trengs fortsatt bare 4 linjer kode for å lage 1000 option-elementer (kun løkkebetingelsen må endres).

Resultatet av koden blir HTML som er fin å se på, siden vi har brukt \n og \t for å gi henholdsvis linjeskift og tabulator-innrykk på strategiske steder i koden. Det er ikke nødvendig med slik formattering, siden nettleseren oppfatter en eneste lang strøm av HTML-kode nøyaktig likt som en fint formattert kode.

<select name='alder'>
	<option>1</option>
	<option>2</option>
	<option>3</option>
	<option>4</option>
	<option>5</option>
	<option>6</option>
	<option>7</option>
	<option>8</option>
	<option>9</option>
	<option>10</option>
</select>

Dersom vi ikke hadde benyttet \n og \t på riktige steder i koden, ville resultatet blitt slik, siden PHP ikke setter inn noen logiske linjeskift eller tabulatorer med mindre vi ber om dette eksplisitt:

<select name='alder'><option>1</option><option>2</option><option>3</option> <option>4</option><option>5</option><option>6</option><option>7</option><option>
8</option><option>9</option><option>10</option></select>

while-løkker

Vi kommer nærmere tilbake til while-løkker senere. Syntaksen er slik:

while (BETINGELSEN HER) {
	//det som skal gjøres her 
}

Betingelsen kan være for eksempel $teller > 0 eller for eksempel $navn <> "Petter". Det er viktig å unngå uendelige løkker, så sjekk en ekstra gang at løkkens betingelse er oppdatert for hver gang betingelsen evalueres (slik at løkken har mulighet til å avslutte). Det er selvsagt mulig å ha komplekse betingelser med logiske operatorer, funksjoner med mer, men dette trenger du ikke fokusere på i første omgang.

Annet?

Ja – det fins andre kontrollstrukturer og byggestener i PHP, men det er for liten plass til å gå gjennom alt, og det er også viktig at du ikke mister fokuset på det som er viktig nå. Detaljer bør en ta etterhvert. Vi kommer innpå litt mer avanserte ting etterhvert, men det vil forklares underveis. Du har mer enn nok til å starte nå, og vi starter med å se på skjemabehandling.

Skjemabehandling i PHP

Du kjenner sikkert til skjema (forms) fra før, men la oss kort oppsummere noen grunner til hvorfor skjema brukes på web:

Skjema for registrering av nyheter

Vi skal nå lage et enkelt registreringsskjema for et aldri så lite nyhetssystem. En nyhet har en tittel, en tekst og en forfatter. Vi lager et skjema med vanlig HTML-kode (det er flott å bruke XHTML-syntaks, men ikke noe krav for at nettleseren skal forstå skjemaet).

<h1>Registrer en ny nyhet</h1>
<form action="behandle.php" method="get">
	<p>
	Overskrift som nyheten skal ha: <br />
	<input type="text" name="overskrift">
	</p>	
	
	<p>Skriv inn selve nyheten: <br />
	<textarea rows="5" cols="30" name="nyhet"></textarea>
	</p>
	
	<p>Publisert av: <br />
	<select name="forfatter">
		<option>Svend Andreas</option>
		<option>Walter</option>
		<option>Per</option>
		<option>Grethe</option>
	</select>		

	<input type="submit" value="Lagre nyheten" name="lagreknapp" />
	</p>
</form>

Kanskje du kan nok HTML til å klare å visualisere hvordan dette skjemaet vil se ut? Figuren nedenfor viser at skjemaet består av beskrivende ledetekster, et enkelt tekstfelt for tittel, et større tekstfelt for nyhetsteksten, en nedtrekksliste med fire personer, og en knapp som kan trykkes.


Skjema for å registrere en ny nyhet (tittel, tekst og forfatter). Når knappen trykkes, kan et PHP-script behandle dataene. Opphavsrett © Svend Andreas Horgen

Nederst på figuren er en nedtrekksliste som består av fire valg, og den er trykket på i figuren (derfor vises navnene). Det er opp til nettleseren å avgjøre nøyaktig hvordan skjemaelementene skal se ut. Figuren viser hvordan Safari (Mac) presenterer skjemaet. Alle nettlesere har samme funksjon på de ulike elementene, og et tekstfelt med størrelse 30 vil ha størrelse 30 i alle nettlesere, men det som kan variere er typisk rammekant, rullefelt og avrundinger.

Et PHP-script for behandling av skjemaet

Når knappen trykkes, vil nettleseren ta det som er skrevet inn i tekstfeltene og sende dette til PHP-scriptet behandle.php, siden det er dette filnavnet som står oppført som verdi i attributtet action. Det er nå opp til PHP-scriptet å avgjøre hva som skal skje med informasjonen. En mulighet er å vise nyheten i for eksempel en tabellform. Et fullverdig publiseringssystem kan for eksempel lagre nyheten i en database. Vi kommer tilbake til lagring mot en database senere.

Den observante leser så kanskje også at attributtet method hadde verdien get. For å vise skjemainformasjonen, kan PHP-scriptet som mottar dataene som brukeren skrev inn, rett og slett bruke den superglobale matrisen (arrayet) $_GET. Dette er vist i neste kodesnutt. Du ser også at hvert av skjemaelementene har fått et navn (overskrift, nyhet, forfatter og lagreknapp) i og med name-attributtet. Dette navnet er viktig å bruke i den videre behandlingen, noe som kommer klart fram i neste kodesnutt:

<?php
	if (isset($_GET['lagreknapp'])){
		echo "<h1>Her er en oppsummering av nyheten din</h1>";
		echo "<table cellpadding='10' border='1'>";
		
		echo "<tr><td>Tittel</td>";
		echo "<td>" . $_GET['overskrift'] . "</td>";
		echo "</tr>"; //slutt med første rad (to kolonner)

		echo "<tr><td>Nyhet</td>";
		echo "<td>" . $_GET['nyhet'] . "</td>";
		echo "</tr>"; //slutt med andre rad (to kolonner)

		echo "<tr><td>Hvem?</td>";
		echo "<td>" . $_GET['forfatter'] . "</td>";
		echo "</tr>"; //slutt med tredje rad (to kolonner)
	
		echo "</table>";
	} //slutt på if her, lett å glemme avsluttende klammeparentes
?>

Det er ikke nødvendig å teste på om variabelen lagreknapp er satt, men ved å gjøre det vil en unngå at brukeren skriver lenken til behandle.php direkte (uten å fylle ut skjemaet først). Gjør brukeren det, vil ikke lagreknapp være satt (siden den i utgangspunktet er satt bare når knappen trykkes på).

 

Videre ser du hvordan verdiene fra hvert skjemaelement brukes i PHP-koden. Siden get-metoden er bruk som method i form-elementet, må du skrive $_GET['overskrift'] for å hente ut innskrevet overskrift.

Vi har valgt å lage en tabell og presentere dataene i tabellen, men du står selvsagt fritt til å presentere på hvilken som helst måte med PHP.


Websiden behandle.php oppsummerer det som ble skrevet inn. Opphavsrett © Svend Andreas Horgen

Du kan se på $_GET['overskrift'] som en variabel (skjønt det egentlig er et navngitt element i en matrise/array). Legg merke til bruk av punktum for å slå sammen tekststrenger. I linjen

echo "<td>" . $_GET['overskrift'] . "</td>";

er det altså tre tekststrenger som slås sammen, først en td-tag, så innholdet i overskriftsfeltet, og så en avsluttende td-tag.

Vi har i vårt enkle eksempel brukt get-metoden. Dersom vi heller bruker post-metoden, så kan overskriften hentes ut ved hjelp av formuleringen $_POST['overskrift'].

Det er viktig med store bokstaver og understrek i $_GET[] og $_POST[] siden PHP skiller på store og små bokstaver. Den nysgjerrige leser kan gjerne få vite at alle variabler som har [] etter seg i PHP, er matriser (også kalt arrays, tabeller og vektorer). En matrise er en samling av variabler, og vi kan lage vanlige matriser i PHP på en enkel måte. Det er ikke tema for denne leksjonen, men det kan være greit å vite at  $_GET[] i bunn og grunn bare er en matrise.

Når du lærer mer PHP, vil du se hva det innebærer av muligheter. Helt kort kan nevnes: Sjekke antall elementer ved hjelp av funksjoner som count(), lage en tekststreng av alle elementene (også en matrise-funksjon), gå gjennom alle elementene systematisk med en foreach-løkke (ny kontrollstruktur for mange), beregne summen, sortere og så videre. Matriser i PHP er helt geniale nettopp fordi det er så mange funksjoner for å behandle matriser.

Oppsummering av skjemabehandling

Det er mye, mye mer å si om skjemabehandling, men vi utelater de spennende detaljene her og henviser heller den interesserte til annet lærestoff, slik som faget Web-programmering med PHP.

Det er lett å lage skjema i HTML, og disse kan bli mer eller mindre pene å se på, og ikke minst mer eller mindre brukervennlige. Fokuset i denne leksjonen er å illustrere hvordan du kan lage et PHP-script som behandler et skjema.

For at nettleseren skal kunne vite hvilket script som skal behandle skjemaet, er det nødvendig å oppgi filnavnet (og eventuell sti hvis scriptet ligger i en annen mappe på tjeneren enn HTML-siden) i action-attributtet i form-elementet. Siden hvert skjemaelement har et navn, angitt i hvert elements  name-attributt, kan vi hente ut verdien som brukeren skriver inn med PHP-kode. Når get-metoden brukes (oppgis i method-attributtet i form-elementet), kan verdiene hentes ut ved hjelp av formuleringen $_GET['navnPaaElementet']. Dersom du heller vil bruke post-metoden, er det bare å endre til $_POST['navnPaaElementet'].

Gi oss tilbakemelding!

Savner du noe? Synes du gjennomgangen av et emne var dårlig? Var noe spesielt bra?

Vi vil vite det! Kontakt oss og gi oss tilbakemelding. Vi bruker din tilbakemelding til å gjøre Webteknikker enda bedre.