PHP-guide

3. Fördjupning
3.1 Om-satser igen
3.2 Inbyggda variabler
3.3 Formulär
3.4 Inkludera filer
3.5 Praktiska funktioner
3.6 Enkel filhantering
3.7 Alernativ till if
3.8 Katalog- och fillistning
__________________________

3. Fördjupning

Som du kanske har listat ut så är dessa kunskaper knappast tillräckliga för att göra lite större projekt utan bara enkla, tråkiga, script som vi som användare inte kan påverka. Här i fördjupning går jag igenom lite hur man skapar interaktivitet, dvs hur man får surfaren att kunna göra saker så att sidan han besöker ändras (en gästbok t ex).


3.1 Om-satser igen

Nu tar jag upp dessa igen, varför då? Jo, det finns mer att lära sig om dem. Först och främst så kan man kombinera olika påståenden.

<?php
$namn 
"Tomas";
$humor "Glad";
if ((
$namn == "Tomas") && ($humor == "Ledsen"))
{
    echo 
"Tomas är inte glad";
}
?>

Nu måste båda påståendena stämma för att den ska skriva ut texten. De extraparanteserna jag la in behövs inte men jag gjode det för att skapa lite mer struktur, gör som du vill med dem.

Det är dubbla och-tecken du ser (&&) där imellan påståendena, det betyder att båda måste stämma för att summan ska stämma. Det kallas AND av logiska skäl. Skulle du skriva två stycken lodräta streck (||, Alt Gr + knappen till vänster om Z) så blir det OR, dvs det räcker med att den ena av dem stämmer för att uttrycket ska gälla. Slänger du in ett utropstecken framför en av de extraparanteserna så inverterar det påståendet.

<?php
$namn 
"Tomas";
$alder 18;
if ((
$namn == "Tomas") && !($alder 18))
{
    echo 
"Namnet är Tomas och han är inte under 18";
}
?>

Tilldelning kan också göras direkt i en if-sats. Deta hela fungerar att det man tilldelar med vandrar bakåt bland paranteserna.

<?php
if ($envar = ($annanvar = ($tredje 7)))
{
    echo 
"$envar$annanvar och $tredje blev tilldelade 7";
}
?>

Om vi utvecklar varje parantes.

<?php
if ($envar = ($annanvar = ($tredje 7)))
{
    echo 
"$envar$annanvar och $tredje blev tilldelade 7";
}

if (
$envar = ($annanvar 7))
{
    echo 
"$envar$annanvar och $tredje blev tilldelade 7";
}

if (
$envar 7)
{
    echo 
"$envar$annanvar och $tredje blev tilldelade 7";
}

if (
7// Och eftersom 7 inte är falskt så går den vidare
{
    echo 
"$envar$annanvar och $tredje blev tilldelade 7";
}
?>

Notis: Ett litet fiffigt knep för att slippa leta efter fel så mycket är att alltid skriva konstanten (sträng, siffra, osv) till vänster då PHP kommer skriva ut att det blir ett fel om man glömmer ett =.


3.2 Inbyggda variabler

Det finns en mängd olika inbyggda variabler som man kan kolla i för att få reda på hur webbservern är konfigurerad. För att visa allihopa räcker det med att köra den enkla funktionen phpinfo() och vips så skriver den ut allt fint och prydligt.

Andra variabler som inte står där är $_GET, $_POST och $_REQUEST. Du kanske har sett att vissa sidor har lite skum adress? T ex www.ensida.se/fil.php?sida=7 eller något liknande. Det där efter frågetecknet hamnar i listan $_GET. Om vi använder den andressen så kommer $_GET att innehålla en nyckel med namn sida och den har värdet 7.

<?php
if ($_GET["sida"] == "7")
{
    echo 
"Sida är 7 eller något";
}
else
{
    echo 
"Den är något annat eller inget alls";
}
?>

Vill man ha flera värden så separerar man dem med ett &, alltså ger www.ensida.se/fil.php?sida=7&namn=Tomas&varde=18 $_GET["sida"] == 7, $_GET["namn"] == "Tomas" och $_GET["varde"] == 18.

Listan $_POST används på nästan samma sätt, skillnaden är att den används för formulär (se 3.2) och därför syns den inte heller i adressfältet. $_REQUEST är båda dessa kombinerat, varför man ska använda $_REQUEST är fortfarande en gåta för mig.


3.3 Formulär

Har du någon gång skrivit i en gästbok eller på ett forum? Då är det med 99% säkerhet att du har använt ett formulär. Jag går inte in så noga på hur ett formulär är uppbyggt här utan tar bara det allra simplaste.

<form action="fil.php" method="post">
<input type="text" name="textbit"><br>
<input type="submit" value="Klick">
</form>

Med detta formulär så kommer en textruta och en knapp visas. Trycker man på knappen skickas man vidare till 'fil.php' där det man skrev in hamnade i $_POST. Skulle jag skrivit in method="get" så skulle de hamnat i adressfältet och därmed i $_GET istället.

För att läsa av textrutan som finns i det förra exemplet så tittar man i $_POST["textbit"].

<?php
echo "Du skrev: " $_POST["textbit"];
?>

3.4 Inkludera filer

Att inkludera filer menas att man stoppar in en annan fil i dokumentet när någon går in på sidan. Säg att du har en fil (index.php) som innehåller följande.

<?php
$variabel 
"Jaha";
include(
"fil.php");
echo 
$variabel;
?>

Och att du har en annan fil (fil.php) som innehåller

<?php
$variabel 
"Jo men visst";
?>

Går du sen in på index.php så kommer den börja läsa fil.php när den kommer till include-raden, och därmed ändra $variabel till "Jo men visst". På det sättet kan man hålla lite inställningar och liknande i en annan fil och bara inkludera den till alla sidor man vill ha inställningarna på.

Ett annat användningsområde med include() är att du gör layouten på sidan i index.php och sen har en if-sats för att se vilken sida som ska visas och inkluderar den. Kolla i praktiska exemplerna för att se hur man kan göra.


3.5 Praktiska funktioner

count()

Denna funktion kollar hur många värden det finns i en lista.

<?php
$lista
[] = "Hej";
$lista[] = "på";
$lista[] = "dig";
echo 
"Antal värden: " count($lista);
?>

Med hjälp av den så kan man loopa igenom alla värden i en lista (i en for-loop).

implode()

Används för att stoppa ihop en lista till en vanlig variabel.

<?php
$lista
[] = "Hej";
$lista[] = "på";
$lista[] = "dig";
$text implode(" "$lista);
echo 
$text;
?>

Den första parametern, där jag valde att ha ett mellanrum, säger om man ska separera värderna med något. Nu kommer den stoppa ihop alla värden till en sträng och lägga in ett mellanrum mellan alla värden.

explode()

Denna gör raka motsatsen till implode(), den plockar isär en sträng och gör till en lista.

<?php
$text 
"Hej på dig";
$lista explode(" "$text);
echo 
$lista[2] . $lista[1] . $lista[0];
?>

Första parametern här är vilket tecken den ska dela upp strängen med.

substr()

Den plockar ut delar av en sträng. Du får välja var den ska börja plocka ut och hur långt den ska plocka.

<?php
$text 
"Hej på dig";
echo 
substr($text27);
?>

Andra parametern är var den ska börja plocka ur, notera att första tecknet är nummer 0. Är startparametern negativ så räknar den bakifrån. Sista parametern är hur lång sträng den ska plocka ut. Följande exempel tar de tre sista bokstäverna i strängen.

<?php
$text 
"Hej på dig";
echo 
substr($text, -33);
?>

htmlspecialchars()

Om man behöver omvandla specialtecken (så som <>&()[] osv) för att de inte ska förstöra sidan om man ska visa dem senare, t ex om man har en gästbok och vill att gästerna ska kunna skriva in sådana tecken i gästboken utan att sidans layout ska förstöras.

<?php
$text 
"Detta kan förstöra layouter. </body></html>";
echo 
htmlspecialchars($text);
?>

Men med hjälp av htmlspecialchars() så omvandlas de till speciella teckenkoder för att se ska bli synliga. Faktum är att när jag skrev kodsnutten ovan så använder jag dessa teckenkoder för att ni ska se taggarna. För att skriva ut <br> så behöver jag skriva &lt;br>. Jag behöver inte omvandla > eftersom webbläsaren inte hittar någon startklammer.


3.6 Enkel filhantering

Ska man göra roligare script måste man veta hur man läser/skriver till filer. Det är väldigt simpelt att läsa filer, och lite mer komplicerat att skriva i dem.

file()

Denna funktion tar en parameter och det är sökvägen till filen. Skriver du bara in filnamnet kollar den i samma katalog som scriptet ligger i. Det funktionen ger är en lista med innehållet i filen, ett värde för varje rad.

<?php
$rader 
file("fil.txt");
echo 
"Första raden: " $rader[0] . "<br>Andra raden: " $rader[1];
?>

Vill man slå samman raderna helt plötsligt kan man då använda sig av implode() som jag förklarade om här innan. Man får då välja "\n" (radbrytning, som när du trycker enter) som avgränsare då allt kommer att hamna på samma rad annars. Men ska du från början ha allting i en sträng istället för en lista så bör du använda dig av file_get_contents(), enda skillnaden mot file() är att den ger en sträng istället för en lista.

fopen(), fwrite(), fclose()

Som jag sa så är det lite mer komplicerat att skriva till filer, men inte överdrivet. Konceptet är ganska enkelt, först öppnar man filen så man får tillgång till den, sen skriver man och till slut stänger man filen. Inte svårare än det.

<?php
$fil 
fopen("fil.txt""w");
fwrite($fil"Goddag");
fclose($fil);
?>

Funktionerna är bra namngivna så jag behöver inte förklara vilken som gör vad. Första parametern till fopen() är filnamnet på filen som ska öppnas, svaret från fopen() måste du lagra i en variabel så att andra funktioner (som fwrite() och fclose()) kan veta vilken fil det rör sig om. Du kan alltså ha massor av filer öppna samtidigt om du vill. Andra parametern är vilka rättigheter man vill ha till filen. Det är dessa som kan vara lite svårt att memorera. Här listar jag upp de rättigheter som används (finns en till, dock ser jag ingen mening med den).

"r" Läsa från början av filen.
"r+" Läsa/skriva från/till början av filen.
"w" Skriva till början av filen. Finns filen redan så töms den, finns den inte så skapas den.
"w+" Läsa/skriva från/till början av filen. Finns filen redan så töms den, finns den inte så skapas den.
"a" Skriva till slutet av filen. Finns inte filen skapas den.
"a+" Läsa/skriva från/till slutet av filen. Finns inte filen skapas den.

Första parametern till fwrite() är vilken fil det rör sig om, andra är vilken text som ska skrivas till filen.

Den enda parametern till fclose() är vilken fil som ska stängas. Vill du hålla på med den filen igen får du öppna den igen.

feof(), fread(), fgets()

Man kan också läsa från filerna på samma sätt som man skriver till dem, alltså att inte hämta hela filen direkt med file() utan bara vissa bitar.

<?php
$fil 
fopen("fil.txt""r");
while (!
feof($fil))
{
    echo 
fread($fil1024);
}
fclose($fil);
?>

Nu finns det lite olika sätt att läsa från filen, i detta fall använder jag fread(). Den första parametern är vilken fil som den ska läsa ifrån och den andra är hur många byte som den ska läsa. feof() kollar om filpekaren (den som säger var i filen man befinner sig i sitt läsande/skrivande, den är automatisk och man behöver inte oroa sig för den) har nått slutet på filen, utropstecknet är som jag förklarade i 3.1 en invertering av svaret, dvs ger feof() falskt som svar så ändrar den det till sant. Så det som händer här är att while-loopen fortsätter så länge som scriptet inte har kommit till slutet av filen (kommer den till slutet ger feof() sant och utropstecknet ändrar till falskt och while-loopen slutar) och skriver ut 1024 tecken i taget.

fgets() är nästan likadan som fread(), skillnaden är att den avbryter sin läsning när den kommer till en radbrytning, vilket inte fread() gör. Så vill du läsa en rad i taget så tar du och använder fgets() och sätter längden på ett högt tal, sätter du inget tal används 1024 som default.


3.7 Alternativ till if

Istället för att använda massor av if/elseif som nästan har samma påstående så kan man använda switch/case istället. Går fortare att skriva och ger lite prydligare kod, men annars är det ingen skillnad.

<?php
$namn 
"Tomas";
switch (
$namn)
{
    case 
"Olle":
        echo 
"Olle var namnet";
        break;
    case 
"Tomas":
        echo 
"Tomas här";
        break;
    default:
        echo 
"Något annat namn";
}
?>

Du får själv bedömma om du tycker det är användbart/lättare än att köra många elseif, är en smaksak.

Notis: Kom ihåg att lägga in break; i slutet av din case-del. Gör du inte det kommer PHP att fortsätta läsa på nästa rad. Detta kan givetvis utnyttjas om du vill att samma kodbit ska köras om $namn är "Olle" och "Tomas" genom att skriva:
case "Olle":
case "Tomas":
    echo "Namnet var antingen Olle eller Tomas";
    break;


default-delen körs om något av de andra case-delarna inte kördes.


3.8 Katalog- och fillistning

Att lista upp filer och kataloger är en relativt enkel process som består av att man först öppnar en katalog, och sen läser av den fil för fil (kataloger också), lättast är att använda en while-loop för det.

<?php
$katalog 
opendir("mapp");
while (
$fil readdir($katalog))
{
    echo 
$fil "<br>";
}
?>

opendir() öppnar en katalog, i det här fallet "mapp". Om man skickar variabeln man lagrade resultatet från opendir() till readdir() så svarar den med ett fil/katalognamn. Nästa gång readdir() körs så tar den nästa fil/katalog, osv. När det inte finns några filer kvar så svarar den med en tom sträng vilket while-loopen reagerar på och avslutas. För att kunna separera filer och kataloger så kan man använda sig av funktionen is_dir().

<?php
$katalog 
opendir("mapp");
while (
$fil readdir($katalog))
{
    if (
is_dir($fil))
    {
        echo 
"Katalog: ";
    }
    echo 
$fil "<br>";
}
?>