Avatar billede AffiliatePro Nybegynder
20. september 2011 - 01:37 Der er 18 kommentarer og
1 løsning

Udtræk fra database til html tabel

Jeg har forsøgt at få brygget et lille script sammen der kan vise et kategori navn og derefter de forskellige artikler i denne kategori i en tabel. Måden jeg gerne ville have det på er som nedenstående:

<h2>Første kategoris navn</h2>
<table border="1">
<tr>
<td>Artikel 1</td>
<td>Artikel 2</td>
<td>Artikel 3</td>
</tr>
<tr>
<td>Artikel 4</td>
<td>Artikel 5</td>
<td>Artikel 6</td>
</tr>
</table>

<h2>Anden kategoris navn</h2>
<table border="1">
<tr>
<td>Artikel 1</td>
<td>Artikel 2</td>
<td>Artikel 3</td>
</tr>
<tr>
<td>Artikel 4</td>
<td>Artikel 5</td>
<td>Artikel 6</td>
</tr>
</table>

Osv.

Mit nuværende script ser således ud:

<?php
$conn = mysql_connect("localhost", "xxxxxxx", "xxxxxxxxxx")or die(mysql_error());
$db_selected = mysql_select_db("xxxxxxxxxx")or die(mysql_error());
$sql = mysql_query("SELECT
artikler.*, kategorier.*
FROM artikler
JOIN kategorier ON artikler.kategori_id = kategorier.id
ORDER BY kategorier.kategori_titel")or die(mysql_error());
while($row = mysql_fetch_array($sql)) {
echo '<h2>' . $row['kategori_titel'] . '</h2>';
echo '<table border="1">';
$nocols = 3;
$n = 0;
    $n++;
    if($n % $nocols == 1) echo '<tr>';
    echo '<td>' . $row['kort_titel'] . '</td>';
    if($n % $nocols == 0) echo '</tr>';
}
if($n % $nocols != 0) echo '</tr>';
echo '</table>';
mysql_close($conn);
?>
Avatar billede majbom Novice
20. september 2011 - 07:55 #1
prøv lige at tænk en ekstra gang over disse to lige efter hinanden inden i et loop:

$n = 0;
$n++;


den bliver aldrig højere end 1.

og her:

if($n % $nocols == 1) echo '<tr>';
echo '<td>' . $row['kort_titel'] . '</td>';
if($n % $nocols == 0) echo '</tr>';


hvis 3 går op i $n, udskriver du en <tr> og hvis ikke, udskriver du en </tr> - det giver også nogle spøjse resultater.

og så har du først et </table> efter din while, på trods af at du har <table> i starten af din while, det giver en hel masse start-tags og kun ét slut-tag.

prøv med noget á la:

<?php
    $conn = mysql_connect("localhost", "xxxxxxx", "xxxxxxxxxx")or die(mysql_error());
    $db_selected = mysql_select_db("xxxxxxxxxx")or die(mysql_error());
    $sql = mysql_query("SELECT
    artikler.*, kategorier.*
    FROM artikler
    JOIN kategorier ON artikler.kategori_id = kategorier.id
    ORDER BY kategorier.kategori_titel")or die(mysql_error());

    $n = 1;
    $nocols = 3;
    $cat = "";
    while($row = mysql_fetch_array($sql)) {
        if($row['kategori_tital'] != $cat)
        {
            if($cat != '')
            {
                echo "</tr></table>";
            }
            echo '<h2>' . $row['kategori_titel'] . '</h2>';
            echo '<table border="1"><tr>';
            $cat = $row['kategori_titel'];
            $n = 1;
        }
        echo '<td>' . $row['kort_titel'] . '</td>';
        if($n % $nocols == 1) echo '</tr><tr>';
        $n++;
    echo '</table>';
    }
    mysql_close($conn);
?>
20. september 2011 - 08:05 #2
Det du vil er for komplekst til at du kan styre det hele fra en enkel variable $n.  Jeg puslede mig frem til en løsning ved  udenfor while løkken at definere $n og $nocols og yderligere en variabel til at se om man starter på en ny kategori.  Hver gang man starter en ny kategori skal man afslutte table og begynde en ny table undtagen første gang.  Da er der ingen table at afslutte.  Derfor skulle jeg have en fjerede variabel $tableslut.

Her er hvad jeg fandt frem til og har testet. 

$n = 0;
$nocols = 3;
$kat = "";
$tablestart = FALSE;
while($row = mysql_fetch_array($sql))
{
    $kategori = $row['kategori_titel'];
    $korttitel = $row['kort_titel'];
    if($kat != $kategori)
    {
                  if($tablestart) echo "</table>";
        $kat = $kategori;
        $n = 0;
        echo "<h2>$kategori</h2>";
                  echo "<table border='1'>";   
    }
    if($n % $nocols==0) echo "<tr>";
    echo "<td>$korttitel</td>";   
    $n++;
        if($i == $nocols - 1) echo "</tr>";
}
20. september 2011 - 08:06 #3
Jeg så ikke spazz's indlæg før jeg havde sendt mit.  Det er også en mulighed.
Avatar billede kvik-q Nybegynder
20. september 2011 - 13:30 #4
Giv det ikke en HTML fejl, hvis antallet af artikler ikke er deleligt med $nocols (3) ?
20. september 2011 - 14:09 #5
I min test lavede jeg tre kategorier, med henholdsvis 7, 2, og 6 artikler, altså med vilje ikke altid delelig med 3, og jeg får ingen html fejl. 

Men i #2 kom jeg for skade at kopiere en forkert version af min kode.  Her er den rigtige:

$n = 0;
$nocols = 3;
$kat = "";
$tablestart = FALSE;
while($row = mysql_fetch_array($sql))
{
    $kategori = $row['kategori_titel'];
    $korttitel = $row['kort_titel'];
    if($kat != $kategori)
    {
                  if($tablestart) echo "</table>";
        $kat = $kategori;
                  $tablestart = TRUE;
        $n = 0;
        echo "<h2>$kategori</h2>";
                  echo "<table border='1'>";   
    }
    if($n % $nocols==0) echo "<tr>";
    echo "<td>$korttitel</td>";   
    $n++;
        if($n % $nocols == $nocols) echo "</tr>";
}

og med de tre kategorier kaldet kat1, kat2, og kat 3 og de femten artikler kort1 til kort15, får jeg dette, i en tabel der ikke gengives her, men den formatterede version kan ses i http://christianjorgensen.be/AffiliatePro.php

kat1
kort1 kort2 kort3
kort4 kort5 kort6
kort7

kat2
kort8 kort9

kat3
kort10 kort11 kort12
kort13 kort14 kort15
Avatar billede AffiliatePro Nybegynder
20. september 2011 - 14:18 #6
Jeg vil lige forsøge at svare alle tre indlæg på en gang.

splazz:
Koden i dit eksempel kommer til at se lidt sjovt ud, lige nu ser den ud som nedenstående hver gang den udskriver endnu en artikel.

<td>Artikel 1</td></tr><tr></table><td>Artikel 2</td></table><td>Artikel 3</td></table>

Christian_Belgien:
Jeg har lige prøvet at teste dit forslag, den sætter dog aldrig et </table> tag, for at afslutte tabellen, hvordan jeg kan få det sat ind, er jeg vist ikke hardcore nok i php til at kunne.

kvik-q:
Godt spørgsmål, jeg er ikke så stærk i php endnu til at kunne svare på det. Men det lyder som en problemstilling jeg skal have løst.

Men tak for jer indputs indtil videre, og forsæt gerne :)
Avatar billede AffiliatePro Nybegynder
20. september 2011 - 14:22 #7
Christian_Belgien:
Jeg har lige prøvet at køre din nye kode, og den virker ganske rigtigt som du siger, den sætter dog aldrig det afsluttende </table> i den sidste åbne tabel.
20. september 2011 - 17:12 #8
Ja det ser mærkeligt ud.  Koden danner tabellerne, men når man ser på den html kode der dannes af php scriptet, så mangler ikke alene </table> taggene men også </tr> taggene.  Jeg har nu 'flettet' php og html, så alle html tags står udenfor php koden, og nu dannes alle tags.  Her er min resulterende 'flettede' kode:

$n = 0;
$nocols = 3;
$kat = "";
$tablestart = FALSE;
while($row = mysql_fetch_array($sql))
{
    $kategori = $row['kategori_titel'];
    $korttitel = $row['kort_titel'];
    if($kat != $kategori)
    {
        $kat = $kategori;
                  if($tablestart)
                  {
                  ?>
                  </table>
                  <?php
                  }
                  $tablestart = TRUE;
        $n = 0;
                  ?>
        <h2>
                  <?php echo $kategori
                  ?>
                  </h2>
                  <table border='1'>
                  <?php
    }
    if($n % $nocols==0)
        {
          ?>
          <tr>
        <?php
        }
        ?>
          <td><?php echo $korttitel
          ?></td>
        <?php   
    $n++;
        if($n % $nocols == 0)
        {
          ?>
          </tr>
          <?php
        }
}
?>
</table>
Avatar billede AffiliatePro Nybegynder
20. september 2011 - 21:17 #9
Alle tags dannes ikke helt endnu, men den nærmer sig bestemt. Lige nu glemmer den </tr> tagget, hvis der er mindre end 3 artikler i en række. Scriptet burde vel egentlig bare oprette to tomme celler i rækken hvor der kun står en artikel.

Koden den lige nu udskriver ser sådan ud:

<h2>Kategori</h2>
<table border='1'>
  <tr>
    <td>Artikel</td>
</table>
20. september 2011 - 21:40 #10
Du stillede et spørgsmål og viste din egen tænkte løsning, der imidlertid fulgte nogle principper der ikke førte til en løsning.  Jeg tror jeg har hjulpet dig et meget langt stykke på vej i den rigtige retning.  Så langt, at det nu må være op til dig, ved at videreudvikle principperne, at få de sidste finesser puslet på plads.  Jeg har brugt meget tid på dette spørgsmål, og jeg er nødt til at stoppe nu.  Hvis du, som jeg, mener jeg har hjulpet, så accepter venligst mit svar (eventuelt til deling med andre.)  Hvis du ikke kan acceptere mit svar, så læg selv et svar til lukning af spørgsmålet.

Eller er det mig der er tosset?
Avatar billede AffiliatePro Nybegynder
20. september 2011 - 22:10 #11
Jeg vil nu tillade mig at holde spørgsmålet åbent lidt endnu, da jeg endnu ikke er kommet frem til den endelige løsning, i forhold til det ønskede resultat som jeg nævner i den første post. Derfor vil jeg lige lade spørgsmålet stå åbnet en dag eller to mere, for at som om andre der har noget input der kan få mig endnu tættere på en endelig løsning.

Men jeg sætte virkelig pris på din hjælp, og du fortjener også en andel af de point som skal afgives ved tråden afslutning.
Avatar billede majbom Novice
21. september 2011 - 07:49 #12
er det det her du leder efter:

http://majbom.com/testarea/exp/947607/ ?
21. september 2011 - 08:11 #13
(..den mangler også </tr> efter den sidste, ikke-med-tre-delelige <td> skønt den har </tr> efter en tidligere ikke-med-tre-delelige <td>.  Jeg kikkede efter af nysgerrighed - skønt det naturligvis må kunne lade sig gøre har jeg måttet stoppe med dette spørgsmål.)
Avatar billede majbom Novice
21. september 2011 - 08:19 #14
der var en lille fejl i den allersidste afslutning ja, den er rettet og kilden ser nu sådan her ud:

<h2>titel1</h2>
<table border="1">
    <tr>
        <td>undertitel1</td>
        <td>undertitel2</td>
        <td>undertitel3</td>
    </tr>
    <tr>
    </tr>
</table>

<h2>titel2</h2>
<table border="1">
    <tr>
        <td>undertitel1</td>
        <td>undertitel2</td>
        <td>undertitel3</td>
    </tr>
    <tr>
        <td>undertitel1</td>
        <td>undertitel2</td>
    </tr>
</table>

<h2>titel3</h2>
<table border="1">
    <tr>
        <td>undertitel1</td>
        <td>undertitel2</td>
        <td>undertitel3</td>
    </tr>
    <tr>
        <td>undertitel1</td>
        <td>undertitel2</td>
        <td>undertitel3</td>
    </tr>
    <tr>
        <td>undertitel1</td>
    </tr>
</table>


det eneste der er, er når modulus er sand, kommer der en tom table-row
21. september 2011 - 09:16 #15
splazz, smukt.  AffiliatePro, jeg foreslår points til splazz - han var først med det oprindelige indlæg, og skønt begge vores forslag resulterer i tabeller med det ønskede indhold (html er åbenbart tolerant overfor visse manglende end-tags) fik han tag'ene på plads.
Avatar billede majbom Novice
21. september 2011 - 10:16 #16
koden:

$n = 1;
$nocols = 3;
$cat = "";
while($row = mysql_fetch_array($sql)) {
    if($row['kategori_titel'] != $cat)
    {
        if($cat != '')
        {
            echo "</tr>\n</table>\n";
        }
        $cat = $row['kategori_titel'];
        echo '<h2>' . $cat . "</h2>\n";
        echo "<table border=\"1\">\n<tr>\n";
        $n = 1;
    }
    echo '<td>' . $row['kort_titel'] . "</td>\n";
    if($n % $nocols == 0) echo "</tr>\n<tr>\n";
    $n++;
}
echo "</tr></table>\n";
Avatar billede AffiliatePro Nybegynder
21. september 2011 - 14:47 #17
Tak splazz, lige hvad jeg søgte, kan du ikke lige ligge et svar? :)
Avatar billede majbom Novice
21. september 2011 - 14:50 #18
det kan du tro :) og selv tak!
Avatar billede majbom Novice
21. september 2011 - 19:39 #19
tfp :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester