PHP & MySQL Del II
Vet att jag tidigare pratat om crud och lite annat. Men jag har inte täckt hur man kommer igång att arbeta med sin databas.
Så tanken är följande
- I Del I så skapar vi en tabell och stoppar in en rad som vi sedan hämtar (länk)
- I Del II bygger vi ett formulär som gör att vi kan fylla en klass t.ex. och skicka till databasen och få svar på det. (länk)
- I Del III har vi flera tabeller med många rader, då ska vi lära oss hur man ställer frågor till databasen mot många tabeller samtidigt och vad vi kan göra med det. (länk)
- I Del IV kommer vi uppdatera data i databasen (länk)
- I Del V kommer vi gå mer på djupet med MySQL-frågor.
Så nu ska vi göra ett formulär så att vi kan fylla på vår databas. Och vem vet. Kanske något sätt att söka. Men först lite ordning och reda. Först skapar vi en mapp som vi döper till “includes” (för filer vi kommer inkludera). I den mappen lägger vi CreateKlass.php,displayKlass.php, config.php. CreateDB.php har vi använt oss färdigt av och den kan man ta bort eller spara på ett bra ställe. Likaså med CreateTable.
Nu ska vi börja skapa våran fil med ett formulär. Vi lägger den i root-katalogen och låter den heta t.ex. index.php eller något sådant bra.
Där skapar vi ett grovt tillhyxat fult formulär. Så att filen ser ut enligt följande
<?php
//vi includerar vår databaskoppling här så att vi har den i framtiden
include ‘includes/config.php’;
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<form method="post" action="includes/CreateKlass.php">
<label>Klassnamn: <input type="text" name="klassNamn"/></label><br/>
<label>Årgång: <input type="text" name="argang"/></label><br/>
<label>Antal elever: <input type="text" name="antalElever"/></label><br/>
<input type="submit" value="Lägg till Klass"/><input type="reset" value="Rensa"/>
</form>
</body>
</html>
Som du ser så sätter vi CreateKlass som action på formuläret. Det innebär att man kommer att kalla på CreateKlass.php med datan i formuläret. Så nu får vi skruva lite på CreateKlass så att den tar emot datan. Datan kommer i en array som heter $_POST när man skickar från ett formulär. Man kan även inkludera insert-metoden och ha en if-sats på den att om $_post innehåller något som kör. Men jag försöker alltid separera html och php visning och funktion så att man också så lätt som möjligt kan återanvända delar. Model View Model kallas modellen för hur man lägger upp sitt arbete. Jag följer tanken men kanske inte hela sättet.
Så efter lite ombyggnad har vi en CreateKlass.php som ser ut enligt följande
<?php
include ‘config.php’;
mysql_select_db($db_name, $link);//vi skapar parametrar för datan vi stoppar in
// $_POST innehåller vår data från formuläret. inom [] anger vi namnet på fältet som vi skickar.
$klassNamn = $_POST['klassNamn'];
$argang = $_POST['argang'];
$antalElever = $_POST['antalElever'];//vi vill att all data ska vara ifylld för att vi ska stoppa in det i databasen
//Vi ställer därför vilkor med if() functionen
//Man kan även kolla detta med ett javascript innan man skickar
if($klassNamn && $argang && $antalElever)
{
// Nu ska vi skapa våran fråga
$sqlInsert = "insert into klasser (klassNamn,argang,antalElever) values(‘$klassNamn’,$argang,$antalElever)";
//vi sätter resultatet av vår fråga till parametern $res. Vid en insert får man tillbaka 1 om det gått bra, annars 0.
$res = mysql_query($sqlInsert, $link) or die(mysql_error());
//Vi måste ju ha möjlighet att veta att allt gått rätt samt komma tillbaka.
$message = "<h1>Klass Tillagd</h1>";
}
// Vi måste ju hantera om något är fel också.
else
{
$message = "<h1>något gick fel</h1>";
//Det är bra att ge info om vilket fält som var tomt
if(!$antalElever)
$message .= "<br>Du hade inte fyllt i antal elever";
if(!$argang)
$message .= "<br>Du hade inte fyllt Årgången";
if(!$klassNamn)
$message .= "<br>Du hade inte fyllt något klassnamn";}
$message .= "<br><a href=’../index.php’>Tillbaka</a>";
echo $message;
?>
Detta är ju en grov väldigt basic tutorial. Senare så måste man skydda sig mot fula inmatningar. Vad blir resultatet om någon t.ex. fyller i <h1>3a</h1> som klassnamn? Testa och kolla (displayKlass.php).
är ju inte så roligt….
Detta kan du läsa lite mer om i “Hjälp! någon Lägger in fula saker i gästboken (länk)”
Vi vill ju också validera och kolla så att det som är i antalElever och argang är numeriska värden.
Så nu har vi en fil som har ett formulär. Vi kan fylla i det och få bekräftat att det hamnat i databasen eller gått fel. Om vi skulle ordna så att vi ser vår data lite prydligare.
Under formuläret i index.php lägger vi till att inkludera includes/displayKlass.php.
Så att dom sista 4:a raderna blir
</form>
<?php include ‘includes/displayKlass.php’; ?>
</body>
</html>
Sedan öppnar vi displayKlass.php. Som vi ska göra om en hel del. Vi ska skapa en tabell som vi lägger in våra klasser i.
<?php
mysql_select_db($db_name, $link);
//vi skapar en fråga
$sqlSelect = "Select * from klasser";$result = mysql_query($sqlSelect, $link) or die(mysql_error());
//vi stoppar in vårat resultat i en array, så blir den enkel att använda
$rows = mysql_fetch_array($result);
//mysql_num_rows kollar hur många poster vi hittade i vår fråga
$num_rows = mysql_num_rows($result);
//Det är dumt att göra något utan rader
if($num_rows > 0)
{
$table = ‘<table>’;
$table .= "<tr style=’background-color:black; color:white;’><th>Klassnamn</th><th>År</th><th>Antal elever</th>";
//Nu ska vi slänga ut raderna i webb-läsaren. Detta kan man t.ex. göra med en do-while loop
do
{
//jag brukar vara bekväm och göra en extract på min array. Det innebär att det skapas enskilda parametrar för allt i array:en.
//t.ex. $rows['klassNamn'] blir $klassNamn. Bra när man inte har allt för mycket parametrar
extract($rows);
$table .= "<tr>";
$table .= "<td>$klassNamn</td>";
$table .= "<td>$argang</td>";
$table .= "<td>$antalElever</td>";
$table .= "</tr>";
}while($rows = mysql_fetch_assoc($result));
$table .= "</table>";
echo $table;
}
else
{
echo "<h1>Inga klasser än</h1>";
}
?>
Outputen för stunden är ju inte så smickrande. Men visst har vi nått vårat mål?
Bifogar för säkerhets skull filerna såhär långt i en zip-fil
Kolla så sakerna hamnar rätt när du zippar upp bara.
I Del III ska vi skapa elever och hänga ihop dom med klasser. Så det kommer bli repetition på det vi gjort i denna delen samt lite till.