PHP PHP: Hypertext Preprocessor
Vad är PHP? Script-språk (jmfr. JavaScript / Python) C-liknande syntax (familj: C / C++ / C# / Java) Dynamiskt typat Används främst server-side för att generera dynamisk output Bakgrund (Personal Home Page) restriktion vad gäller användningsområde Alternativ: Python / JavaScript (node) / (Perl)
Script-språk Kompileras ej (ev. bytecode) Ursprungligen: automatisera manuella uppgifter (ex vis döpa om filer o s v). Är överlag hög-nivå, men går att kombinera med låg-nivå, t ex moduler skrivna i C (Python). Det skall gå snabbt att skapa något konkret, exempel följer:
Exempel på script (Python) def even_sum(n): return sum((m for m in xrange(1, n+1) if not m % 2)) def QS(A): return QS([n for n in A if n < A[0]]) + QS([n for n in A if n >= A[0]]) if len(a) 1 else A
C-liknande syntax for / while / foreach / {...} / if...else / o s v Funktioner: function my_func(x, y, z){ } Klasser: class MyClass{ } Överlag: fungerar som man förväntar sig (givet en bakgrund med C#)
Dynamiskt typat Vi är vana med int i = 3; (strikt typat => vi anger typ för allt, går ej att definiera om!) Dynamiskt typat => anger enkom variabelnamn; typ framgår implicit genom värdet vi lagrar. Exempel: int i = 3; blir $i = 3;. Alla variabelnamn har $ före sig. Vi kan ändra typ på en variabel: $i = 3; // int $i = 'blabla'; // string $i = 3.2; // float
Används främst server-side Klient A (webbläsare) connectar till server S. Klient A requestar./somefolder/somepage.php S (säg apache2) ber PHP köra somepage.php => erhåller HTML som output, vilken sedan skickas till A. Output till klienten är därmed dynamisk, ty PHP-intrp körs vid varje request => möjligt med ny output varje gång.
Upplägg Klient APACHE2 MOD_PHP MySQL
Grundläggande Syntax
Introduktion PHP kan bäddas in i vanlig HTML. Det vi skriver ut hamnar i output (d v s den HTML klienten erhåller). Vi kan ha hur många <?php?>sektioner som helst. <html> <head></head> <body> <?php echo '<p>blabla</p>';?> </body> </html>
IF $i = 17; if ($i > 8){ echo 'aaaa'; } elseif ($i > 10){ echo 'bbb'; } else { echo 'ccc'; }
FOR for ($i = 0; $i < 100; $i++) { } $somevalue += do_stuff($i);
FOREACH $arrayprod = 1; foreach (array(1, 9, 1, 1) as $i) { $arrayprod *= $i; }
WHILE while ($somevar > 20){ } $somevar--;
SWITCH switch($a){ case 1: case 2: dostuff(); break; default: dootherstuff(); break; }
Strängar bla och 'bla' är skilda ting! stödjer fler escapes (\r\t o s v) försöker utvärdera variabler, ex vis hej $bla UNDVIK! Använd ' om det rör sig om vanliga strängar! (sällan behov av \n etc) Strängar är inte immutable (!), ex vis kan vi skriva $str = 'hello'; $str[0] = 'j'; echo $str; // blir jello Längd får vi m h a strlen($somestr);
Arrayer Är implementerade som ordnade hashmaps Jmfr. Dictionary<TKey, TValue> som är strikt Nyckel (Key) måste vara int eller string Värdet kan vara vad som helst Vi skriver: $arr = array( 'skoj' => 7, 3 => 4 ); echo $arr['skoj']; // 7
Arrayer forts Om flera värden har samma key blir enkom det sista värdet aktuellt. $myarr = array(1 => 'skoj', 1.03 => 'lek', true => 'bla' ); echo $myarr[1]; // bla Man behöver inte ange nyckel för alla element, då tilldelas det automatiskt istället (typexempel på PHP:s konstiga utformning).
Arrayer forts I C# skriver vi somearray.length för att få fram antal element. I PHP gör vi: for ($i = 0; $i < sizeof($somearray); $i++){ dostuff(); } Vi kan erhålla arrayer från strängar genom ex vis str_split($str, [splitlen]) och explode($strdelim, $str, [sizelim]).
Exempel str_split $str = 'ribbons'; $strarr = str_split($str); // [0] => r, [1] => i o s v explode $str = 'ribbons are trendy'; $strarr = explode(' ', $str); // [0] => ribbons, [1] => are...
Operatorer $a += 3; $a *= 7; $a -= 8; $a %= 17; o s v som vanligt. (=== ny typ + värde) $j = 'hej'; $j.= 'san'; echo $j; // hejsan Betyder att vi kan skriva $i = 7; echo 'Det finns '. $i. ' lådor'; // Det finns 7 lådor
VARNING Vi anger aldrig typen på argument, konstiga fel kan följa. Exempel: $i = 7; $i += $j; Vad händer om $j är en sträng? Svaret måste ligga i (int) => vi får konstig output! Testkör era script, se vad som händer med konstig input och skriv kod som kollar att era funktioner får vad ni förväntar er.
Typomvandling Ibland måste vi typomvandla (casta) variabler. Görs C-style, d v s (targettype) varname. Exempel: $strnum = '17'; $intnum = (int) $strnum;
Ett mer användbart exempel Hur kan vi vara säkra på att input (sträng) är ett tal innan vi typomvandlar till int? is_numeric räddar dagen: if (is_numeric($someuserinput)){ $myint = (int) $someuserinput; } Finns is_int(), is_string(), is_array() o s v för datatyper (returnerar true om så är fallet, annars false).
Funktioner Fungerar precis som i C#, vi skriver: function my_func_name(x, y, z){ do_stuff(); return $something; } Dynamiskt typad => vi kan returnera vad som helst! Ett anrop blir my_func_name(2, 8, 'BASS');
Klasser och objekt PHP kan skrivas objektorienterat (men påklistrat). För större projekt kan det kanske vara användbart. Vi skriver klasser enligt: class MyClass { public function hej(x){ echo 'x'; } } $sw = new MyClass(); $sw->hej(3);
Klasser och objekt Arv class Child extends Parent { function somefuncthatexistinparent(){ dostuff(); parent::somefuncthatexistinparent(); // ist. base } }
Klasser och objekt Precis som i C# använder vi oss av this ($this) för att referera till nuvarande instans. Exempel: class SomeClass { $a = 3; } function dostuff(){ $this->a += 7; // ok $a += 7; // nej! }
Klasser och objekt Precis som i C# använder vi oss av this ($this) för att referera till nuvarande instans. Exempel: class SomeClass { $a = 3; } function dostuff(){ $this->a += 7; // ok $a += 7; // nej! }
Constructor / Destructor Constructor: construct(){ } Destructor: destruct(){ } Finns fler, ex vis clone().
Interface Fungerar som vanligt, definieras enligt: interface ISomething {... } class SomeClass implements ISomething { }
Exceptions Fungerar som vanligt: try { somecode(); } catch(exception e){ echo $e->getmessage(); } Kastas enligt: throw new Exception('something went wrong!');
Sessions, MySQL, includes och filhantering
Includes När vi har stora projekt vill vi dela upp koden över flera filer. Kräver att vi importera andra filer i den nuvarande. Exempel, vi har databas-koden i db.php, vi skriver följande i index.php: include 'db.php'; // vi kan använda allt som finns i db nu
Includes Om filen i fråga verkligen behövs, kan vi använda require. Den enda skillnaden mellan include och require är att require resulterar i ERROR om filen inte kan laddas in. require 'db.php';
Includes forts Lägger vi till include_once resp require_once kommer includen enkom köras om filen inte redan är includad. Är bra om vi includar filer (ex vis vår db.php) i flera filer som sedan läggs ihop i index.php.
Formulär När vi skickar saker med POST och GET (via <form>) kan vi erhålla innehållet i PHP. Data hamnar i $_POST och $_GET (är arrayer!). Skickar jag <input type= text name= namn /> med POST, skriver jag: $inputtext = $_POST['namn']; // namn måste finnas! Mer på PHP-labben!
Filhantering Vi kan läsa och skriva till filer utan större svårigheter. Öppna en fil: $file = fopen('./somefile.log', MODE); där MODE är w (write), r (read), r+ (read+write skapa ej ny), w+ (read+write skapa ny). Finns fler!
Filhantering För att skriva till en öppnad fil (säg $file): fwrite($file, 'blabla'); För att läsa en öppnad fil (säg $file): fread($file, filesize($file)); Vi stänger en fil med fclose($file); (MÅSTE GÖRAS!)
Sessions Server-side, lagrar användarens id (hashmap, key-value). Används bl a när man loggar in på sidor. I PHP skriver vi session_start() längst upp på varje sida. session_start() skapar ny eller fortsätter gammal session, måste finnas på varje sida. Notera att en session purgas när klienten dödar connection med servern.
Sessions forts Vi kommer sparar data enligt: $_SESSION[someKey] = someval;...och kommer åt det enligt: $_SESSION[someKey];
Sessions forts En session kan dödas direkt genom session_destroy(); Exempel: <?php session_start(); if ($_POST['logout'] == 1){ session_destroy(); }?>
Cookies Sparar data lokalt hos klienten. I PHP skriver vi: setcookie(name, [val], [expire], [path], [domain]); Måste skickas INNAN <html>! Dödas genom setcookie("user", "", time()); // expire nu
Cookies forts Ett litet exempel: <?php $expire=time() + 60 * 60 * 24 * 30; setcookie('user', 'sötnosen_mattias', $expire);?>
Cookies forts <html><body> <?php if (isset($_cookie["user"])) echo 'Welcome '. $_COOKIE['user']. '<br />'; else echo 'Welcome guest!<br />';?> </body></html>
MySQL Hur ni hämtar och skickar data till en MySQL-databas ingår i föreläsningen om MySQL. Där finner ni även kodexempel. Överlag finns det mycket resurser på nätet kring detta och det är inte svårt att klippa-och-klistra ihop en lösning. Det vi kan ta upp är lite grundläggande säkerhet.
MySQL SQL-injections Det är vanligt att man låter användaren fylla i ett formulär med data som sedan hämtas i ex vis $_POST. Lita inte på att användaren skickar in trevlig data! Tänk er följande SQL-fråga: SELECT * FROM sometbl WHERE username='$username' AND password = '$password' Vad händer om $username är admin'-- vanlig comment i SQL
MySQL SQL-injections Frågan blir nu istället att hämta alla rader där username är admin (och inget om password). Om vi kollar huruvida resultatet är större en noll för att godkänna en inloggning, har användaren nu loggat in som admin utan lösenord! Löses genom att använda: mysql_escape_string($str) Exemplet tidigare: WHERE username='mysql_escape_string($username)'...
Tips
Allmänt!!! Använd PHP-manualen på php.net!!! Om ni vet hur ni löser något i C# kommer det gå att lösa på ett liknande sätt i PHP. Experimentera med nya inslag, ex vis sessions och databas-frågor. Det finns VÄLDIGT mycket exempel online, Google is your friend!
Projektarbetet Dela upp koden i filer. Undersök templates bättre separation: HTML/CSS/JS vs PHP Kolla färdiga lösningar, finns många! Titta på ramverk, ex vis CakePHP och dylikt. Gör dynamiska lösningar, blir mindre kod. Utforma grundläggande funktionalitet först, innehållet kan med fördel skapas sist!
Projektarbetet Gör en grundläggande design. Skapa logiken för hur sidan skall byggas upp. Implementera databas-funktionalitet. Skapa innehåll och lägg till fräsiga saker (jquery, AJAX).
Projektarbetet Notera att PHP är ett rörigt språk. Om er sida uppför sig konstigt behöver det inte betyda att ni har tänkt fel, bara att ni missat något i PHP (jmfr. array-nycklar). Man behöver inte låta output vara HTML, man kan även skapa bilder och dylikt.
GAME OVER It feels like something is missing... ÅLÅF?