logo   PHP - SELECT flere - template.




Udover at SELECT af flere records nok er den mest anvendte API-metode overfor databasen er den også den mest komplekse. Antallet af parametre og funktioner der kan anvendes sammen med SELECT-kommandoen er så stort, at der på det næsten kan sammenlignes med et programmeringssprog.


Når dataene er hentet fra databasen kan de efterfølgende bruges / præsenteres på (mindst) 5 primære måder.


Hent data


PHP start

<?php


Variabler

$opretfil = "varestam_insert.php";
$vare_besk = "";
$vare_billed = "";


Evt. $_GET start.


Evt. $_POST start.


Hent og brug fra database

Benyt den ønskede af de 2 kodemåder.




MySQLi

$query = "SELECT * FROM varestam
    left join produkter on fk_prod_id = prod_id
    left join prodgrupper on fk_prodgr_id = prodgr_id
    order by prodgr_id, prod_navn, vare_navn
    ";
   $result = mysqli_query($db_link, $query) or die (mysqli_error ($db_link));
   $antal = mysqli_num_rows ($result)
if $antal > 0
{


Her indsættes evt. overskrift over uddata.


    while ($row = mysqli_fetch_assoc ($result))
    {

Her indsættes kode til brugen af de selekterede data.

    }
}
else // antal
{
    echo "<p>Der blev ikke fundet nogen data i databasen.</p>";
} // antal




Prepared

$sql = "SELECT vare_id, fk_prodgr_id, fk_prod_id, vare_navn, vare_besk, vare_pris, vare_tilb, vare_tilbpris, vare_tilbfra, vare_tilbtil, prodgr_navn, prod_navn FROM varestam
    left join produkter on fk_prod_id = prod_id
    left join prodgrupper on fk_prodgr_id = prodgr_id
    order by prodgr_id, prod_navn, vare_navn
    ";
$query = $db_link->prepare($sql);
// $query->bind_param('xxxx', $abc, $abc, $abc, $abc );    indgår ikke, da selektionen ikke afgrænset af "Where" - se UPDATE.
$query->execute();
$query->store_result();
$query->bind_result($vare_id, $fk_prodgr_id, $fk_prod_id, $vare_navn, $vare_besk, $vare_pris, $vare_tilb, $vare_tilbpris, $vare_tilbfra, $vare_tilbtil, $prodgr_navn, $prod_navn);
$antal = $query->num_rows;
if $antal > 0
{

Her indsættes evt. overskrift over uddata.

    while ($query->fetch())
   )

Her indsættes kode til brugen af de selekterede data.

    }
   $query->close();
}
else // antal
{
    echo "<p>Der blev ikke fundet nogen data i databasen.</p>";
} // antal




Evt. $_POST slut.


Evt. $_GET slut


PHP slut

?>


Brug hentede data


Hentede data kan bruges på (mindst) 5 måder:

Etablering af array
Liniebaseret tabel
Skemabaseret tabel
Stablede div-bokse
Sidestillede div-bokse


Etablering af array

I while-løkken opsamles dataene til array. Når relevant overføres de efter while-løkken til $_SESSION.

Benyt den ønskede af de 2 kodemåder.

MySQLi:

while ($row = mysqli_fetch_assoc ($result))
{
    $varer[] = $row['vare_id'];
} // while end
$_SESSION['varer'] = $varer;


Prepared:

while ($query->fetch())
{
    $varer[] = $row['vare_id'];
} // while end
$query->close();
$_SESSION['varer'] = $varer;


Liniebaseret tabel

Måden bruges, hvis det er muligt / nødvendigt / hensigtsmæssigt at alle data trukket fra en record vises på samme linie.

Udover tabelfelter til data kan der også indsættes recordspecifikke links til andre programmer (f.eks. UPDATE og DELETE).

Listen vil (når over en minimal størrelse) tabe overskuelighed ved responsivitet.

Benyt den ønskede af de 2 kodemåder.

MySQLi:

if ($antal >0)
{
echo '<div class="table-responsive">'
    echo '<table class="table table-bordered table-hover table-md">';
    echo "<thead><tr>";
    echo "<th>ID</th>";
    echo "<th>Kategori<br />niveau 1</th>";
    echo "<th>Kategori<br />niveau 2</th>";
    echo "<th>Kategori<br />niveau 3</th>";
    echo "<th>Kategori<br />niveau 4</th>";
    echo "<th>Vedlh.</th>";
    echo "</tr></thead><tbody";

    while ($row = mysqli_fetch_assoc ($result))
    {
       echo "<tr>";
       echo "<td>$stm_id</td>";
       echo "<td>$stm_niveau01</td>";
       echo "<td>$stm_niveau02</td>";
       echo "<td>$stm_niveau03</td>";
       echo "<td>$stm_niveau04</td>";

       $onclick = "return confirm(\"Er du sikker på du ønsker at slette kategorien: $stm_niveau01, $stm_niveau02, $stm_niveau03, $stm_niveau04 ?\")";

       echo "<td><a href='stammenu_insert.php?stm_id=$stm_id'><i class='fa fa-plus-square'></i></a> ;</td>";
       echo "</tr>";
    }
    echo "</tbody></table>";
echo '</div>'; // table-responsive slut
}
else


Prepared:

if ($antal >0)
{
echo '<div class="table-responsive">'
    echo '<table class="table table-bordered table-hover table-md">';
    echo "<thead><tr>";
    echo "<th>ID</th>";
    echo "<th>Kategori<br />niveau 1</th>";
    echo "<th>Kategori<br />niveau 2</th>";
    echo "<th>Kategori<br />niveau 3</th>";
    echo "<th>Kategori<br />niveau 4</th>";
    echo "<th>Vedlh.</th>";
    echo "</tr></thead><tbody";

    while ($query->fetch())
    {
       echo "<tr>";
       echo "<td>$stm_id</td>";
       echo "<td>$stm_niveau01</td>";
       echo "<td>$stm_niveau02</td>";
       echo "<td>$stm_niveau03</td>";
       echo "<td>$stm_niveau04</td>";

       $onclick = "return confirm(\"Er du sikker på du ønsker at slette kategorien: $stm_niveau01, $stm_niveau02, $stm_niveau03, $stm_niveau04 ?\")";

       echo "<td><a href='stammenu_insert.php?stm_id=$stm_id'><i class='fa fa-plus-square'></i></a> ;</td>";
       echo "</tr>";
    }
    $query->free_result();
    $query->close();
    echo "</tbody></table>";
echo '</div>'; // table-responsive slut
}
else


Skemabaseret tabel

Den skemabaserede tabel er identisk med den liniebaserede, idet dog
- felterne til en enkelt record fordeles over flere linier (Flere <tr> - </tr>).
- tekstfelter kan gøres længere end talfelter ved "colspan=x"
- billeder kan indsættes ved "rowspan=x"
- layout for skemaet redigeres så dataene kan læses venstre -> højre, linie for linie i et logisk forløb.
- Beskrivelser bør placeres sidst med max. bredde til rådighed.
- Vil være smallere end en liniebaseret tabel
- Vil altid kunne tilpasses til at være på en side med standard Bootstrap-bredde.
- Er uegnet til responsivitet.
- Overskriften opbygges over flere linier så den passer til skemaet.

Der kan f.eks. også indsættes følgende links:

I hver record-linie
UPDATE echo "<td><a class='btn btn-success btn-xs' href='xxx_update.php?xxx_id=$row[xxx_id]'>Ret</a></td>";
DELETE med alert $onclick = "return confirm(\"Er du sikker på du ønsker at slette: $row[xxx_navn] ?\")";
echo "<td><a class='btn btn-warning-outline btn-xs' href='xxx_delete.php?xxx_id=$row[xxx_id]' onclick='$onclick'>Slet>/a</td>";
Udenfor record-linier.
INSERT
Definer variabel øverst i pgm$insertpgm = "xxx_insert.php";
Første linie i overskriftecho "<thead class='thead'><tr><th id='ny' colspan='3'><a class='btn btn-success btn-sm' href='". $insertpgm . "'>Opret ny record</a></th></tr>";
Nederst i "antal - else"echo "<p><a class='btn btn-success' href='". $insertpgm . "'>Opret ny record</a></p>";


Sidestillede div-skemaer

Sidestillede div-skemaer anvendes ofte til billedgallerier og katalogsider på E-handel sites . Billederne eller varedataene vises som rektangler i flere kolonner ved siden af hinanden.


Princippet er det samme, hvadenten det drejer sig om varer, billeder eller andre objekter. (Beskrivelsen nedenforer baseret på billeder med undertekst).


Grundprincippet er, at et antal objekter. - hver især indlejret i en div-boks (her OBJEKT CONTAINER) flyder ned i en div-boks (her YDRE CONTAINER) fra en 'while'-løkke indlejret deri. Float-left sikrer at objekterne automatisk lægger sig ved siden af hinanden fra venstre mod højre så længe der er plads i den ydre container. Når en række er fyldt op, flyder objekterne selv ned og begynder på næste række.


Der anvendes to sæt div-bokse:

  • YDRE CONTAINER
    Uden om det område, der skal benyttes til galleriet, placeres en div-boks: YDRE CONTAINER. Vil nok ofte være brødtekst-kolonnen.
    Placeres UDENOM while-løkken.
  • OBJEKT CONTAINER
    Uden om hvert enkelt objekt, der skal placeres i den ydre container placeres en div-boks: OBJEKT CONTAINER.
    Placeres INDENI while-køkken.


Div-boksene CSS-styres således (kan gøres mere detaljerede efter behov):


YdreObjekt
.ydre{
width: nnn px;
...
}
.objekt{
float: left;
width: nnnpx;
...
}


Bredden på den YDRE div-boks og OBJEKT-boksene tilpasses, så der kan være det ønskede antal objekter i hver række.


Koden kan se sådan ud som skabelon:


echo "<div class='ydre'>"; // START PÅ YDRE CONTAINER
    while($row = mysqli_fetch_assoc ($result))
    {
       echo "<div class='objekt'>"; // START PÅ OBJEKT CONTAINER
.....data
       echo "</div>"; // SLUT PÅ OBJEKT CONTAINER
    } // while slut
echo "<div class='clearboth'></div>";
echo "</div>"; //SLUT PÅ YDRE CONTAINER


og sådan med data:


if ($antal > 0)
{
    echo "<div class='ydre'>"; // START PÅ YDRE CONTAINER
       while($row = mysqli_fetch_assoc ($result))
       {
          echo "<div class='objekt'>"; // START PÅ OBJEKT CONTAINER
          echo "<a href='tilbehoer02.php?kat_id=" . $row['kat_id'] . "'><img src='...sti../". $row['kat_bill'] . "'/></a>";
          echo "<div> <a href='tilbehoer02.php?kat_id=" . $row['kat_id']. "&kat_navn=" . $row['kat_navn']. "'>";
          echo "<p>".$row['kat_navn'] . "</p>";
          echo "</a></div>";
          echo "</div>"; // SLUT PÅ OBJEKT CONTAINER
       } // while slut
   echo "<div class='clearboth'></div>";
   echo "</div>"; //SLUT PÅ YDRE CONTAINER
}


Den ydre container placeres udenom det samlede 'while'-kompleks, mens objekt containerne placeres indeni 'while'-løkken.


Ved responsivitet vil det nok være nødvendigt at bibeholde fast bredde for objekterne. Hvert enkelt objekt opbygges som en selvstændig ".row-boks". Der er derved 12 kolonner til rådighed til opbygning af indhold.
Den ydre container kan derimod være responsiv med objekt-bredden som minimum bredde.


Stablede div-skemaer

Stablede div-skemaer anvendes ofte til katalogsider på E-handel sites . Breddemæssigt bruger de hele den plads, der er til rådighed i f.eks. brødtekstkolonnen.


Koden kan se sådan ud som skabelon:


    while($row = mysqli_fetch_assoc ($result))
    {
       echo "<div class='objekt'>";
.....data
       echo "</div>";
    } // while slut


og sådan med data:


if($antal > 0)
{
    while($row = mysqli_fetch_assoc ($result))
    {
       echo "<div>";
       echo "<a href='tilbehoer02.php?kat_id=" . $row['kat_id'] . "'><img src='...sti../". $row['kat_bill'] . "'/></a>";
       echo "<div> <a href='tilbehoer02.php?kat_id=" . $row['kat_id']. "&kat_navn=" . $row['kat_navn']. "'>";
       echo "<p>".$row['kat_navn'] . "</p>";
       echo "</a></div>";
       echo "</div>";
    } // while slut
}



Stablede div-kolonner

Stablede div-kolonner anvendes ofte til artikeloversigter i blogs etc.


Den grundlæggende opbygning er identisk med "Stablede div-skemaer" ovenfor. Den simplere interne opbygning medfører dog, at den i større udstrækning vil være egnet til responsivitet.





















x
x