Mellemtabel - vedligehold.
Baseret på "tabel / $_GET".
Mellemtabeller anvendes til at etablere dynamisk afhængighed mellem to andre tabeller placeret på 'hver sin side' af mellemtabellen. De anvendes typisk til at tildele rettigheder til indehavere af specifikke roller.
I eksemplet nedenfor er "rolle_og_rettighed" mellemtabel, mens "rolle" og "rettighed" er sidetabeller.
Koden til vedligehold af en melllemtabel kan opdeles i 3 moduler.
- Udtræk fra den ene sidetabel.
- Opbygning af liste med aktive <-atags.
- $_GET-rutiner til opdatering af "roller_og_rettigheder"-tabellen i databasen.
Programmet "kører en omgang" hver gang der trykkes på en <a-tag.
De tre kodedele nedenfor kan sættes sammen til et program.
Udtræk fra den ene sidetabel. |
Visning af alle data fra den mindste / mest stabile sidetabel og selektion af den ident, der aktuelt skal bruges til vedligehold af mellemtabellen. (Her fra tabel "rolle"). Kan også gøres med dropdown menu (update versionen) og POST. |
<table><tr><td style = "width: 350px; border:2px solid black; ">
<ul >
<li><a href='?rolle_id=1'>Admin</a></li>
<li><a href='?rolle_id=2'>Moderator</a></li>
<li><a href='?rolle_id=3'>Medlem</a></li>
<li><a href='?rolle_id=4'>Gæst</a></li>
</ul>
<?php
$rolle_id ="";
$rolle_navn ="";
$fk_rettighed_id = "";
$tekstfarve = "";
if (isset($_GET['rolle_id']))
{
$rolle_id = $_GET['rolle_id'];
$query_rolle = "SELECT * FROM rolle WHERE rolle_id = $rolle_id";
$result_rolle = mysqli_query($db_link, $query_rolle) or die(mysqli_error($db_link));
$row_rolle = mysqli_fetch_assoc ($result_rolle);
$rolle_navn =$row_rolle['rolle_navn'];
echo "Aktuel rolle: ". $rolle_navn . "<br /><br />";
}
else
{
echo "Rolle er ikke valgt<br /><br />";
}
?>
|
Opbygning af liste med aktive <a-tags. |
Udtrækker aktuelle rettigheder for rollen til $akt_rettigheder. Udtrækker alle rettigheder fra "rettighed" til $row_ret. Anvender "$row_ret" til at opbygge tabel med 3 kolonner: "Tilføj", "Fjern" og Rettighedsnavn.
Tilføj opbygges som:
Når rettighed findes i "rettighed"-tabellen, men ikke i "rolle_og_rettighed"-tabellen indsættes <a-tag med URL-parametre ($_GET['rettighed_id']) til at tilføje rettigheden til "rolle_og_rettighed"-tabellen med kode i modul 3.
Når rettighed allerede findes i "rolle_og_rettighed"-tabellen indsættes en passiv tekst.
Fjern op bygges som:
Når rettigheden findes i "rolle_og_rettighed"-tabellen indsættes <a-tag med URL-parametre ($_GET['delete']) til at slette rettigheden i "rolle_og_rettighed"-tabellen med kode i modul 3.
Når rettighed kun findes i "rolle"-tabellen indsættes en passiv tekst.
Alle data fra "rettigheder" skal vises og have en aktiv "Tilføj" eller "Fjern".
|
<!-- Tilføj / fjern -->
<?php
// hent rettigheder for aktuel rolle til array
if($rolle_id != "")
{
// Udtrækker aktuelle rettigheder for rollen til $akt_rettigheder.
$query_akt = "SELECT * FROM rolle_og_rettighed
inner join rettighed on rolle_og_rettighed.fk_rettighed_id = rettighed.rettighed_id
WHERE fk_rolle_id = $rolle_id
order by rettighed.rettighed_id asc ";
$result_akt = mysqli_query($db_link, $query_akt) or die(mysqli_error($db_link));
while ($row_akt = mysqli_fetch_assoc ($result_akt))
{
$akt_rettigheder[$row_akt['rettighed_id']] = $row_akt['rettighed_kodenavn'];
}
else
{
$akt_rettigheder = [];
}
// Udtrækker alle rettigheder fra "rettighed" til $row_ret.
$query_ret = "SELECT * FROM rettighed
order by rettighed_navn asc ";
$result_ret = mysqli_query($db_link, $query_ret) or die(mysqli_error($db_link));
// Anvender "$row_ret" til at opbygge tabel med 3 kolonner: "Tilføj", "Fjern" og Rettighedsnavn
echo "<table>";
while ($row_ret = mysqli_fetch_assoc ($result_ret))
{
echo "<tr>";
// Tilføj (insert)
echo "<td>";
if (!in_array($row_ret['rettighed_kodenavn'] , $akt_rettigheder ))
{
$rettighed_id = $row_ret['rettighed_id'];
echo "<a class='blue' href='?insert=insert&rolle_id=$rolle_id&rettighed_id=$rettighed_id'>Tilføj</a>";
$tekstfarve ="red";
}
else
{
echo "<span class='grey'>Tilføj</span>";
}
echo "</td>";
//Fjern (delete)
echo "<td>";
if (in_array($row_ret['rettighed_kodenavn'] , $akt_rettigheder ))
{
$rettighed_id = $row_ret['rettighed_id'];
echo "<a class='blue' href='?delete=delete&rolle_id=$rolle_id&rettighed_id=$rettighed_id'>Fjern</a>";
$tekstfarve ="green";
}
else
{
echo "<span class='grey'>Fjern</span>";
}
echo "</td>";
echo "<td class='$tekstfarve'>" . $row_ret['rettighed_navn'] . "</td></tr>";
}// while slut
echo "</table>";
} // Tilføj / fjern slut
?>
</td></tr></table>
|
$_GET-rutiner til opdatering af "roller_og_rettigheder"-tabellen i databasen. |
Modulet består af to dele der begge vedligeholder "rolle_og_rettighed"-tabellen:
$_GET['insert'], der modtager URL-parameter fra "Tilføj". Den DELETEr først den aktuelle rolle / rettighed kombination for at undgå doubletter. Derefter INSERTes den samme kombination.
$_GET['delete'], der modtager URL-parameter fra "Fjern". Den DELETEr den aktuelle rolle / rettighed kombination.
|
<?php
// Indsæt rolle / rettighed
if (isset($_GET['insert']))
{
$rolle_id = $_GET['rolle_id'];
$rettighed_id = $_GET['rettighed_id'];
// Slet før indsæt
$query_delete = "DELETE FROM rolle_og_rettighed WHERE fk_rolle_id = $rolle_id and fk_rettighed_id=$rettighed_id ";
$result_delete = mysqli_query ($db_link, $query_delete) or die (mysqli_error() );
// Indsæt
$query_insert = "
INSERT INTO rolle_og_rettighed
( fk_rolle_id, fk_rettighed_id ) VALUES
('$rolle_id', '$rettighed_id')
";
$result_insert = mysqli_query ($db_link, $query_insert) or die (mysqli_error ($db_link));
header ("Location: ?rolle_id=$rolle_id");
exit;
}
// slet rolle / rettighed
if (isset($_GET['delete']))
{
$rolle_id = $_GET['rolle_id'];
$rettighed_id = $_GET['rettighed_id'];
$query_delete = "DELETE FROM rolle_og_rettighed WHERE fk_rolle_id = $rolle_id and fk_rettighed_id=$rettighed_id ";
$result_delete = mysqli_query ($db_link, $query_delete) or die (mysqli_error() );
header ("Location: ?&rolle_id=$rolle_id");
exit;
}
?>
|
|