Visar inlägg med etikett skript. Visa alla inlägg
Visar inlägg med etikett skript. Visa alla inlägg

02 juni, 2009

Programmering: PHP för riktiga nybörjare - Del 2

Artikelserien är tillägnad min bror

Förord
Detta är del 2 i min artikelserie om PHP för riktiga nybörjare. Mitt mål är att försöka lära ut PHP till så många som möjligt och berätta på ett så enkelt och lättläst sätt som möjligt. Om något är oklart för er så tveka inte att skriva en kommentar och berätta vad ni tycker är bra och/eller mindre bra.

Delar i artikelserien
Lista med alla delar i artikelserien [6]

Vad vi kommer att gå igenom
  • Olika typer av variabler
  • Ingående om talsystem
  • Omvandla från en variabeltyp till en annan
Introduktion
I del 1 gick vi igenom de första stegen mot ett första PHP-skript, vad kommentarer används till, hur man lagrar data i s.k. variabler, lite grundläggande om text och siffror och hur man visar text på en webbsida.

I denna delen kommer jag beskriva de olika typer av variabler som finns samt hur man omvandlar data från en typ till en annan. Det kan vara rätt svårt att ta till sig allt första gången så läs gärna igenom artikeln flera gånger.

Olika typer av variabler
Vad är en datatyp för något?
I del 1 sade jag att en variabel är en slags kakburk som kan innehålla olika typer av kakor med olika smak och storlekar. En kaka i detta fallet är data som du som programmerare vill spara någonstans för att sedan göra saker med den. Man kan säga att en datatyp i PHP är vilken smak kakan har.

Kom ihåg nu att i alla framtida artiklar, inklusive den du läser nu, så är det variabler jag berättar om och inte kakor. Det är bara för att ni skall förstå lite bättre.

Exempel på datatyper
En variabel (kaka) kan vara en av följande typer. Notera att den engelska betäckningen står inom parentes.
  • Heltal (integer)
  • Decimaltal / Flyttal (float, double)
  • Boolesk: Sant eller falskt (boolean)
  • Sträng: Vanlig text (string)
  • Vektor: Lista som innehåller en eller flera datatyper vilka kan vara likadana eller olika (array)
  • Resurs: Koppling till resurser som t.ex databaser, filer, nätverksanslutningar m.fl (resource)
  • Objekt: Samla verktyg och egenskaper i ett s.k. objekt för att skapa mer återanvändbar kod (object)
Datatyperna Resurs, Vektor och Objekt är svåra att förstå och begripa så därför kräver de en ny artikel var för sig.

Överkurs
Datatypen Objekt är överkurs så jag kommer endast visa principen och några mycket enkla exempel i en framtida artikel.

Datatyper i andra programmeringsspråk
I andra programmeringsspråk så används datatyperna på ett mer låst sätt. Man kan inte göra hur som helst. Vill man skapa en variabel som man vet kommer innehålla en viss typ av data, måste variabeln deklareras först. Det betyder att man väljer datatypen först och sedan får den inte ändras. Men den kan ändras men då måste man använda andra lite svårare tekniker.

Datatyperna i PHP
I PHP omvandlas variablerna automatiskt till den datatyp som datan har när den sparas i variabeln. Om en variabel innehåller text får den datatypen "string" men om man sedan sparar några heltal i samma variabel, omvandlas datatypen automatiskt till "integer".

Det finns både för- och nackdelar med detta men jag tycker det är skönt att slippa tänka på vilka typer av variabler man använder i sin kod. Man behöver bara kontrollera data bättre för att det inte ska bli fel. Man måste även kontrollera data bättre i andra programmeringsspråk för att slippa få komplicerade fel och s.k. undantag.

Heltal
Heltal heter på engelska "integer".

Positivt och negativt

Heltal i PHP är tal/siffror som kan vara antingen positiva (+) eller negativa (-). Man använder de precis som man gör i vanlig matematik i skolan.

Nybörjartips
Ni behöver egentligen bara koncentrera er på människans talsystem i första hand. Ni kan hoppa över de andra talsystemen. De andra beskriver jag endast eftersom jag tror det finns några som vill känna till de andra talsystemet i alla fall.


Människans talsystem basen 10
Vi människor har ett talsystem från 0 till 9. Man säger att vårt talsystem har basen 10 (0 1 2 3 4 5 6 7 8 9). Vi kan alltså beskriva tal med 10 olika siffror. Det finns även andra sätt att representera heltal vilka beskrivs här nedanför.
Exempel:
10, 27, 10254, +56, +79, -62, -2, -9
Datorernas talsystem basen 2
Datorer använder basen 2 (0 1). Här får vi bara använda siffrorna 0 (noll) och 1 (ett). De kallas för binära tal.
Exempel:
101, 10010110101, 11110, 11010, 0, 1
Program och utveckling basen 16
Ett vanligt sätt att beskriva stora tal är med basen 16 i det s.k. hexadecimala talsystemet från 0 till 9, sedan från A till F (0 1 2 3 4 5 6 7 8 9 A B C D E F). Dessa tal används vanligen när man programmerar stora program och system med avancerade konfigurationer. Det är också vanligt när man arbetar med kryptering.

Ett hexadecimalt tal måste inledas med 0x eller 0X.
Exempel:
0x5, 0x2F, 0x694FA, 0x101
Oktala talsystemet basen 8
Jag har inga bra exempel på när det är bra att använda det oktala talsystemet med basen 8. Det är tal från 0 till 7 (0 1 2 3 4 5 6 7). Ett användningsområde jag känner till är i Unix/Linux när man behöver konfigurera behörigheter i filsystemet (läsa [4], skriva [2], köra [1]). Då får man tal som kan se ut så här: 777, 644, 500, 100.

För att arbeta med oktala tal i PHP måste de börja med 0 (noll).
Exempel:
0100, 08, 012, 029, 0777
Exempel i PHP med olika heltalstyper
Nu ska jag visa hur vi kan använda oss utav det jag precis har gått igenom.
<?php
// Exempel 1 på talsystem i PHP
$tal = 1234; // Positivt heltal basen 10
$tal = -1234; // Negativt heltal basen 10
$tal = 0x101FA; // Hexadecimalt heltal basen 16
$tal = 0777; // Oktalt heltal basen 8

// Binära heltal basen 2 måste skrivas som text
$tal = "10110"; // Binärt heltal basen 2
?>
<?php
// Exempel 2 på talsystem i PHP
$tal1 = 12;
$tal2 = 26;
$summa = $tal1 + $tal2;
echo $summa; // Skriver ut summan av 12 + 26 vilket är 38
?>
<?php
// Exempel 3 på talsystem i PHP
$tal1 = 0xFA2; // Hexadecimalt blir 4002 när 0xFA2 omvandlas till heltal basen 10
$tal2 = 1024; // Heltal basen 10
$summa = $tal1 + $tal2;
echo $summa; // Skriver ut summan av 4002 + 1024 vilket är 5026
?>
Heltal kan vara max 2147483647. Heltal som är större än det omvandlas automatiskt till decimaltal, eller flyttal som det även kallas.

Decimaltal / Flyttal
Decimaltal i PHP kallas även för flyttal och det är tal som kan bestå av decimaler (inte hela tal). Man separerar heltals- och decimaltalsdelen med punkt ( . ). Flyttal kallas även för "float", "double" och "real" i andra programmeringsspråk. I PHP hanteras de alla likadant.

Överkurs
Vill man ha högre precision när man beräknar data i PHP måste man använda ett s.k. bibliotek med kodverktyg som är anpassat för detta. Två exempel på bibliotek är BC Math [1] och GMP [2].

I PHP blir 1/3 = 0.333333333333 och floor( 0.1+0.8) * 10 ) blir 7 när det egentligen ska bli 8. [3]

Exempel på decimaltal
1.2 8.6 0.1 0.7
Här nedanför ser ni exempel på kod i PHP
<?php
// Använda decimaltal i PHP
$float1 = 1.2;
$float2 = 3.6;
$produkt = $float1 * $float2;
echo $produkt; // Skriver ut produkten 4.32 av multiplikationen 1.2 * 3.6
?>
Boolesk - Sant eller falskt
Boolesk heter på engelska "boolean" och är en datatyp som bestämmer att en variabel bara får innehålla värdet sant "true" eller falskt "false". Den datatypen är väldigt användbar när man vill styra programflödet i koden. Hur man styr programflödet kommer jag gå igenom i en framtida artikel.

Resultat från en uträkning eller ett resultat från ett verktyg eller funktion i PHP blir alltid sant eller falskt, även om resultatet är ett heltal.

0 (noll) i PHP är lika med falskt och alla tal under och över 0 är lika med sant.
Exempel
true = sant
false = falskt
-1 = sant (mindre än noll)
0 = falskt
1 = sant (större än noll)
Här nedaför kan ni se ett exempel på datatypen boolesk
<?php
// Test med boolean variabler
$bool1 = false;
$bool2 = true;
$bool3 = 1-2;
$bool4 = 0;

//
// Överkurs test
// - Kontrollera programflödet
//
if (bool4 == true) {
echo "sant";
} else {
echo "falskt";
}
?>
Sträng
En sträng i PHP är helt vanlig text. På engelska heter det "string". Ni kom i kontakt med denna datatyp i del 1. Då sparade vi texten "Patrik" i en variabel som vi döpte till "$variabel_3".

Strängar används väldigt ofta i PHP. Ett exempel på det är när man skickar data via formulär skapade med HTML/XHTML. Det är det man håller på med när man arbetar med webbdesign för er som inte vet vad HTML är för något.

För att skapa data i PHP som ska vara en text, sätter vi texten innaför apostrofer ( ' ) eller citationstecken ( " ).
Exempel
"Emelie", "Pelle", "Anna", 'Patrik', 'Erik', 'Fredrik'
Här nedanför kan ni se ett exempel med strängar
<?php
// Använda strängar i PHP
$text1 = "Pelle";
$text2 = "Anna";
$text3 = 'Waschman';
$text4 = '<b>detta visar html kod som omvandlas till fet stil</b>';
echo "Hej och välkommen $text1 !"; // Skriver ut texten: Hej och välkommen Pelle !
?>
En text kan innehålla variabler som i sin tur kan innehålla text, heltal eller decimaltal. I exemplet ovanför, omvandlas först variabeln $text1 till värdet den innehåller som är Pelle. Sedan läggs den texten in i texten runtomkring

För att förstå ännu bättre visar jag ett exempel till
<?php
// Använda olika sorters strängar i PHP
$namn1 = "Pelle";
$namn2 = "Erik";
echo "Du heter $namn1 !";
echo ' och din kompis heter $namn2 !';
?>
Apostrofer ( ' ) omvandlar inte variabler inuti texten. Men det gör däremot citationstecken ( " ).

Överkurs
Om man arbetar med mycket text i PHP och man får många besökare till sin webbsida som använder tjänsten så att PHP körs, då är det bra att använda apostrofer iställer för citationstecken runt sina texter. Om citationstecken används söker PHP tolken efter variabler och annan data i texten. Det tar lite extra tid och processorkraft av webbservern där PHP körs. Det medför lägre prestanda och i kritiska webbapplikationer kan man tjäna flera sekunder. Innanför apostroferna söker PHP tolken inte efter några variabler och då går det snabbare att översätta PHP-koden till HTML-kod.

Flera datatyper
Jag har nämnt att det finns flera datatyper men de är lite svårare att förstå. Därför skriver jag om de i framtida artiklar.

Omvandla mellan olika datatyper
I PHP kan man omvandla en datatyp till en annan datatyp mycket enkelt. Man använder en teknik som kallas "typkonvertering". Det visas senare. Nu visar jag bara ett enkelt exempel på att en variabel kan ändra sin typ beroende på innehållet som sparas inuti den.
<?php
// Omvandla datatyper i PHP
$text1 = "Pelle";
$text1 = 34;
$text1 = 1.5;

/* Här använder vi oss utav en funktion i PHP
som vi använder som verktyg för att utföra en viss uppgift.
var_dump() skriver ut en beskrivning av variabeln och dess
datatyp samt dess innehåll. */
var_dump($text1); // Skriver ut: float(1.5)
?>
Här i ovanstående exempel ser vi att vi använder samma variabel men vi sparar olika data inuti den. Först sparar vi en textsträng i variabeln vilket ger datatypen "string". Sedan ändrar vi innehållet till ett heltal vilket automatiskt omvandlar datatypen till "integer". Till sist ändrar vi innehållet i variabeln till ett decimaltal vilket automatiskt omvandlar datatypen till "float".

I kommentarerna kan ni läsa att funktionen var_dump() [4] används som ett verktyg för att beskriva variabeln åt oss. Den funktionen används mycket när man letar efter fel i sin kod och vill undersöka sina variabler och datan som är sparad i dem.

Men hur gör man om t.ex. $text1 innehåller decimaltalsvärdet 1.5 och du vill omvandla det till ett heltal? Vi kan använda oss av typkonvertering. Det görs genom att skriva datatypen inom parentes innan variabeln som ska omvandlas.
<?php
// Typkonvertering 1 i PHP
$tal = 1.8; // Är av typen float
$nytt_tal = (int) $tal; // Nu är den av typen int
var_dump($nytt_tal); // Skriver ut: int(1)
?>
Nackdelen med typkonvertering är att man kan förlora data och viss precision. Problemet är att vi förväntar oss utskriften int(2) istället för int(1) eftersom decimaltalet 1.8 avrundas uppåt till 2, eller hur!? Detta problem inträffar även i många andra programmeringsspråk än PHP.

För att lösa problemet måste vi först använda ett slags verktyg för att avrunda ett decimaltal upp till närmaste heltal, innan vi kan omvandla det till ett riktigt heltal. Ett bra verktyg vi kan använda är round() [5].

Efter att man har använt round() använder man typkonverteringen (int) för att omvandla variabelns datatyp till heltal "int".
<?php
// Typkonvertering 2 i PHP
$tal = 1.8; // Är av typen float
$nytt_tal = round($tal); // Avrundad till 2.0 och fortfarande av datatypen float
$nytt_tal = (int) $nytt_tal; // Typkonvertera till heltal
var_dump($nytt_tal); // Skriver ut: int(2)
?>
Typkonvertering är bra att använda när man verkligen vill kontrollera att en variabel får rätt datatyp.

Sammanfattning
Vi har gått igenom lite olika datatyper i PHP och hur de kan användas. För att förstå lite mer har jag beskrivit grunderna i talsystemen med baserna 2, 8, 10 och 16.

Datatyperna vi har gått igenom är heltal "int", decimaltal "float", boolesk "boolean" och strängar "string". Jag bestämde också att beskriva några andra bra datatyper vid ett annat tillfälle i en framtida artikel.

Nästa gång kommer jag prata om vektorer som är variabler med listor av lika eller olika datatyper. Men mer om det nästa gång.

Slutord
Ni har nu läst del 2 i min artikelserie om "PHP för riktiga nybörjare". Artikelserien är tillägnad min bror och alla nybörjare inom PHP eller programmering överhuvudtaget.

Om något är oklart eller svårt att förstå så tveka inte att kontakta mig med en kommentar. Klicka på länken "Kommentarer" eller "Skicka en kommentar".

Jag försöker beskriva programmering på ett så enkelt sätt som möjligt, men eftersom jag är en erfaren programmerare så är vissa saker för självklara för mig och det kan då vara svårt att beskriva med enklare ord. Därför ber jag er snällt att påpeka eventuella problem ni har att förstå innehållet i artikeln.

Ni kan också skicka in begäran om att jag ska visa fler kodexempel om hur man använder tekniken som beskrivs.

Jag hoppas ni har haft en mycket trevlig läsning.

Källor
[1] http://www.php.net/manual/en/ref.bc.php - BC Math
[2] http://www.php.net/manual/en/ref.gmp.php - GMP
[3] http://www.php.net/manual/en/language.types.float.php - Floating point numbers
[4] http://se.php.net/var_dump - Beskriv variabler
[5] http://se.php.net/round - Funktionen round()
[6] http://waschman.blogspot.com/2009/06/programmering-artikelserie-php-for.html

16 april, 2009

Linux/Ubuntu: Radera 5 äldsta backup filerna

Just nu arbetar jag med att försöka lära mig GNU/Linux Ubuntu v8.10 eftersom det är en del av mitt och en klasskompis examensarbete.

Jag sitter och försöker konfigurera och ändra lite inställningar via terminalen och har därför automatiskt skapat säkerhetskopior (eng. backup) av filerna jag ändrar ifall något skulle gå snett. Men nu är det så att antalet säkerhetskopior börjar bli väldigt många och det börjar bli svårt att hantera.

Därför har jag skapat ett Shell skript som raderar de fem filerna som har ändrats för längst tid sedan (eng. modification time) och skriver ut ett fint litet meddelande för att informera användaren. För att detta skall ske måste det finnas minst sex stycken säkerhetskopior som har suffixet (filändelsen) *.bak

Allt detta sker innan jag skapar en säkerhetskopia. Här nedanför kan ni se koden för mitt Shell skript.

deloldbak.sh

#!/bin/bash
#
#test
#if expr length $(echo hello) '<' 6 >/dev/null; then
# echo mindre än 6 tecken
#fi
#
#-----------------
# expr length -- beräknar längden på strängen som parameter
# expr -- beräknar utrycket som parameter
#------------------
#
# License: Open source but leave this comments if you want to use my code
# Licens: Öppen källkod men lämna dessa kommentarer om du vill använda min kod
# Date: 2009-04-16
# Owner: Waschman
# URL: http://waschman.blogspot.com
#


# Tar bort de fem äldsta backup filerna från aktuell katalog men
# bara om det existerar fler än 6 säkerhetskopior
if expr $(ls -lt | grep '\.bak$' | wc -l) '>' 6 >/dev/null; then
echo 'Too many backups... removing the 5 oldest backups'
# För varje fil som hittas i utskriften så körs kommandot 'rm'.
# '{} \;' anger att kommandot är slut.
find $(ls -t | grep '\.bak$' | tail -5) -exec rm {} \;
else
echo 'We only have a small amount of backups: not removing any backups'
fi
Ni kan skapa filen med kommandot gedit, nano, vim, eller någon annan textredigerare:
Exempel:
~$ gedit deloldbak.sh
Gör den sedan körbar:
Exempel:
~$ chmod +x deloldbak.sh
Kör skriptet i terminalen:
Exempel:
~$ ./deloldbak.sh
Jag kände bara för att dela med mig av skriptet till allmänheten.

Tips!
I shell-skriptet använder jag $(...) vilket omvandlar utskriften från kommandot innanför paranteserna till en text (eng. string, sv. sträng) som sedan kan behandlas av ett annat kommando. I mitt fall skickas strängen till kommandot expr.

Nu tänker jag gå och lägga mig för i morgon (egentligen idag) skall jag bara slappna av och ta en åktur på mina inlines. Tills dess önskar jag er "happy programming".

Källor
http://www.howtogeek.com/howto/ubuntu/delete-files-older-than-x-days-on-linux/

11 juli, 2008

Programmering: PHP för riktiga nybörjare - Del 1

Artikelnserien är tillägnad min bror

Förord
Nu ska jag försöka skriva en artikel om hur man kommer igång med PHP om man aldrig har programmerat förut. Det kommer bli en utmaning eftersom jag måste försöka använda enkla ord och beskrivningar. Tvivla inte att skicka en kommentar om något är svårt att förstå.

Min yngre bror försöker lära sig att programmera i PHP och designa webbsidor med grundläggande HTML så därför är guiden anpassad för honom. Han har aldrig programmerat förut men har ett starkt intresse. Artikeln måste därför vara anpassad för en ung tonåring.

Delar i artikelserien
Lista med alla delar i artikelserien [1]

Vad vi kommer att gå igenom
  • Kort om vad PHP är för något samt varför man använder det.
  • Hur man skriver kommentarer i sin kod.
  • Variabler
  • Text och siffror
  • Hur man skriver ut text på en webbsida.

Introduktion

Vad är PHP
PHP var från första början år 1994 en förkortning för "Personal Home Page". Under senare år har man börjat omvandla förkortningen till "PHP: Hypertext Preprocessor".

Vad används PHP till?
PHP används på webbsidor på en dator som vi kallar för "webbserver". Där har PHP uppgiften att göra olika uppgifter som vi kommer att gå igenom senare och i framtida artiklar om PHP. Det absolut viktigaste är att PHP används till att skapa webbsidor automatiskt utan att man själv ska behöva uppdatera och ändra koden för sin webbsida. Detta kallas för dynamiska webbsidor. Allt handlar helt enkelt om att förenkla uppgifterna för dig själv - oftast - så att man slipper uppdatera varje webbsida var för sig. Mer om sånt här kommer vi gå igenom i senare artiklar när vi lär oss mer avancerad PHP.

Man skriver alltså kod som sedan utför något. Detta kallas för att "skripta". Då kan vi nu säga att PHP är ett skriptspråk som används för dynamisk webbutveckling. Det är skillnad på webbutveckling och webbdesign.
  • Webbdesign är när man skapar webbsidor och sköter designen - färger, utseende, formgivning och så vidare.

  • Webbutveckling handlar mest om att skriva kod som styr de flesta funktionerna på en webbsida. Det kan till exempel vara att visa dagens datum på webbsidan, visa vilken IP-adress besökarna har, ta hand om en gästbok eller kanske ett forum.
Eftersom jag har sagt att PHP anpassar en webbsida beroende på vad du har valt att PHP ska göra så vet vi nu en sak som är mycket viktig: man bör kunna grunderna i webbdesign (alltså hur man skriver HTML kod) för att lyckas inom PHP programmering.

Kostar det något att använda PHP
Om man vill använda PHP så måste man ju spara sina php-filer till en webbserver som jag talade om förut. Det finns servrar att hyra och man kan sätta upp en egen server på datorn där hemma. Hur man gör detta kan ni läsa om i en annan artikel jag har skrivit - Nätverk/Server: Sätta upp egen server #2.

PHP är gratis för alla att använda och är ett "Öppen källkods" projekt. Det betyder att koden som användes för att skapa PHP är gratis för alla och öppen att titta i.


Är det många som använder PHP?
PHP används av otroligt många programmerare och webbutvecklare. Det är ett av världens mest populära skriptspråk för webbsidor.

"PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML." ~ www.php.net

Om man behöver hjälp med ett problem i PHP så är chansen mycket stor att någon redan har haft det problemet innan och att någon redan har gett ett svar. Om man söker på Google eller i kända PHP-forum så bör ni hitta det ni söker.


Mitt första PHP-skript

Hur skapar man ett PHP-skript?
Det finns många sätt man kan använda för att skapa ett PHP-skript men det allra enklaste för nybörjare är att använda programmet Anteckningar i Windows. Nu ska jag visa er steg för steg hur man kan göra.
Öppna Anteckningar:
Öppna startmenyn > Alla program > Tillbehör > Anteckningar
Ett första exempel
Skriv in koden ni ser i rutan här nedanför. Koden skriver ut ett textmeddelande på en webbsida.
<?php
echo "Hello World";
?>
För att spara ert textdokument går ni till:
Arkiv > Spara som...
Nu ska vi döpa filen med exemplet:
I fältet "Filnamn" skriver ni texten "helloworld.php" och glöm inte citationstecknen runt texten.

Tryck på knappen "Spara".
Så där. Det var väl inte så svårt. Nu har ni skapat ert allra första PHP-skript. Men för att kunna se resultatet av koden så måste man skicka php-filen till en webbserver.
Nu framöver så antar jag att ni har fixat en webbserver där ni kan spara php-filerna.
Nästa steg för er blir nu att lära er lite om byggstenarna för en kod skriven i PHP.


Hur PHP kod är uppbyggd

Regler att följa
Varje programmeringsspråk har speciella regler som måste följas för att koden ska fungera. Om man bryter mot reglerna så får man fel.
Regler i programmeringsspråk heter med ett annat ord: Syntax
Visa vad som är PHP kod
När man programmerar med PHP måste man tala om för PHP-tolken när hela koden börjar och slutar. Till detta använder man <?php och ?>. Allt som står mellan dessa är PHP kod. Det är vanligt att man blandar PHP kod med HTML kod (alltså koden för webbdesignen) och då måste man tala om när PHP börjar och slutar. Annars visas PHP koden på webbsidan och det vill vi inte.

Semikolon
Efter nästan varje rad med kod så måste man avsluta kod med ett semikolon (;). Annars vet inte PHP-tolken som läser igenom koden på webbservern var den ska sluta läsa.

Alla rader i PHP behöver inte avslutas med ett semikolon men detta kommer jag gå igenom för er i en senare artikel när vi börjar lära oss kontroll-satser och loopar.

Skriva ut text och data på webbsidan
I vårt första exempel använde vi nyckelordet "echo" som används för att skriva ut allt som skrivs bakom ordet ända tills det dyker upp ett semikolon. Då stannar tolken och skickar texten till "echo" i PHP som sedan skriver ut texten på webbsidan. "echo" är en funktion, ett slags verktyg som används för att skriva ut text.

I PHP kan man göra vissa saker på många olika sätt. Till exempel så finns det en funktion som heter "print" och som gör exakt samma sak som "echo" - skriver ut text. Tyck nu inte att ordet funktion gör det krångligt. Tänk bara på att funktioner är verktyg och hjälpmedel som gör saker åt dig.


Kommentarer

Vad är en kommentar i PHP?
Tänk dig att du har programmerat i PHP i flera år och du skapar nu webbsidor och php-skript som är flera tusen rader långa och som innehåller flera miljoner bokstäver och tecken. Men hur kommer man ihåg vad en del i koden gör för något när det finns så mycket att hålla reda på?

Jo, man skapar något som kallas "kommentarer". En kommentar används för att göra det enklare för dig som programmerare att hålla ordning i din kod och samtidigt komma ihåg vad den gör. Se kommentarer som en slags beskrivning av koden. Och vet ni vad? Kommentarerna visas inte på webbsidorna. De tas bort på webbservern innan webbsidan skickas till besökaren för att visas.

Rutorna här nedanför visar några exempel på olika typer av kommentarer

<?php
// Detta är en kommentar på en enda rad
?>
<?php
# Detta är också en kommentar på en rad
?>
<?php
/*
Här är en kommentar som kan
skrivas på flera rader.

Man kan skriva en lång beskrivning om man
har php-kod som är svår att förstå
*/
?>
Det finns ett jättestort fel som många programmerare gör och det är att man helt enkelt inte orkar skriva kommentarer för att man är lat, eller helt enkelt för att man vet exakt vad koden gör för något när man sitter och skriver den och tänker att man inte behöver några kommentarer. Men tänk om man kommer tillbaks till koden igen efter ett halvår eller mer. Då är chansen mycket stor att man har glömt bort vad koden gör och man kan råka göra ett fel eller en ändring som man inte riktigt förstår eftersom att koden kanske är svår att känna igen.

Så börja skriv kommentarer redan från första början. Då blir det även enklare att leta upp fel i koden om ni får problem.


Variabler

Spara saker
I PHP finns något som kallas för "variabler". Dessa används för att spara data som text, siffor med mera. En variabel börjar med ett dollar-tecken ($).

Nu ska jag beskriva detta så enkelt som möjligt. En variabel är en slags kakburk där man kan lägga undan olika sorters kakor med olika smak och storlekar. Kakorna i detta fallet är data i någon form.

Variabler exempel
Säg till exempel att ni vill registrera er på en webbsida där man kan ladda upp bilder på sig själv och skriva lite information om vad man heter och kanske var man bor. Ni får skriva in ert namn och adressen där ni bor. När ni sedan klickar på knappen skicka eller registrera när ni är färdiga så skickas det ni har skrivit till ett php-skript på webbservern som tar hand om detta.

PHP-skriptet sparar det ni har skrivit i variabler. Sedan kan variablerna användas för att till exempel skriva ut ert namn på webbsidan när någon besökare visar information om ert nya konto.

Ett annat exempel är en webbsida där man får skriva in hur gammal man är med siffror. När man är färdig sparas siffrorna i variabler som sedan används i en slags räknare och kontrollverktyg som ser efter om ni verkligen får komma in på webbsidan eller inte.

Här visar vi ett exempel i praktiken:
<?php
// Variabler börjar med ett dollar-tecken ($)
//
$variabel_1;
$variabel_2 = 16;
$variabel_3 = "Patrik";
//
// Nu är php-skriptet slut
?>
Nu kommer en förklaring:
  • $variabel_1 är tom och innehåller ingenting.
  • $variabel_2 innehåller nu talet 16.
  • $variabel_3 innehåller nu texten "Patrik".
Så vad tror ni nu att nästa PHP kod gör?
<?php
$variabel_2 = 16;
echo $variabel_2;
?>
Helt korrekt - koden ovanför skriver ut talet 16. Se det så här:
  1. Först sparar vi kakan 16 i kakburken (variabeln) $variabel_2.
  2. Sedan använder vi echo för att hälla ut kakorna i burken på webbsidan.
  3. På webbsidan ser vi då talet 16.
Ni glömmer väl inte att ta med semikolonet? Utan det kommer koden inte att fungera. Ni får gärna testa att ta bort ett semikolon och testa se vad som händer. Då lär ni er vilka fel ni får om ni någon gång glömmer att ha med ett semikolon på rätt ställe i koden.

Vad får variabler heta?
En variabel i PHP måste inte heta $variabel utan får heta nästan vad som helst.
  • Tänk på att inte använda svenska ord med å, ä och ö.
  • Använd helst engelska ord om ni kan.
  • En variabel får inte börja med en siffra.
  • En variabel bör helst inte börja med ett understreck (_) eftersom det finns speciella variabler i PHP som använder detta.
  • Försök att ha namnen på variablerna korta men beskrivande.
<?php
// Bra exempel
$fornamn = "Peter";
$efternamn = "Persson";
$ar_gammal = 26;
$tool = "Hammare";
$email_address = "peter.persson@live.email.com";
?>
<?php
//Dåligt exempel
$fn = "Anna";
$en = "Torstensson";
$x = 32;
$real_person_fake_email_address = "anna.torstensson@live.email.com";
?>
Som ni ser så finns det bra och dåliga sätt att skriva på. Använd namn som beskriver innehållet och inte för korta. Använd heller inte för långa namn på variablerna. Man behöver inte vara för tydlig.

Det allra viktigaste man ska tänka på när man programmerar är att koden ska vara tydlig och enkel att förstå. Man ska alltså försöka att kommentera så mycket som möjligt men inte på onödiga ställen. Försök också att hålla er till ett sätt att skriva koden, bara små bokstäver, stora bokstäver, stor bokstav vid varje nytt ord, understreck mellan ord och så vidare. Välj ett sätt som är enkelt för er att hålla kvar vid.

Vi kommer märka detta mycket tydligare i senare artiklar när koderna blir större och mer avancerade. Då är det viktigt med tydlig kod.


Sammanfattning
Vi har gått igenom vad PHP är och vad det används till. Historia om PHP har vi inte gått igenom för jag tycker inte att det är så viktigt i detta skede. Det kan man lära sig senare. Vi har sagt att PHP är gratis och att det är ett skriptspråk för webbutveckling av dynamiska webbsidor.

Vi har gått igenom kommentarer, variabler, siffror och text bara för att visa några snabba och enkla exempel. Vi har även nämnt att man ska tänka på att skriva en tydlig kod som är enkel att förstå.

Och detta var allt för den här gången. Vid ett senare tillfälle kommer jag ha en snabb genomgång av det vi lärde oss i denna artikeln och sedan gå igenom nästa steg för nybörjare inom PHP.


Slutord
Artikeln är tillägnad alla som är nybörjare inom PHP och programmering överhuvudtaget. Jag försöker beskriva allt så enkelt som möjligt med enkla ord men det är svårt när man har så mycket erfarenhet och efter att man själv redan har lärt sig det som en gång i tiden var så svårt med programmering.

Jag ser programmeringen från ett annat perspektiv och därför kan det vara svårt att se mina egna fel som nybörjare har svårt med. Om just Du är en nybörjare och inte förstår en del av det jag har försökt att beskriva så tvivla ej att skriva en kommentar och fråga om hjälp. Ni kan även be mig att uppdatera artikeln efter behov om något uppfattas som oklart.

Jag kommer att skriva en fortsättning på artikeln i en uppföljande artikel men vet tyvärr inte när detta kommer ske.

Jag hoppas att ni har haft en trevlig och lättsam läsning och att ni är nöjda med slutresultatet.

Om ni vill läsa en riktig bok om PHP tycker jag ni ska läsa min artikel om "Bästa boken om PHP" (enligt mig) [2] Ni kan även läsa en annan artikel som jag har skrivit om "mitt val av bästa programmeringsspråk" [3].

"Happy Programming!"

Källor
[1] http://waschman.blogspot.com/2009/06/programmering-artikelserie-php-for.html
[2] http://waschman.blogspot.com/2008/03/php-bsta-boken-om-php.html
[3] http://waschman.blogspot.com/2007/12/php-bsta-programmeringssprket.html

05 februari, 2008

PHP/Nätverk: CIDR IP Summarize

För ungefär en månad sedan hjälpe jag någon på ett forum med ett PHP-skript som kan summera IP-adresser med hjälp av CIDR. Det är något som används i många routrar för att minska routing tabellerna och därmed minska belastningen på resurserna i routern vid eventuella beräkningar för olika nätverk. Kort sammanfattat kan man säga att flera nätverk representeras av en enda IP-adress.

Jag lyckades koda ihop en lösning i PHP ganska snabbt men koden har inte optimerats för bästa prestanda och några felhanteringsrutiner finns inte. I framtiden funderar jag på att försöka göra om skriptet till ett lite smidigare. Personen jag hjälpte ville bara ha en lösning och det fick han/eller hon som utlovat.

Kommentarerna och koden är på engelska för att öka tillgängligheten. Det är även enklare att porta koden om någon icke-svensk vill använda den. Jag har försökt kommentera det mesta men märker att det fattas på några ställen; vilka jag tycker är oviktiga för tillfället.

Uppdatering 9/10-08
Koden har fixats till och ger nu ett korrekt resultat. Efter grundlig felsökning kom jag fram till att man fick fel resultat ibland. Jag hade helt enkelt tänkt fel. Men nu fungerar koden som den ska. Nackdelen är dock att den fortfarande är rörig.

<?php
/**
* Filename: cidr-summarize.php
* Owner: Waschman, waschman at gmail dot com, waschman.blogspot.com (swedish)
*/


/**
* Get single IP-address class
*
* @param string $ip
*/
function get_ip_class($ip)
{
$class = false;
$octet = explode('.', $ip);
if ($octet[0] <= 126) $class = 'A';
elseif ($octet[0] == 127) $class = 'Loopback';
elseif ($octet[0] <= 191) $class = 'B';
elseif ($octet[0] <= 223) $class = 'C';
elseif ($octet[0] <= 239) $class = 'Multicast';
else $class = 'Reserved';
return $class;
}


/**
* Decimal to network binary, preceeded with 0
*
* @param int $dec
* @return string
*/
function dec2netbin($dec)
{
$ip = str_pad((string)(decbin($dec)), 8, "0", STR_PAD_LEFT);
return $ip;
}


/**
* This returns 1 if both variables are 0 and 0 or 1 and 1.
* Regular binary AND returns 1 if both only are 1 and 1.
*
* OBS! Don't work on numbers, only a single 0 and 1!
*
* @param bit $a
* @param bit $b
* @return string (0 or 1)
*/
function special_binary_and($a, $b)
{
if ($a == $b) return '1'; else return '0';
//return $a & $b;
}


/**
* Summarizes IP-addresses into a single CIDR address with mask-suffix.
*
* IMPORTANT NOTE: This function needs to be optimized and cleaned. Correct
* error-checking should also be implemented. Code not for use in critical
* computer environments. Also note that all functions included in this package
* is required, except for the get_ip_class() function.
*
* @author Waschman, waschman at gmail dot com, waschman.blogspot.com (swedish)
* @copyright Free for everyone to use, but only if you keep author and copyright information intact.
* @version 0.8.0
* @param array $ip
* @param bool $debugon
* @return array
*/
function cidrsummarize($ips, $debugon=false)
{
//
// Code should be cleaned and optimized.
//

$count = count($ips);
$octet_diff = 0;
// Save all octets into an array
for ($pos=0; $pos<4; $pos++) {
for ($i=0; $i<$count; $i++) {
$octets[$i] = explode('.', $ips[$i], 4);
// Save first octet so we can check which octet differs from
// the others. Crucial when we want to know where to begin
// checking of binary digits.
if ($i==0)
{
$first_ip = $octets[$i][$pos];
echo $debugon?'<p>$firstip:'. $first_ip .'</p>':'';
continue;
}
// Find different octets
echo $debugon?'<p>IS '. $first_ip .' == '.
$octets[$i][$pos] .'? ':'';
if ($first_ip != $octets[$i][$pos]) {
echo $debugon?'no, that means we found an octet that is
different.</p>':'';
echo $debugon?'Debug: Position of octet that
differs is '. $i .':'. $pos:'';
$octet_diff = $pos;// Save position that is different
break 2;// Exit 2 for-loops
}
echo $debugon?'yes</p>':'';
}
}


//
// Set the number of bits so far to use as mask.
// This depends on which octet that differ.
//
$mask_bits = 0;
if ($octet_diff < 1) $mask_bits = 0;
elseif ($octet_diff < 2) $mask_bits = 8;
elseif ($octet_diff < 3) $mask_bits = 16;
else $mask_bits = 24;

//
// Starting main-loop for checking diffing bits.
//
$count = count($octets);
if ($debugon) print_r($octets);
for ($i=$octet_diff; $i<4; $i++) {
if ($i==$octet_diff)
{
$first_octet = $octets[0][$i];
}

// Go through the bits one by one in the diffing octet
$bit_index_all_ones = 0;
$final_octet = '';
for ($bit_pos=0; $bit_pos<8; $bit_pos++) {

echo $debugon?'<h2>Debug: '. $bit_pos .'</h2>':'';
for ($j=0; $j<$count; $j++) {
if ($j==0)
{
//continue;
}
else
{
//$next_octet = $octets[$j][$i];
}
$next_octet = $octets[$j][$i];

echo $debugon?'<p>Debug: First octet='. $first_octet
.', next octet='. $next_octet .'</p>'."\n":'';

// ANDing bits!
$a = dec2netbin($first_octet);
$b = dec2netbin($next_octet);
$anding = $a[$bit_pos] & $b[$bit_pos];

// When equal-bit becomes 0 then there's no more bits that are the same
$equal_bit = special_binary_and($a[$bit_pos], $b[$bit_pos]);

echo "BIT: $bit_pos\tAND: $anding\t";
echo "F: $first_octet\tN: $next_octet\n";

// Create the new octet
if ($equal_bit == 1 && $j == $count-1)
{
$final_octet .= $anding;
}

// No more matches... now we have the bits for the mask
if ($equal_bit == 0)
{
$add_mask_bits = $bit_pos;// create the mask
$final_octet = str_pad($final_octet, 8, '0', STR_PAD_RIGHT);
$cidr_octet = bindec($final_octet);
echo "<pre>\n\n\tFinal octet = $final_octet\n\tCIDR octet = $cidr_octet\n";
echo "\tBitmask: /". ($mask_bits + $add_mask_bits) ."\n\n</pre>";
break 3;// exit 3 for-loops
}

}// EndFor $j

}// EndFor $bit_pos
}

//
// Create the real cidr ip address from the information gathered
//
$cidr_ip = '';
for ($octet_idx=0; $octet_idx<4; $octet_idx++) {
if ($octet_idx==$octet_diff)
{
$cidr_ip .= $cidr_octet .'.';
}
elseif ($octet_idx > $octet_diff)
{
$cidr_ip .= 0 .'.';
}
else
{
$cidr_ip .= $octets[0][$octet_idx] .'.';
}
}

// Cut off trailing dot
$cidr_ip = substr($cidr_ip, 0, -1);


//
// Create the /bits mask
//
$mask_bits += $add_mask_bits;


//
// Create the binary mask
//
$mask_binary = '';
for ($i=1; $i<=32; $i++) {
if ($i <= $mask_bits)
{
if ($i % 8 == 0)
$mask_binary .= '1.';//add dot
else
$mask_binary .= '1';
}
else
{
if ($i % 8 == 0)
$mask_binary .= '0.';//add dot
else
$mask_binary .= '0';
}
}

// Cut off trailing dot
$mask_binary = substr($mask_binary, 0, -1);


//
// Create the dotted decimal mask
//
$mask_decimal_parts = explode('.', $mask_binary, 4);
$mask_dotted_decimal = bindec($mask_decimal_parts[0]) .'.';
$mask_dotted_decimal .= bindec($mask_decimal_parts[1]) .'.';
$mask_dotted_decimal .= bindec($mask_decimal_parts[2]) .'.';
$mask_dotted_decimal .= bindec($mask_decimal_parts[3]);


echo $debugon?'<p>Debug: Mask bits is: /'. $mask_bits .'<br>
IP-address is: '. $cidr_ip .'<br>
Subnetmask is: '. $mask_dotted_decimal .'<br>
Subnetmask in binary is: '. $mask_binary .'</p>':'';

$return_array['cidr_ip'] = $cidr_ip;
$return_array['mask_bits'] = $mask_bits;
$return_array['mask_dotted_decimal'] = $mask_dotted_decimal;
$return_array['mask_binary'] = $mask_binary;

return $return_array;
}


// *** Remove the comments from one of the blocks to test the summarization. ***


// My example :: Should summarize into 192.168.0.0/20
/*$ip[] = '192.168.1.0';
$ip[] = '192.168.2.0';
$ip[] = '192.168.3.0';
$ip[] = '192.168.4.0';
$ip[] = '192.168.5.0';
$ip[] = '192.168.6.0';
$ip[] = '192.168.7.0';
$ip[] = '192.168.8.0';
$ip[] = '192.168.9.0';
$ip[] = '192.168.10.0';*/

// My example :: Should summarize into 128.0.0.0/1
/*$ip[] = '191.168.4.0';
$ip[] = '192.168.5.0';
$ip[] = '193.168.6.0';
$ip[] = '194.168.7.0';*/

// Example addresses from your submitted examples - 82.205.128.0/17
/*$ip[] = '82.205.190.0';
$ip[] = '82.205.192.0';
$ip[] = '82.205.202.0';
$ip[] = '82.205.204.0';
$ip[] = '82.205.246.0';*/

// Example 203.88.64.0/19
/*$ip[] = '203.88.66.64';
$ip[] = '203.88.66.160';
$ip[] = '203.88.82.240';
$ip[] = '203.88.88.24';
$ip[] = '203.88.88.32';
$ip[] = '203.88.88.40';
$ip[] = '203.88.88.160';
$ip[] = '203.88.88.224';*/

// 217.0.0.0/8
/*$ip[] = '217.10.167.0';
$ip[] = '217.195.144.24';
$ip[] = '217.195.144.32';*/

// Example from CCNA3 v311
// Module 1.1.5 (Route Summarization #2)
//
// => 200.199.48.0/20
// Reality: 200.199.48.0/20
//
$ip[] = '200.199.48.0';
$ip[] = '200.199.52.0';
$ip[] = '200.199.56.0';




// Return an array with information about the summarization.
// You can use this in the URL if you want debugging: [this-file].php?debug=1
$use_debugging = (isset($_GET['debug'])) ? $_GET['debug'] : false;
$cidr_ip = cidrsummarize($ip, $use_debugging);
$buf = '';
$buf .= '<hr><p>Summarized IP-address: '. $cidr_ip['cidr_ip'] .'/'. $cidr_ip['mask_bits'] .'</p>';

$buf .= '<pre>';
foreach ($cidr_ip as $value) {
$buf .= $value .'<br/>'."\n";
}
$buf .= '</pre>';
file_put_contents('results.html', $buf);
?>

Mycke nöje och jag hoppas att koden är användbar för i alla fall några av er.

Välkomna till bloggen

Välkomna ska ni vara kära besökare. Jag skriver om IT för att det är kul och för att jag vill dela med mig av information och kunskap. Jag försöker hålla bloggen så kategoriserad som möjligt för att ni enklare ska hitta intressanta länkar och artiklar.