Datakurser
Aktuell vecka: 48

Tillbaka till toppen

PHP Grunder

Vad är PHP

Idag står PHP för "PHP: Hypertext Preprocessor".
PHP är ett webbserverbaserat skriptspråk. Koden(filen) som skickas till webbservern interpreteras av serverns och sluprodukten blir en html-webbsida. För att detta ska fungera så måste webbserveradministratören installera PHP på servern. Du programmerar filer som skickas upp till servern. När någon sedan anropar din php-sida, så körs koden och den bygger ihop en html-sida som skickas tillbaks till den som ropade på din sida. I slutet på 90-talet lanserades PHP. Detta är "Back-end" programmering medan när vi skapade färdiga sidor med HTML-CSS-Javascript är "Front-end" skapande.
PHP är fritt att ladda ner och använda, bara vi följer "PHP License".
Andra språk som gör samma sak är Microsofts ASP och Sun's JSP(Java Server Pages).

PHP anses vara enkelt att lära och lätt att arbeta med men ändå kraftfullt. Du som har programmerat i Javascript, C/C++, C# eller Java känner igen all grundläggande struktur. Från och med PHP version 5 så ges även stöd för objektorienterad programmering.

Hur fungerar PHP

Delavsnitt

Grunder
Variabler
Villkor - If, Else
Switch
While och For
Array (Vektor, Fält)
Flerdimensionella arrayer

Alla exempel på denna sida

Grunder

Här kommer vi att börja med grundläggande PHP, lite hur det fungerar, variabler, villkor, loopar och lite om arrayer.

Till att börja med så är PHP inget som ersätter HTML och JavaScript utan ett språk som används för att skapa sidor uppbyggda av HTML och JavaScript. Detta sker här redan vid själva anropet av sidan på servern. PHP används för att skapa webbsidorna.

Ytterligare en skillnad är att en browser aldrig ser röken av PHP-koden, istället tolkar din webbserver php-koden och skickar den resulterande HTMLkoden till browsern. HTML/JavaScript-koden tolkas av din browser. PHP körs på servern medans HTML/JavaScript körs i webbläsaren på klientsidan.

Varför vill man använda PHP? T ex vill man skapa sidor som beror på vissa indata som användaren skickat när man ropar på en webbsida. Vill man lagra eller hämta information i en databas så passar PHP utmärkt. T ex en enkel besöksräknare.

Du ska självklart använda HTML5-standard. Nedan i exemplen skrivs vissa taggar något förenklade och utan doctype.
Du separera givetvis stilmall och javascript från html-filen(i största möjiliga mån). Stilmallen länkas in med link och attributet href, javascript med script och attributet src.

Enklaste möjliga HTMLsida(demo1.htm):

 <html>
  <head>
  <title>Demol</title>
  </head>
  <body>
  Hej och välkommen till PHP!
  </body>br>
  </html>
  

Motsvarande sida kan även skrivas med ren php-kod (demo1a.php, observera att så fort vi använder minsta lilla php-kod i filen så döper vi filen till *.php och skickar den till servern för att kunna testköra den):

  <?php
  //hela filen som php-kod
  echo "<html>";
  echo " <head>";
  echo " <title>Demo1</title>";
  echo " </head>";
  echo " <body>";
  echo " Hej och välkommen till PHP-kursen!";
  echo " </body>";
  echo "</html>";
  ?>

eller så kan bara en del av filen skrivas med php-kod (demo1b.php):

<html>
<head>
	<title>Demo1</title>
</head>
<body>
	<?php
	//en del av filen som php-kod 
	echo "Hej och välkommen till PHP-kursen!";
	?>
</body>
</html>

Det sista exemplet är det som kommer användas mest och det är just blandningen av vanlig HTML-kod och PHP-kod som är det effektivaste sättet.

Har du programmerat bara lite i C(C++, Java) förut så känns det ganska bekant eller hur?
Då bryter jag ned koden i bitar och förklarar den för er.
"<?php" aktiverar php-språket, så länge du inte skriver den motsatta taggen "?>" så är det PHP som gäller, inte HTML. Observera att vi befinner oss på serversidan och slutresultatet är en vanlig HTML-fil som skickas till webbläsaren.
Vi kan starta och stoppa PHP i en och samma fil hur många gånger som helst.
Hittills har vi bara använt ett php-kommando, echo. Echo skriver helt enkelt ut vad som finns mellan citationstecknen.

De tidigare kodexemplen gör PHP egentligen ingenting som HTML inte hade kunnat göra och är egentligen fullständigt onödigt. ;-)

Utskrift

Kommandon för att skriva ut från PHP är echo eller print. Det är en marginell skillnad mellan dessa. Vi går inte in på detta för vi kommer inte utnyttja detta i kursen. Vill du veta mer se w3schools eller php.net . Echo kan även skrivas med parentes efter echo (...) men vi kör den enklaste varianten.

<?php
echo "Hej svejs!";
?>

//Kortare skrivsätt för echo

<?= "Hej svejs!"; ?>
Hej svejs!

//Kortare skrivsätt för echo

Hej svejs!

Kommentarer i koden

Enradskommentarer skrivs med två snedstreck, // .
Flerradskommentarer startar med snedstreck stjärna, /* , och avslutas tvärtom, */ .
Enradskommentarer kan också skrivas med # istället för // men vi undviker denna variant i kursen då det krockar med en specialskriven kod senare i kursen.

Ställ in så alla felmeddelanden alltid skrivs ut

När vi utvecklar och lär oss så vill vi ha så mycket information om alla fel som det bara går. I drift så kanske man vill dölja vissa utskrifter.
Lägg koden högst upp i din sida.

<?php
error_reporting(-1); // Report all type of errors
ini_set('display_errors', 1); // Display all errors
ini_set('output_buffering', 0); // Do not buffer outputs, write directly
?>


<!DOCTYPE html>
<html lang="sv">
<head>
...
...

Första raden är en PHP-funktion som säger att alla typer av felmeddelande ska visas. -1 är samma sak som E_ALL, det vill säga alla fel/varningar/notiser.
Andra raden anropar en funktion som ber PHP att skriva ut felmeddelanden och inte dölja dem.
Tredje raden säger till PHP att inte lagra informationen och skriva ut senare utan att skriva ut så fort som möjligt. Det är bättre att alltid ha koll på felen.

Öva dig i att läsa felmeddelandena, oftast får vi bra tipps om vad som krånglar, de säger vilken fil och radnummer som du ska börja leta på. Det är en övningssak att rätta felen när de dyker upp, börja alltid med det översta felet och rätta det först. Ibland är en del av resterande fel så kallade följdfel, de beror av det första felet och försvinner när du rättat det.

Variabler

En variabel kan ses som en behållare/låda som innehåller någonting.

En variabel i PHP identifieras av ett dollartecken, $, framför variabelnamnet.
Variabelnamn kan innehålla både siffror och bokstäver, men får inte börja med en siffra. (Även _ [underscore] fungerar men inte mellanslag.)
OBS! Stora och små bokstäver är olika bokstäver. $hej är inte samma som $Hej .

Använd beskrivande namn, $summa, $radie och $bankRanta är mycket mer beskrivande än $a, $b och $x;
En god programmeringssed är att vi använder gemener (små bokstäver) för att namnge variabler. Väljer vi att skapa längre variabelnamn som är sammansatta av flera ord så använder vi CamelCase ($namnPaLangVariabel) eller använder oss av underscore ($namn_pa_lang_variabel).

Se följande exempel:

<?php
//olika variabler
$mintext = "Hej och välkommen till PHP-kursen!";
$sifferexempel = 100;
$text2 = "gånger";
echo "$mintext $sifferexempel $text2";
echo "<br><br>";
echo $mintext." ".$sifferexempel." ".$text2;
//utskrift med enkelfnuttar
echo 'Utskrift med enkelfnuttar: $mintext $sifferexempel $text2';
?>

Vill du spara textsträngar i en variabel får du använda citationstecken som i exemplet, vill du däremot spara t.ex. värdet 100 i en variabel behövs det inte.

Till sist matar vi ut innehållet i variablerna på två olika sätt. Det första anger variablerna i en textsträng, då plockas innehållet i variablerna och ersätter själva variablerna i textsträngen. Det andra sättet kopplar ihop innehållet i variablerna (med punkt mellan varje del). För att få mellanrum så måste vi lägga till en textsträng som innehåller blanksteg. Echo-kommandot i mitten matar ut textsträngen "<br><br>" vilket blir <br><br> i html-sidan som skickas iväg, dvs två radbrytningar.

Skillnad i utskriften med apostrofer och citattecken

OBS! Att skriva ut variabler i en textsträng fungerar då vi använder citattecken, dvs dubbelfnutt. Med enkelfnutt (apostrof) kan vi också skriva ut text men men variabler översätts inte till dess innehåll utan all text skrivs ut exakt som den ser ut i strängen.
Det vill säga följande rad,

echo 'Utskrift med enkelfnuttar: $mintext $sifferexempel $text2';

skriver ut:

Utskrift med enkelfnuttar: $mintext $sifferexempel $text2

medan följande rad:

echo "$mintext $sifferexempel $text2";

skriver ut:

Hej och välkommen till PHP-kursen! 100 gånger

Datatyper

De fyra vanligaste datatyperna är integer, float, string och boolean. I ovanstående exempel använder vi två string och en integer.
En integer är ett heltal, en float är ett tal med decimaler, en string är en textsträng och en boolean kan bara ha två värden, sant eller falskt (TRUE, resp. FALSE).

Datatyper är en viktig sak inom programmeringen. Alla variabler (och konstanter) som programmet skall hålla reda på har en datatyp. Det är datatypen som avgör vad man kan göra med just den typen av variabel. Det går att räkna med tal men inte med strängar osv. För användaren verkar det som att PHP inte använder datatyper men skillanden mot de flesta andra språk är att PHP själv håller koll på vilken datatyp en viss variabel har.
Om vi jämför med Java, C++ eller C# så talar vi om vid skapandet att en specifik variabel har en specifik datatyp och sedan kan det inte ändras när programmet körs. I PHP så har en viss variabel en bestämd datatyp vid ett enskilt tillfälle men den kan ändra datatyp lite senare. Precis som i Javascript. PHP-tolken tar själv hand om vilken datatyp som är lagrad i variabeln. Det stora problemet uppstår för oss som användare som också måste hålla koll på vilken datatyp som finns lagrad i variabeln. Beroende på vad vi vill använda variabeln till så behöver vi ibland kolla att den har rätt datatyp, annars kommer applikationen inte att göra som vi förväntar oss.

De datatyper som finns i PHP är:
bool - boolean, har värdet sant eller falskt, true eller false.
int - lagrar heltal.
float - lagrar decimaltal.
string - lagar textsträngar.
array - en samling av värden.
objekt - en datatyp som representerar en grupp av variabler och metoder som hör ihop.
null - en variabel som inte har något värde alls, två variabler med värdet NULL är inte lika.
resource - variabeln innehåller en referens till någonting, tex ett databasanrop.

Vill du läsa mer och se exempel på de olika datatyperna så finns det bra info på w3schools - datatyper.
Trots att PHP inte skriver ut vilken datatyp en viss variabel har så är det viktigt att du har koll på vad variabeln innehåller för att du skall kunna använda den på rätt sätt.

Den inbygda funktionen var_dump()

Funktionen var_dump() är en ypperlig funktion för felsökning. Den skriver ut variabelns innehåll och dess typ, så som det uppfattas av PHP.

<?php

$inget = null;
$mintext = "Hej";
$decimaltal = 3.14;
$heltal=123;
$sant=true;

echo "<pre>";
var_dump($heltal);
var_dump($decimaltal);
var_dump($mintext);
var_dump($inget);
var_dump($sant);
echo "</pre>";
?>

Variabler är otypade, dvs typen anpassar sig efter vad som stoppas in i den.

Decimaltal skrivs med punkt.

<?php
/* olika variabler, decimaltal med punktnotation,
obs! otypade, dvs anpassar sig efter värde */

// Vi tilldelar alla variabler ett värde.
// Om vi vill skapa en variabel som inte har något värde ännu, så tilldela det värdet null.
// Null är ett specialvärde som innebär ingenting.
$inget = null;

$mintext = "Hej";
$ett_tal = 3.14;
echo "Variablerna mintext och ett_tal : $mintext $ett_tal";
echo "<br><br>";
$mintext = $ett_tal;
$ett_tal = "Tjena";
echo "Variablerna mintext och ett_tal :-) $mintext $ett_tal";

echo "<br><br>";
echo "Variabeln inget: $inget";
?>

If, Else

En if-sats utför en jämförelse mellan två variabler, eller en variabel och ett värde.
Se följande exempel;

<?php
$variabel = 77;
$buu=true;
if($variabel == 77) {
	echo "Variabeln är 77";
} else {
 	echo "Variabeln är inte 77";
}
if(buu) {
echo "BUU";
} else {
	echo "inget buu";
}
?>

Scriptet utför följande;
Först sätter scriptet variabeln $variabel till siffran 7, efter det utför den en jämförelse med hjälp av en if-sats. Först kollar scriptet om $variabel är lika med 77, stämmer detta så utför scriptet vad som nu finns mellan måsvingarna. I detta fallet skriver den ut texten "Variabeln är 77".
Else fungerar som en slags komplettering för if, den utför någonting om if-satsen ovanför inte skulle stämma. Om $variabel hade varit 99 hade vad som finns mellan måsvingarna i else-satsen skrivits ut, i det här fallet "Variabeln är inte 77".

Om du vill kontrollera om två saker är identiska så använder du dubbla lika-med tecken, men du är inte begränsad till att jämnföra likhet, se följande tabell med jämförelseoperatorer:
== Lika med
!= Inte lika med
=== Lika med och av samma typ
!== Inte lika med men av samma typ
<= Mindre eller lika med
>= Större eller lika med
< Mindre än
> Större än

&& betyder OCH (villkoren på båda sidorna måste vara TRUE för att generera slutresultatet TRUE)
|| betyder ELLER (något, eller båda, av villkoren på båda sidorna måste vara TRUE för att generera slutresultatet TRUE)

Ett litet exempel där man använder både OCH och ELLER:

<?php
  if (($myvariable > 5 && $myvariable < 10) || $myvariable == 1)
  {
      echo "Yaabadabadooo";
  }
?>

Switch (*för den som behärskar if-satser bra)

Om vi har många villkor som ska testas, t ex att kolla ett svar från en meny, så kan switch-satsen vara mycket användbar. Här ett exempel:

<?php
switch ($myvariable)
{
case 1:
print "One";
break;
case 2:
print "Two";
break;
case 3:
print "Three";
break;
default:
print "Other number";
}
?>

Den här kollar $myvariable och skriver"One" om värdet är 1, "Two" om värdet är 2, "Three" om värdet är 3 och "Other Number" om det är något annat ("default" alternativet). Men varför alla dessa "break"? Jo, det stoppar genomgången av switch-satsen och hoppar ur den!

Om vi skulle skriva utan break-satser, kommer den uppföra sig annorlunda. T ex så här:

<?php
switch ($myvariable)
{
case 1:
print "One";
case 2:
print "Two";
case 3:
print "Three";
default:
print "Other number";
}
?>

Så om värdet i $myvariable är 2. Vad kommer att hända? Den kommer skriva ut: "TwoThreeOther number". När vi inte skriver dit "break" kommandot så kör den alla case-satser som ligger efter den som stämmmer.

While och For

Ett while-block utför även den en jämförelse, men inte riktigt på samma sätt som ett if-block.

<?php
$nuffra = 10;
while($nuffra >= 4) {
echo "$nuffra <br>";
$nuffra = $nuffra-1;
}
echo "Klar";
?>

Följande kod borde vara ganska enkel att förstå. Först sätts variabeln $nuffra till värdet 10, efter det kommer ett while-block som säger att så länge $nuffra är större än värdet 4 så ska vad som finns mellan måsvingarna utföras. 10 är som bekant större än 4 så programmet kommer utföra vad som finns mellan måsvingarna. Den skriver ut värdet i $nuffra, vilket är 10, och drar sedan bort 1 från $nuffra. $nuffra är nu 9. 9 är större än 4 så vad som finns mellan måsvingarna utförs igen. Scriptet kommer fortsätta så här ända tills $nuffra är 3, vilket inte är lika med eller större än 4. Då skrivs texten "Klar".

<?php
for($i = 1; $i <= 12; $i++) {
echo "Hej nr. $i <br>";
}
?>

Här demonstreras ett for-block. Kortfattat säger ovanstående kodstycke: "Sätt $i till ett, Medan $i är mindre eller lika med 12 så utförs vad som finns mellan måsvingarna, när ett varv är klart ökas $i med ett."
Just $i++ betyder "öka med ett". Ett $i-- betyder "minska med ett" och det hade gått lika bra med $fnuffra = $fnuffra-1 som $fnuffra-- i while-exemplet.
Resultatet av ovanstående kommer se ut som så här:
Hej nr. 1
Hej nr. 2
Hej nr. 3
Hej nr. 4
...
Hej nr. 11
Hej nr. 12

Array (Vektor, Fält)

En array är en slags variabel, fast den kan innehålla flera värden samtidigt. Du kan se det så här, en variabel är en hylla med en låda, du lägger precis vad du vill i den lådan. En array är en hylla med flera lådor. Du kan lägga en siffra i en låda, en text-sträng i ett annan låda, men det är fortfaranda samma hylla. Se följande:

<?php
$minarray[0] = 6;
$minarray[1] = 8;
$minarray[2] = -3;
$minarray[5] = 5;
?>

Variabeln heter $minarray, men nu har vi deklarerat 4 st lådor, som är numrerade 0, 1 och 2 och 5, lite irrationellt men fullt möjligt. Dessa innehåller ett värde var.
En enkel introduktion av array i PHP. Det här kommer garanterat vara användbart. I samband med att man använder arrayer så finns det ett antal färdiga funktioner att använda t ex count(), se nedan.

$antal = count($minarray);

Loopar är perfekt att använda för skriva ut eller bara stega igenom en array:

for ($i = 0; $i<$antal; $i++) {
echo $i . ' : ' . $minarray[$i] . '<br>';
}

En ännu bättre loop som alldeles själv går igenom befintliga element i arrayen är foreach-loopen

foreach ($minarray as $i => $val) {
echo $i . ' : ' . $val . '<br>';
}

Om vi inte hade varit intresserade av själva index-värdet i arrayen så hade foreach uttrycket blivit ännu enklare.
foreach ($minarray as $val) , dvs kör igenom arrayen och plocka ut samtliga värden och lägg dessa succesivt i variabeln $val.

Även var_dump() fungerar om vi bara vill "dumpa ut" hela arrayen och dess innehåll. Även den "print_r()" som skippar typerna och gör det lite mer läsbart.

echo "<pre>" . print_r($minarray, true) . "</pre>";
echo "<pre>" . var_dump($minarray) . "</pre>";

En häftig finness i PHP är möjligheten att använda textsträngar istället för ett numrerings index för att komma åt lådorna. Så, istället för $minarray[0] och $minarray[1] kan du skriva $minarray['namn'] och $minarray['adress']. Mer i boken om detta om du kan allt annat!

<?php
$minarray['namn'] = "Kalle Anka";
$minarray['adress'] = "Ankeborg";
?>

Flerdimensionella arrayer

Ibland kan ju tvådimensionella arrayer vara användbart. Här en mix av ovanstående två möjligheter till indexering:

<?php
$books[0]['name']=""Mickey Mouse";
$books[0]['price']=9.00;
$books[1]['name'] = "Donald Duck & Co";
$books[1]['price'] = 12.99;

foreach($books as $onebook) {
echo $onebook['name'] . " sells for $". $onebook['price'] . "<br>\n";
}
?>

Källor, referenser, bra länkar

Wikipedia: PHP
w3schools.com/php/
dbwebb.se, php på 20 steg

PHP tutorial Svenska, 38 avsnitt

Utvecklingsmiljöer

Labbservern

PHP 7.2, MariaDB 5.5 och Apache 2.4.6

Laragon

Apache 2.4, MySQL 5.7, PHP 7.4

Lösningsförslag

Alrik's