| 5. | Databaser (MySQL) |
| 5.1 | Initiering |
| 5.2 | Sökning |
| 5.3 | Ändring |
| 5.4 | Extra |
| __________________________ | |
Om PHP är den första gudomliga gåvan så är MySQL den andra. Båda är gratis, fungerar perfekt ihop och är både snabba, robusta, och enkla. När du surfar runt på olika forum så kanske du inte direkt har tänkt på hur de fungerar bakom kulisserna, dvs koden som driver dem. Alla forum har i grund och botten samma princip (förutom vissa väldigt små, simpla forum), de har en databas som lagrar alla trådar, inlägg, användare osv. En databas består av flera tabeller där varje tabell har ett visst antal kolumner. Varje kolumn kan användas för ett visst ändamål och varje rad är en ny post (eller inlägg om det nu är ett forum).
Vi tar ett exempel med lite användare. Varje användare har ett unikt id, namn och efternamn. En sådan tabell med fem stycken poster skulle kunna visualiseras så här:
Databaser har den funktionen att man kan söka i dem väldigt snabbt, t ex att ta fram alla användare som matchar en viss förfrågan. Man kan om man vill få ut alla personer som har namnet Astor genom en enkel liten sökning. Det gör dem väldigt användbara till forum då man snabbt kan få ut alla trådar/inlägg som hör till vissa forumsdelar/trådar. Man kan även låta databasen sortera dem i en viss ordning innan man får resultatet.
Innan kan man komma åt MySQLs databasinnehåll så måste man koppla upp sig mot den, databasen behöver alltså inte ligga på samma dator som sidan. En MySQL-databas kan innehålla flera databaser vilket kan användas för t ex webbhotell då olika användare inte ska komma åt varandras lagrade data, dvs man måste välja vilken databas som man vill använda också.
<?php
mysql_connect("localhost", "användarnamn", "lösenord") or die(mysql_error());
mysql_select_db("databasnamnet") or die(mysql_error());
?>
Det som står efter de två funktionerna (or die(mysql_error())) kommer köras om funktionerna misslyckas och därmed skriva ut det senaste felet som hände i MySQL för att sen stänga av scriptet. Det är långt ifrån nödvändigt men kan bespara en väldigt mycket felsökningstid.
Det som gör MySQL och andra databaser så starka är förmågan att söka, dessa sökningar kan vara väldigt simpla men också extremt komplexa för väldigt specifika sökningar. Vi börjar med att göra en sökning i tabellen som jag visade här ovan, och vi ställer inga speciella kriterier, dvs vi ber databasen att plocka fram alla poster den kan hitta.
<?php
$resultat = mysql_query("SELECT * FROM Namnlista");
while ($post = mysql_fetch_assoc($resultat))
{
echo $post["namn"] . "<br>";
}
?>
Funktionen mysql_query() ställer själva frågan ("SELECT * FROM Namnlista", går igenom syntaxen senare), svaret lagras i en variabel ($resultat). mysql_fetch_assoc() plockar ut nästa post varje gång den körs så länge det finns en nästa post, finns det inte så returnerar den false och därmed hoppar PHP ut ur while-loopen. För varje loop hamnar posten som hittades i variabeln $post och sen kan man nå varje kolumn för sig genom att använda posten som en ordbok.
Och så var det syntaxen för sökningen.
Lite lätt översatt kan det bli: "Hämta alla kolumner i alla rader från Namnlista". Vill man av någon anledning (av prestandaskäl) inte hämta alla kolumner så kan man skriva namnen på dem separerade med kommatecken istället för stjärnan.
<?php
$resultat = mysql_query("SELECT namn, efternamn FROM Namnlista");
while ($post = mysql_fetch_assoc($resultat))
{
echo $post["namn"] . "<br>";
}
?>
Men det är inte alltid man vill ha alla rader utan att man kanske vill begränsa sig till alla som heter Svensson i efternamn. Då räcker det med att man lägger till lite i söksträngen så fixar MySQL allt sådant åt dig.
<?php
$resultat = mysql_query("SELECT namn, efternamn FROM Namnlista WHERE efternamn='Svensson'");
while ($post = mysql_fetch_assoc($resultat))
{
echo $post["namn"] . "<br>";
}
?>
Översätter vi den frågan får vi: "Hämta kolumnerna namn och efternamn från alla rader där kolumnen efternamn är Svensson från Namnlista". Simpla MySQL-satser är nästan helt självförklarande vilket gör dem lätta att förstå. Givetvis kan man kombinera olika krav med AND, OR och/eller paranteser, precis som med en if-sats.
<?php
$resultat = mysql_query("SELECT namn, efternamn FROM Namnlista WHERE efternamn='Svensson' OR namn='Astor'");
while ($post = mysql_fetch_assoc($resultat))
{
echo $post["namn"] . "<br>";
}
?>
Självklart är alla dessa tabeller/databaser dynamiska, dvs man kan ändra i dem precis som man känner för det. Det görs lika enkelt.
<?php
mysql_query("INSERT INTO Namnlista (namn, efternamn) VALUES ('Bosse', 'Spjut')");
?>
Än så länge har vi inte haft någon speciell användning för kolumnen id, den används främst när man vill hänvisa till just den posten, t ex om man skulle få för sig att ändra någonting eller kanske helt enkelt ta bort den.
<?php
mysql_query("UPDATE Namnlista SET namn='Olle', efternamn='Jönsson' WHERE id=3");
?>
Översättning: "Ändra alla poster i Namnlista som har id 3 så att namn blir 'Olle' och efternamn blir 'Jönsson'". Inte så mycket konstigt med det.
Och för att ta bort poster.
<?php
mysql_query("DELETE FROM Namnlista WHERE id=3");
?>
Ännu mer finns det att lära sig, mycket mer än vad jag vet och/eller kommer orka beskriva, men vissa saker är nästan krav på att man vet.
Sortering av posterna innan de returneras. asc är i stigande ordning och desc är fallande, så har man en kolumn med datum och tid som heter "tid" och man vill sortera så den senaste kommer först så är det "order by tid desc" man vill ha.
Vill man bara ha ett visst antal poster så är det LIMIT man ska använda, # byts ut mot antalet poster man vill ha.