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.
Precis som de flesta andra språk så bygger även databaskopplingar i PHP på 3 eller 4 steg.
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.)
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.
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.
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.)
Ä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" ;
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
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
(Kommer... eller???)