Logotyp för Björns studiewebb

PHP och MySQL

Inledning

Denna sida innehåller beskrivningar av hur man ansluter till databaser (främst MySQL) 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 ASP för att försöka underlätta en eventuell övergång från ASP till PHP (som jag håller på med :-). Det kommer också finnas 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 ett prefix. När vi vill ansluta till en MySQL-databas så används funktionen mysql_connect() och om vi vill ansluta till en PostgreSQL-databas så heter funktionen pg_connect(). Med Oracle så heter funktionen något annorlunda, men ändå logiskt (ora_logon()).

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, 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. (Det är alltså möjligt att ange vilken databas, om flera öppnats, som ska vara den förvalda databasen. Detta görs med funktionen mysql_select_db(). Vi kan även bifoga en databasresurs [se nedan] med varje databaskommando som utförs.)

Öppna (en) databas

För att ansluta till databaser använder vi connect-funktioner (i de flesta fall). Dessa funktioner har oftast ett prefix som motsvarar namnet på databashanterare, t.ex. mysql_connect() för MySQL. Funktionerna returnerar vad som kallas en resurs (resource), vad jag kallar en databasresurs, som vi kan använda när vi utför ett kommando.

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 och lösenord till användaridentitet. 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.

$strServer = "server.example.com:3306";
$strAnvId = "mysql_anvid";
$strLosenord = "mysql_losenord";
 
$db = mysql_connect($strServer, $strAnvId, $strLosenord);

Variabeln $db innehåller nu databasresursen som refererar till databasen. Om vi inte öppnar flera databaser så behöver vi (antagligen) endast variabeln för att stänga databasförbindelsen. Den första databasen som öppnas är den förvalda databasen, d.v.s. den som kommando kommer att utföras mot.

Om vi öppnar flera databaser så kan vi t.ex. använda funktionen mysql_select_db() för att gör databas av intresse den förvalda.

Exekvera kommando (SQL-sats)

Med MySQL använder vi funktionen mysql_query() för att utföra ett kommando. Den "enda" viktiga parametern är SQL-sats som ska utföras. Funktionen 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).

Funktion som visas nedan utför kommando mot den förvalda databasen. Om vi endast öppnat en databas så är den den förvalda. Men om vi öppnat flera databaser så kan vi skicka databasresursen för databas av intresse (variabeln $db i exempel ovan) som andra parameter till funktionen.

Hämta poster (SELECT)

När vi hämtar poster så returnerar funktionen mysql_query() posterna i en resurs, vad jag kallar postresurs. Denna postresurs kan vi sen loopa över för att hämta värdena (se Manipulera poster nedan). Om SQL-sats misslyckas så kommer funktionen returnera FALSE.

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

$strSql = "SELECT * FROM studenter";
$resultat = mysql_query($strSql);

Variabeln $resultat innehåller nu alla poster från tabellen studenter om SQL-sats utfördes - annars innehåller variabeln FALSE. 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 funktionen mysql_query(). Skillnaden mot att hämta poster är att funktionen returnerar TRUE om SQL-sats utfördes och FALSE om den misslyckades.

$strSql = "INSERT INTO studenter (persnr, namn) VALUES('12', 'Ola')";
$resultat = mysql_query($strSql);

Variabeln $resultat kommer som sagt att innehålla TRUE eller FALSE, 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 funktionen mysql_num_rows().

$intAntal = mysql_num_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 resultatresursen så kan vi använda flera olika sätt. Ett av de vanligaste sättet är att hämta en post åt gången. Nedan beskrivs hur vi använder funktionen mysql_fetch_array() 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 funktionen anropas så flyttas postpekaren (den till aktuell post) till nästa post. När vi nått sista posten så kommer funktionen 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 = mysql_fetch_array($resultat, MYSQL_ASSOC) {
  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
}

Konstanten MYSQL_ASSOC är det som gör att index i vektorn $rad 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 databasförbindelser 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 förbindelse så använder vi funktionen mysql_close() och som parameter skickar vi databasresursen som returnerades från funktionen mysql_connect().

mysql_close($db);

Till början på sida | Tillbaka till PHP

Länkar

(Kommer... eller???)