Løsningsforslagene er skrevet på enklest mulige måte, som blant annet gjør at en del kodelinjer blir gjentatt (dette er det mulig å unngå). I en virkelig løsning ville koden dessuten vært utvidet med flere feilsjekker for å oppnå en mer robust løsning.
For å teste PHP-skriptene trenger du en MySQL-database som inneholder tabellene i eksempeldatabasen Hobbyhuset. Dette kan gjøres med følgende SQL-skript:
Listing 12.6 utvidet med varenavn (kolonne Betegnelse).
// Må tilpasses til konkret database
$tjener = 'localhost';
$bruker = 'bruker';
$pass = 'passord';
$db = 'Hobbyhuset';
// Åpner forbindelse til databasen.
$link = mysqli_connect($tjener, $bruker, $pass, $db);
if (!$link) {
// Enkel feilhåndtering, bare avslutter med melding.
exit('Feil: Fikk ikke kontakt med databasen.');
}
mysqli_set_charset($link, 'utf8');
// Henter inndata fra brukeren.
// Følgende løsning er enkel, men sårbar for SQL injection (se avsnitt 12.6.2).
$vare = $_POST['vare'];
// Bygger opp en SQL-spørring basert på inndata fra brukeren.
$sql = "SELECT * FROM Vare WHERE Betegnelse LIKE '$vare%'";
// Sender SQL-spørringen til databasen for utførelse
$resultat = mysqli_query($link, $sql);
// Behandler spørreresultatet og skriver ut ny nettside (HTML).
print('<table border="1">');
$rad = mysqli_fetch_assoc($resultat);
while ($rad) {
$vnr = $rad['VNr'];
$betegnelse = $rad['Betegnelse'];
$pris = $rad['Pris'];
print("<tr><td>$vnr</td><td>$betegnelse</td><td>$pris</td></tr>");
$rad = mysqli_fetch_assoc($resultat);
}
print('</table>');
// Lukker forbindelsen til databasen.
mysqli_close($link);
Som oppgave 1, men sortert på varenavn (kolonne Betegnelse).
PHP-koden er identisk, kun SQL-spørringen er endret.
// Må tilpasses til konkret database
$tjener = 'localhost';
$bruker = 'bruker';
$pass = 'passord';
$db = 'Hobbyhuset';
// Åpner forbindelse til databasen.
$link = mysqli_connect($tjener, $bruker, $pass, $db);
if (!$link) {
// Enkel feilhåndtering, bare avslutter med melding.
exit('Feil: Fikk ikke kontakt med databasen.');
}
mysqli_set_charset($link, 'utf8');
// Henter inndata fra brukeren
// Følgende løsning er enkel, men sårbar for SQL injection (se avsnitt 12.6.2).
$vare = $_POST['vare'];
// Bygger opp en SQL-spørring basert på inndata fra brukeren.
$sql = "SELECT * FROM Vare WHERE Betegnelse LIKE '$vare%' ORDER BY Betegnelse";
// Sender SQL-spørringen til databasen for utførelse
$resultat = mysqli_query($link, $sql);
// Behandler spørreresultatet og skriver ut ny nettside (HTML).
print('<table border="1">');
$rad = mysqli_fetch_assoc($resultat);
while ($rad) {
$vnr = $rad['VNr'];
$betegnelse = $rad['Betegnelse'];
$pris = $rad['Pris'];
print("<tr><td>$vnr</td><td>$betegnelse</td><td>$pris</td></tr>");
$rad = mysqli_fetch_assoc($resultat);
}
print('</table>');
// Lukker forbindelsen til databasen.
mysqli_close($link);
Som oppgave 1, men presenterer varene i en HTML punktliste i stedet for HTML-tabell.
// Må tilpasses til konkret database
$tjener = 'localhost';
$bruker = 'bruker';
$pass = 'passord';
$db = 'Hobbyhuset';
// Åpner forbindelse til databasen.
$link = mysqli_connect($tjener, $bruker, $pass, $db);
if (!$link) {
// Enkel feilhåndtering, bare avslutter med melding.
exit('Feil: Fikk ikke kontakt med databasen.');
}
mysqli_set_charset($link, 'utf8');
// Henter inndata fra brukeren
// Følgende løsning er enkel, men sårbar for SQL injection (se avsnitt 12.6.2).
$vare = $_POST['vare'];
// Bygger opp en SQL-spørring basert på inndata fra brukeren.
$sql = "SELECT * FROM Vare WHERE Betegnelse LIKE '$vare%'";
// Sender SQL-spørringen til databasen for utførelse
$resultat = mysqli_query($link, $sql);
// Behandler spørreresultatet og skriver ut ny nettside (HTML).
print('<ul>');
$rad = mysqli_fetch_assoc($resultat);
while ($rad) {
$vnr = $rad['VNr'];
$betegnelse = $rad['Betegnelse'];
$pris = $rad['Pris'];
print("<li>$vnr $betegnelse $pris</li>");
$rad = mysqli_fetch_assoc($resultat);
}
print('</ul>');
// Lukker forbindelsen til databasen.
mysqli_close($link);
HTML-skjema for oppdatering av varepriser.
<!DOCTYPE html>
<html>
<body>
<form method = "POST" action = "endre_pris.php">
<p>
VNr:<input type="text" name="vnr" size="10"/>
</p>
<p>
Ny pris:<input type="text" name="pris" size="10"/>
</p>
<p>
<input type="submit" value="Endre pris!"/>
</p>
</form>
</body>
</html>
Oppdatering av varepris basert på HTML-skjema i oppgave 4. Skriptet gis navnet endre_pris.php og plasseres i samme mappe som HTML-skjemaet.
// Må tilpasses til konkret database
$tjener = 'localhost';
$bruker = 'bruker';
$pass = 'passord';
$db = 'Hobbyhuset';
// Åpner forbindelse til databasen.
$link = mysqli_connect($tjener, $bruker, $pass, $db);
if (!$link) {
// Enkel feilhåndtering, bare avslutter med melding.
exit('Feil: Fikk ikke kontakt med databasen.');
}
mysqli_set_charset($link, 'utf8');
// Henter inndata fra brukeren
// Følgende løsning er enkel, men sårbar for SQL injection (se avsnitt 12.6.2).
$vnr = $_POST['vnr'];
$pris = $_POST['pris'];
// Bygger opp og utfører SQL-spørring som endrer prisen på en vare.
$sql = "UPDATE Vare SET Pris = $pris WHERE VNr = '$vnr'";
$resultat = mysqli_query($link, $sql);
// Sjekk om oppdateringen var vellykket og skriv ut melding til bruker.
if ( $resultat ) {
$antallRader = mysqli_affected_rows($link);
print("<p>$antallRader rad(er) ble oppdatert.</p>");
}
else {
print('<p>Oppdateringen feilet!</p>');
}
// Lukker forbindelsen til databasen.
mysqli_close($link);
Nummer og navn på alle kategorier.
// Må tilpasses til konkret database
$tjener = 'localhost';
$bruker = 'bruker';
$pass = 'passord';
$db = 'Hobbyhuset';
// Åpner forbindelse til databasen.
$link = mysqli_connect($tjener, $bruker, $pass, $db);
if (!$link) {
// Enkel feilhåndtering, bare avslutter med melding.
exit('Feil: Fikk ikke kontakt med databasen.');
}
mysqli_set_charset($link, 'utf8');
// Henter alle opplysninger om alle kategorier.
$sql = "SELECT * FROM Kategori";
// Sender SQL-spørringen til databasen for utførelse
$resultat = mysqli_query($link, $sql);
// Behandler spørreresultatet og skriver ut ny nettside (HTML).
print('<table border="1">');
$rad = mysqli_fetch_assoc($resultat);
while ($rad) {
$nr = $rad['KatNr'];
$navn = $rad['Navn'];
print("<tr><td>$nr</td><td>$navn</td></tr>");
$rad = mysqli_fetch_assoc($resultat);
}
print('</table>');
// Lukker forbindelsen til databasen.
mysqli_close($link);
HTML-skjema for registrering av ny kategori.
<!DOCTYPE html>
<html>
<body>
<form method = "POST" action = "ny_kategori.php">
<p>
Kategorinr:<input type="text" name="katnr" size="10"/>
</p>
<p>
Kategorinavn:<input type="text" name="katnavn" size="50"/>
</p>
<p>
<input type="submit" value="Registrer ny kategori!"/>
</p>
</form>
</body>
</html>
PHP-skript ny_kategori.php for registrering av ny kategori.
// Må tilpasses til konkret database
$tjener = 'localhost';
$bruker = 'root';
$pass = '';
$db = 'hobbyhuset';
// Åpner forbindelse til databasen.
$link = mysqli_connect($tjener, $bruker, $pass, $db);
if (!$link) {
// Enkel feilhåndtering, bare avslutter med melding.
exit('Feil: Fikk ikke kontakt med databasen.');
}
mysqli_set_charset($link, 'utf8');
// Henter inndata fra brukeren
// Følgende løsning er enkel, men sårbar for SQL injection (se avsnitt 12.6.2).
$katNr = $_POST['katnr'];
$katNavn = $_POST['katnavn'];
// Bygger opp og utfører SQL-spørring som setter inn en ny kategori.
$sql = "INSERT INTO Kategori(KatNr, Navn) VALUES ($katNr, '$katNavn')";
$resultat = mysqli_query($link, $sql);
// Sjekk om innsettingen var vellykket og skriv ut melding til bruker.
if ( $resultat ) {
$antallRader = mysqli_affected_rows($link);
print("$antallRader rad(er) ble satt inn.
");
}
else {
print('Innsettingen feilet!
');
}
// Lukker forbindelsen til databasen.
mysqli_close($link);
HTML-skjema for å endre navn på en kategori.
<!DOCTYPE html>
<html>
<body>
<form method = "POST" action = "endre_navn.php">
<p>
Kategorinr:<input type="text" name="katnr" size="10"/>
</p>
<p>
Nytt kategorinavn:<input type="text" name="katnavn" size="50"/>
</p>
<p>
<input type="submit" value="Endre navn på kategori!"/>
</p>
</form>
</body>
</html>
PHP-skript endre_navn.php for å endre navn på en kategori.
// Må tilpasses til konkret database
$tjener = 'localhost';
$bruker = 'root';
$pass = '';
$db = 'hobbyhuset';
// Åpner forbindelse til databasen.
$link = mysqli_connect($tjener, $bruker, $pass, $db);
if (!$link) {
// Enkel feilhåndtering, bare avslutter med melding.
exit('Feil: Fikk ikke kontakt med databasen.');
}
mysqli_set_charset($link, 'utf8');
// Henter inndata fra brukeren
// Følgende løsning er enkel, men sårbar for SQL injection (se avsnitt 12.6.2).
$katNr = $_POST['katnr'];
$katNavn = $_POST['katnavn'];
// Bygger opp og utfører SQL-spørring som endrer navnet på en kategori.
$sql = "UPDATE Kategori SET Navn = '$katNavn' WHERE KatNr = $katNr";
$resultat = mysqli_query($link, $sql);
// Sjekk om innsettingen var vellykket og skriv ut melding til bruker.
if ( $resultat ) {
$antallRader = mysqli_affected_rows($link);
print("<p>$antallRader rad(er) ble oppdatert.</p>");
}
else {
print('<p>Oppdateringen feilet!</p>');
}
// Lukker forbindelsen til databasen.
mysqli_close($link);
HTML-skjema for å slette en kategori.
<!DOCTYPE html>
<html>
<body>
<form method = "POST" action = "slett_kategori.php">
<p>
Kategorinr:<input type="text" name="katnr" size="10"/>
</p>
<p>
<input type="submit" value="Slett kategori!"/>
</p>
</form>
</body>
</html>
PHP-skript slett_kategori.php for å slette en kategori.
// Må tilpasses til konkret database
$tjener = 'localhost';
$bruker = 'root';
$pass = '';
$db = 'hobbyhuset';
// Åpner forbindelse til databasen.
$link = mysqli_connect($tjener, $bruker, $pass, $db);
if (!$link) {
// Enkel feilhåndtering, bare avslutter med melding.
exit('Feil: Fikk ikke kontakt med databasen.');
}
mysqli_set_charset($link, 'utf8');
// Henter inndata fra brukeren
// Følgende løsning er enkel, men sårbar for SQL injection (se avsnitt 12.6.2).
$katNr = $_POST['katnr'];
// Bygger opp og utfører SQL-spørring som sletter en kategori.
$sql = "DELETE FROM Kategori WHERE KatNr = $katNr";
$resultat = mysqli_query($link, $sql);
// Sjekk om slettingen var vellykket og skriv ut melding til bruker.
if ( $resultat ) {
$antallRader = mysqli_affected_rows($link);
print("$antallRader rad(er) ble slettet.
");
}
else {
print('Oppdateringen feilet!
');
}
// Lukker forbindelsen til databasen.
mysqli_close($link);
Løsningsforslag er ikke klart ennå.
Løsningsforslag er ikke klart ennå.