dbsys.info

Løsningsforslag til kapittel 12

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:

SQL-skript for Hobbyhuset

Oppgave 1

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);

Oppgave 2

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);

Oppgave 3

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);

Oppgave 4

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>

Oppgave 5

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);

Oppgave 6

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);

Oppgave 7

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);

Oppgave 8

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);

Oppgave 9

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);

Oppgave 10

Løsningsforslag er ikke klart ennå.



Oppgave 11

Løsningsforslag er ikke klart ennå.