Logotyp för Björns studiewebb

PHP och MySQLi

Inledning

Denna sida innehåller beskrivningar av hur man ansluter till MySQL med extensionen MySQLi samt hämtar, lägger till, uppdaterar och raderar poster.

För en komplett beskrivning av PHP och databaser rekommenderas PHP-dokumentation på adressen www.php.net. Den finns att ladda ner som bl.a. en Windows-hjälpfil (.CHM).

Lathunden kommer göra referenser till språk som C/C++/C# och Java eftersom mycket av PHP:s syntax påminner om syntaxer i just dessa språk.

Grundläggande

Precis som de flesta andra språk så bygger även databaskopplingar i PHP på 3 eller 4 steg.

  • anslut till databas
  • utför kommando (SQL-sats)
  • eventuellt manipulera poster
  • stäng anslutning

Den största skillnaden på funktioner för olika databashanterare är bl.a. namn på metoder. MySQL skiljer sig dock en del från andra databashanterare genom att vi kan använda både ett funktionsbaserat och, ett nyatre, objektbaserat gränssnitt. Denna beskrivning bygger på det objektbaserade gränssnittet och kräver (?) PHP version 5 (då MySQLi-extensionen inte verkar finnas i tidigare versioner av PHP).

En MySQL-server är en databashanterare, d.v.s. den kan innehålla flera databaser. Detta innebär bl.a. att vi kan ansluta till flera databaser i en och samma PHP-sida. (Som standard skapas två databaser när MySQL installeras: mysql, som innehåller metadata om databaser och användare, och test, som är tänkt att användas för att testa MySQL. Lämpligen skapas en databas för varje användare och/eller applikation samt en användaridentitet, med tillhörande lösenord, för respektive databas.)

Nedan beskrivs hur man ansluter till en databas - det som blir den förvalda (eller aktiva) databasen.

Öppna (en) databas

För att ansluta till databas skapas en instans (ett objekt) av klassen mysqli. Data om anslutningen bifogas lämpligen som parametrar till klassens konstruktor när instansen skapas.

I exempel nedan deklareras variabler för respektive parameter som behövs för att ansluta till en MySQL-databas, d.v.s. adress till databashanterare, användaridentitet i databas, lösenord till användaridentitet och databas som ska anslutas till. Först har vi alltså adressen till databashanteraren, d.v.s. servern. Som standard installeras MySQL på port 3306 (därav ":3306" sist i strängen). Om MySQL installerats lokalt så kan vi använda localhost som adress till server.

$strServer = "server.example.com:3306";
$strAnvId = "mysql_anvid";
$strLosenord = "mysql_losenord";
$strDatabas = "test";
 
$db = new mysqli($strServer, $strAnvId, $strLosenord, $strDatabas);

Variabeln $db innehåller nu instansen som representerar anslutningen till databasen, en variabel som vi använder för att utföra kommando mot databasen (t.ex. stänga anslutningen).

Exekvera kommando (SQL-sats)

För att utföra ett kommando använder vi metoden query() i databasinstansen vars enda parameter är SQL-sats som ska utföras. Metoden returnerar olika värden - allt beroende på vilken typ av kommando som utförs: hämta poster (SELECT) eller uppdatera poster (INSERT, UPDATE eller DELETE).

Hämta poster (SELECT)

När vi hämtar poster så returnerar metoden query() posterna i en instans av klassen result om kommando lyckades. Om kommando misslyckas så kommer metoden returnera FALSE.

Även här använder jag en variabel för parametern.

$strSql = "SELECT * FROM studenter";
if($resultat = $db->query($strSql)) {
  //Manipulera poster (se avsnitt nedan)
}
else {
  //Meddela besökare att kommando inte returnerade några poster
}

Variabeln $resultat innehåller nu alla poster från tabellen studenter om SQL-sats utfördes - annars innehåller variabeln FALSE. Detta faktum används i if-sats ovan för att avgöra vad som ska göras. Nästa steg är att manipulera posterna, d.v.s. skriva ut innehållet i posterna (se nästa avsnitt för detta).

Uppdatera poster (INSERT, UPDATE och DELETE)

Även när vi uppdaterar poster så använder vi metoden query(). Skillnaden mot att hämta poster är att metoden returnerar TRUE om SQL-sats utfördes och FALSE om den misslyckades.

$strSql = "INSERT INTO studenter (persnr, namn) VALUES('12', 'Ola')";
$resultat = $db->query($strSql);

Variabeln $resultat kommer som sagt att innehålla TRUE eller FALSE (d.v.s. inte en instans), allt beroende på om SQL-sats lyckades eller inte. För att ta reda på hur många poster som påverkades av (senaste) SQL-sats så kan vi använda egenskapen affected_rows i databasinstansen. Om SQL-sats är ogiltig så returneras ett negativt värde från egenskapen affected_rows.

$intAntal = $db->affected_rows;
print "Antal påverkade poster: $intAntal" ;

Manipulera poster

Med manipulera poster så menar jag hämta poster för att visa och för att uppdatera poster. Att hämta poster har förklarats i stycke ovan liksom uppdatering av poster. Så i detta avsnitt beskrivs hur vi kan använda data i hämtade poster och skriva ut dessa data.

För att hämta data från resultatinstansen så kan vi använda flera olika sätt. Ett av det vanligaste sättet är att hämta en post åt gången. Nedan beskrivs hur vi använder metoden fetch_assoc() för att hämta en post som en vektor - en vektor där index i vektor motsvarar namn på kolumner i SQL-satsen. När metoden anropas så flyttas postpekaren (den till aktuell post) till nästa post. När vi nått sista posten så kommer metoden returnera falskt - ett faktum som vi kan använda för att loopa med en while-sats.

Om vi hämtar poster ur en tabell studenter med kolumnerna "persnr" och "namn" så skulle koden kunna se ut enligt följande:

while($rad = $db->fetch_assoc($resultat) {
  print "studentdata: "  //Skriv ut ledtext
  print $rad['persnr'];  //Skriv ut innehåll i kolumnen persnr
  print " ";             //Skriv ut ett mellanslag
  print $rad['namn'];    //Skriv ut innehåll i kolumnen namn
  print "<br>";          //Skriv ut en radbrytning i HTML
}

Index i vektorn $rad, som returneras från metoden fetch_assoc(), kommer heta samma som kolumnerna i tabellen som SQL-sats hämtade poster från.

Resultatet av koden ovan skull kunna se ut något liknande:

studentdata: 12 Ola
studentdata: 24 Benkt

Stäng databas

Egentligen behöver vi inte stänga anslutning till databas - det sker automatiskt när all kod i webbsida har exekverat färdigt. Men precis som i många andra språk så är det god sed att alltid stänga databasanslutning och det bör ske för att spara resurser på webbservern (bl.a. minne och antalet anslutningar till databas, vilka brukar vara begränsade).

För att stänga en anslutning så använder vi metoden close() i databasinstans.

$db->close();

Till början på sida | Tillbaka till PHP

Länkar

(Kommer... eller???)