Avatar billede svjensen Nybegynder
25. januar 2004 - 15:07 Der er 10 kommentarer og
1 løsning

Vise resultat af sql query

Jeg har brug for at få vist indholdet af en "tilfældig" sql forespørgsel, fx "select * from tabelnavn"

Jeg ønsker at få vist en tabel med feltnavnene i øverste række, og de enkelte værdier i hver sin række.

Jeg forestiller mig noget i stil med nedenstående, men jeg har ikke arbejdet med php så længe, så jeg har brug for lidt hjælp.

$res = mysql_query("select * from table");
<table>
  <tr>
    //Her skal loopes gennem feltnavnene som skrives i hver sin <th></th>
  </tr>

<?
  while ($row = mysql_fetch_row($res)) {
    echo "<tr><td class=TDCenter>$row[0]</td></tr>";
  }?>

</table>
Avatar billede limemedia Nybegynder
25. januar 2004 - 15:26 #1
Ganske utestet, men noget ala følgende eksempel bør virke ...

<?php
    $query = "SELECT * FROM table";
?>
<table>
    <?php
        $sql = mysql_query($query) or die(mysql_error());
        if (mysql_num_rows($sql)) {
            $first = true;
            while ($foo = mysql_fetch_assoc($sql)) {
                if ($first) {
                    echo "<tr>\n";
                    while (list($key, $val) = each($foo)) echo "<th>".$key."</th>\n";
                    echo "<tr>\n\n";
                    reset($foo);
                }

                echo "<tr>\n";
                while (list($key, $val) = each($foo)) echo "<td class=\"TDCenter\">".$val."</td>\n";
                echo "<tr>\n\n";
               
                $first = false;
            }
        }
?>
</table>
Avatar billede svjensen Nybegynder
25. januar 2004 - 15:26 #2
Jeg er kommet lidt videre, men har nu brug for lidt hjælp til at loope igennem felterne indtil der ikke er flere.

Mit script ser således ud indtil videre:
$res = mysql_query("SELECT * FROM $table");?>
<table align=center border=1>
  <tr>
<?  echo "<th>".mysql_field_name($res, 0)."</th>";
    echo "<th>".mysql_field_name($res, 1)."</th>";
?>
  </tr>
<?while ($row = mysql_fetch_row($res)) {
    echo "<tr><td class=TDCenter>$row[0]</td>";
    echo "<td class=TDCenter>$row[1]</td></tr>";
  }?>
</table>
Avatar billede svjensen Nybegynder
25. januar 2004 - 15:34 #3
lars-jensen-> Jeg er stadig for ny i php-verdenen til at genne,skue, om dit forslag har nogle fordele fremfor mit (bortset fra at jeg mangler at loope igennem).

Jeg vil derfor foretrække at arbejde videre med mit eget forslag, da jeg "kan følge med" i det.
Avatar billede limemedia Nybegynder
25. januar 2004 - 15:39 #4
hvad med om vi evt gennemgik eksemplet ... hvis du vil altså - fordelen umiddelbart vil være den kortere kode
Avatar billede svjensen Nybegynder
25. januar 2004 - 15:40 #5
Meget gerne
Avatar billede svjensen Nybegynder
25. januar 2004 - 15:42 #6
Jeg har ingen probæemer ned til din første 'if'.
Jeg går ud fra at den eksekveres såfremt
Avatar billede svjensen Nybegynder
25. januar 2004 - 15:42 #7
... såfremt num_rows er større end nul?
Avatar billede limemedia Nybegynder
25. januar 2004 - 15:56 #8
inkl kommentarer - håber eksemplet er bedre at tygge igennem nu. Ellers spørg, dét er hvad vi er her for

<?php
/*
Database queryen ligger vi i toppen, da du evt vil lave noget generelt og derfor kan det være smart at adskille denne
*/
    $query = "SELECT * FROM table";
?>
<table>
<?php
/*
Udfør SQL kaldet og lig resourcen i $sql
*/
    $sql = mysql_query($query) or die(mysql_error());

/*
Hvis antallet af rækker er større end 0
*/
    if (mysql_num_rows($sql)) {
/*
Da vi i øverste række gerne vil angive felt navnene foruden data, vedligeholder vi en true/false der viser om détte er den første linie
*/
        $first = true;
/*
Iterer query resultatet og lig den aktuelle linie i $foo. Ved at hente med _assoc fremfor _row gemmes disse med feltnavnet fremfor position, altså har vi $foo['feltnavn'] fremfor $foo[0]
*/
        while ($foo = mysql_fetch_assoc($sql)) {
/*
Vores "husker" fra før, er $first true (første linie) så skal vi liste en række table headers med feltnavne
*/
            if ($first) {
                echo "<tr>\n";
/*
Funktionen each anvendes til at iterere resultatet i linien. Vi ved ikke hvor mange felter der er, så denne funktion er smart til at hente et vilkårlig antal. $key vil indeholde feltnavnet mens $val indeholder værdien af feltet
I table headers, er vi således interesseret i at skrive $key
http://dk.php.net/each
*/
                while (list($key, $val) = each($foo)) echo "<th>".$key."</th>\n";
                echo "</tr>\n\n";
/*
Da vi senere igen skal anvende each metoden, og den interne pointer i PHP peger på slutningen af arrayet, skal dette resettes. En ting man ofte kan glemme og som er svær at finde i en debug process
*/
                reset($foo);

/*
Vi har nu vist første linie og kan sætte værdien til false, således vi ikke for alle linier udskriver table headeren
*/
                $first = false;
            }

/*
På samme måde som ved table headeren, udskriver vi nu $val - der jo indeholdte selve værdien fra feltet.
*/
            echo "<tr>\n";
            while (list($key, $val) = each($foo)) echo "<td class=\"TDCenter\">".$val."</td>\n";
            echo "<tr>\n\n";
        }
    }
?>
</table>
Avatar billede limemedia Nybegynder
25. januar 2004 - 15:57 #9
da jeg anvender /* */ omkring mine kommentarer, bør koden kunne køres... jeg tester lige på min egen db, så jeg er sikker på jeg ikke bilder dig noget forkert ind
Avatar billede detox Nybegynder
25. januar 2004 - 16:16 #10
Eksemplet virker ganske vidst, men jeg kan nu bedre lide metoden med mysql_field_name() som svjensen er inde på. Jeg vil gøre det således:

<?php
$tabel = "tabel_navn"; // Navn på tabel der skal vises
require 'db.php'; // Forbindelse til database
$res = mysql_query("select * from $tabel");
$antal = mysql_num_fields($res);
$out = "<table style='border: thin solid black;'><tr>";
for ($i=0;$i<$antal;$i++) {
    $out .= "<th style='border: thin solid; border-color: #0000B0;'>".mysql_field_name($res, $i)."</th>";
}
$out .= "</tr>";
while ($row = mysql_fetch_row($res)) {
    $out .= "<tr>";
    for ($i=0;$i<$antal;$i++) {
        $out .= "<td style='border: thin solid; border-color: #B00000;'>".$row[$i]."</td>";
    }
    $out .= "</tr>";
}
$out .= "</table>";
echo $out;
?>
Avatar billede svjensen Nybegynder
25. januar 2004 - 22:07 #11
Jeg blev afbrydt tidligere af en syg datter, så jeg har først lige fået kigget lidt nærmere på det.

Jeg valgte alligevel at prøve at arbejde videre med din model lars-jensen, om ikke andet så for at lære lidt nyt om php.

Tak for hjælpen
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