Avatar billede Vaffel Nybegynder
25. januar 2012 - 09:23 Der er 19 kommentarer

Udskrift fra database i HTML tabel

Hej!

Jeg har et problem med at udskrive fra min database i en 2*8 HTML tabel. Jeg kan godt få den til at udskrive i en, hvor den kun er 1 felt bred. Således:

    $sql = "select category from products";
    $sqlQuery = mysqli_query($db,$sql) or die(mysqli_error($db));
    $intQuery = mysqli_num_rows($sqlQuery);
    if($intQuery == true){
        while($dbFetch = mysqli_fetch_array($sqlQuery)){
            echo "<table>
                                <tr>
                      <td>"
                                    .$dbFetch['category'].
                  "</td>
                </tr>
                              </table>";
        }   
    }

Men hvordan får jeg det i en 2-felter bred tabel? For hvis jeg sætter td ind to gange, udskriver den bare kategorien dobbelt :(
Avatar billede The_Buzz Novice
25. januar 2012 - 09:35 #1
echo "<table>
    $sql = "select category from products";
    $sqlQuery = mysqli_query($db,$sql) or die(mysqli_error($db));
    $intQuery = mysqli_num_rows($sqlQuery);
    if($intQuery == true){
        while($dbFetch = mysqli_fetch_array($sqlQuery)){
                                <tr>
                      <td>"
                                    .$dbFetch['category'].
                  "</td>
                </tr>";

        }   
    }
echo "</table>";

Du skal ihvertfald have dine <table> og </table>
ud af dine while sætning.

Hvordan du så vil få andet end dine kategorier ud - altså du vil jo have 8 felter ikke? Eller skal det være 1-8 felter med kategorier, hvorefter den skal vise næste 9-16 i næste række?
Avatar billede Vaffel Nybegynder
25. januar 2012 - 09:57 #2
Jeg kan sagtens få det ud i tabellen.
Problemet er bare at få den mere end ét felt bredt. Altså:


|-----------------------|
| Kategori 1| Kategori 2|
|-----------------------|

Men det vil kun se sådan ud:

|-----------|
| Kategori 1|
|-----------|
| Kategori 2|
|-----------|
Avatar billede ggxdg Nybegynder
25. januar 2012 - 10:03 #3
Jeg tænkte lige at det var din brug af
mysqli_fetch_array($sqlQuery)){
da mysqli_fetch_array() da den i den form du bruger den, outputter både assosiativt og numerisk array, så hvis du bare laver en foreach, for at outputte al data, får du nemlig 2 af alle resultater. Det er så ikke tilfældet her, da jeg kan se du bruger arrayet assosiativt.
Men hvis du vil optimere hastighed en lille smule, så brug
mysqli_fetch_assoc($sqlQuery)
eller
mysqli_fetch_array($sqlQuery, MYSQL_ASSOC)
så skulle den kun lave den assosiative.

Men for uden det; din query er sat op til kune at hente "category" fra databasen, så hvis du bruger
".$dbFetch['category']."
i din nummer 2 <td> får du bare en gentagelse



echo "<table>";
    $sql = "select category,foo from products";
    $sqlQuery = mysqli_query($db,$sql) or die(mysqli_error($db));
    $intQuery = mysqli_num_rows($sqlQuery);
    if($intQuery == true){
        while($dbFetch = mysqli_fetch_assoc($sqlQuery)){
            echo "    <tr>\n        <td>".$dbFetch['category']."</td>\n<td>".$dbFetch['foo']."</td>\n    </tr>";
        }   
    }
echo "</table>";
Avatar billede ggxdg Nybegynder
25. januar 2012 - 10:06 #4
Prøv lige at paste din kode som den ser ud med 2 eller flere kolonner
Avatar billede The_Buzz Novice
25. januar 2012 - 10:13 #5
echo "<table>
    $sql = "select category from products";
    $sqlQuery = mysqli_query($db,$sql) or die(mysqli_error($db));
    $intQuery = mysqli_num_rows($sqlQuery);
$i = 0;
    if($intQuery == true){
        while($dbFetch = mysqli_fetch_array($sqlQuery)){
if ($i % 8 == 0 or $i == 0) echo '<tr>'; // hvis $i kan deles med 8 med rest nul eller $i lig nul
echo '<td>;
  echo $dbFetch['category'];
echo '</td>';
if ($i % 8 == 0) echo '</tr>'; // hvis $i kan deles med 8 med rest nul
$i = $i+1;

        }   
    }
echo "</table>";

Ovenstående er ikke færdig, men det giver dig lidt et indtryk af det. Jeg ville lave det i DIV's i stedet...
Avatar billede ggxdg Nybegynder
25. januar 2012 - 10:35 #6
Den første echo helt i toppen skal i hvert fald afsluttes.
Dit script som det burde lave 8 kolonner, ny række, 8 kolloner, ny række, og så videre så længe db'en outputter data. Den sidste række i tabellen, vil dog nok blive lidt funky, da det ikke er sikkert at der er præcist 8 <td></td> hvilket sikkert fungerer alligevel, men det er ikke optimalt.


+------------+------------+-...+------------+
| Kategori  1| Kategori  2| ...| Kategori  8|
+------------+------------+-...+------------+
| Kategori  9| Kategori 10| ...| Kategori 16|
+------------+------------+-...+------------+
| Kategori 17| Kategori 18| ...| Kategori 24|
+------------+------------+-...+------------+

er det rigtigt forstået?
Avatar billede ggxdg Nybegynder
25. januar 2012 - 10:39 #7
men det burde at have hjulpet at få <table></table> ud af while-loopet som #1 skrev.
Avatar billede ggxdg Nybegynder
25. januar 2012 - 10:47 #8
echo "<table>";
    $sql = "select category from products";
    $sqlQuery = mysqli_query($db,$sql) or die(mysqli_error($db));
    $intQuery = mysqli_num_rows($sqlQuery);
    $i = 0;
    if($intQuery == true){
        while($dbFetch = mysqli_fetch_array($sqlQuery)){
            if (($i+1) % 8 == 0 or $i == 0) echo "<tr>";
                echo "<td>.$dbFetch['category'].</td>";
            if (($i+1) % 8 == 0 or $i == 0) echo "</tr>";
            $i++;
        }   
    }
echo "</table>";
Avatar billede Vaffel Nybegynder
25. januar 2012 - 11:06 #9
Mange tak for svarene, men min tabel skal ikke være 8, men 2 felter bred. Altså den vil udvide sig til 8, eller flere, med tiden, jo flere jeg indsætter i databasen :)
Avatar billede ggxdg Nybegynder
25. januar 2012 - 11:38 #10
jeps... men så ændrer du bare bredden:

$antalkolonner = 2;
echo "<table>";
    $sql = "select category from products";
    $sqlQuery = mysqli_query($db,$sql) or die(mysqli_error($db));
    $intQuery = mysqli_num_rows($sqlQuery);
    $i = 0;    if($intQuery == true){
        while($dbFetch = mysqli_fetch_array($sqlQuery)){
            if (($i+1) % $antalkolonner == 0 or $i == 0) echo "<tr>";
                echo "<td>.$dbFetch['category'].</td>";
            if (($i+1) % $antalkolonner == 0 or $i == 0) echo "</tr>";
            $i++;
        }   
    }
echo "</table>";


Jeg kan se du i forvejen tæller antallet af resultater, så kan du jo også lave det hele lidt mere dynamisk, og få den til at udregne antallet af kolonner ud fra antallet som kommer ud af databasen.
Avatar billede ggxdg Nybegynder
25. januar 2012 - 11:39 #11
men fungerer det efter du flyttede table-tags ud af while-loopet, eller driller det stadig?
Avatar billede ggxdg Nybegynder
25. januar 2012 - 11:42 #12
bah... så har jeg jo modificeret koden til at lave </tr> ved $i=0, det skal den jo ikke...

men jeg kom i tanke om at det ville nok være bedst hvis du kunne lave et eller andet der kunne afslutte din <tr> ved sidste række, hvis $i ikke er deleligt med antallet af kolonner
Avatar billede Vaffel Nybegynder
25. januar 2012 - 11:56 #13
Intet af det virker :(
Avatar billede ggxdg Nybegynder
25. januar 2012 - 13:52 #14
ok... back to basics:

  echo "<table><tr>";
  $sql = "select category from products";
  $sqlQuery = mysqli_query($db,$sql) or die(mysqli_error($db));
  $intQuery = mysqli_num_rows($sqlQuery);
  while($dbFetch = mysqli_fetch_array($sqlQuery)){
    echo "<td>".$dbFetch['category']."</td>";
  }
  echo "</tr></table>";


skriver ovenstående alle kategorier ud i 1 række i 1 tabel?

Fandt lige en lille syntaksfejl i mit tidligere forslag, men det skulle være rettet her, og så er det lige småtweaket en smule:

$antalkolonner = 2;
echo "<table><tr>";
    $sql = "select category from products";
    $sqlQuery = mysqli_query($db,$sql) or die(mysqli_error($db));
    $intQuery = mysqli_num_rows($sqlQuery);
    $i = 0;
    if($intQuery == true){
        while($dbFetch = mysqli_fetch_array($sqlQuery)){
            if ((($i+1) % $antalkolonner) == 0) echo "<tr>";
                echo "<td>" . $dbFetch['category'] . "</td>";
            if ((($i+1) % $antalkolonner) == 0) echo "</tr>";
            $i++;
        }
    if (($i % $antalkolonner) != 0) echo "</tr>";
    }
echo "</table>";


Se lige om basics fungerer, hvis det gør så prøv det sidste jeg smed ind her.
Avatar billede Vaffel Nybegynder
25. januar 2012 - 14:40 #15
Basics giver mig et resultat med kategorierne i en tabel, som bare står tværs over siden.
Mens det sidste bare sætter dem alle lodret i en tabel... Hmm.. Den står i en 150px sidebar, men det har vel ikke noget at sige, når der umiddelbart er masser af plads?
Avatar billede ggxdg Nybegynder
25. januar 2012 - 15:13 #16
vil du ikke prøve at smide html kilde koden ind for den tabel, så du bruger den du siger outputter forkert?
Avatar billede Vaffel Nybegynder
25. januar 2012 - 16:21 #17
Altså, den du har foreslået giver mig ikke det ønskede resultat.
Avatar billede ggxdg Nybegynder
25. januar 2012 - 19:41 #18
Så meget har jeg forstået :P
Men kan du ikke loade siden som den ser ud med mit forslag, og så copy paste HTML-koden for den PHP-generede tabel, så jeg kan se hvad der går galt?

Eller bedre endnu, smid et link til siden herinde.
Avatar billede Vaffel Nybegynder
25. januar 2012 - 22:01 #19
Jeg har givet op, ellers tusind tak for din hjælp ;)
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
Computerworld tilbyder specialiserede kurser i database-management

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