Avatar billede aksel Praktikant
22. marts 2013 - 14:57 Der er 17 kommentarer og
1 løsning

Resultatsæt i en tabel

Hej eksperten.
Er der nogen der kan oplyse hvordan man lægger nogen resultater fra en mysql database over i en tabel lavet med php.
Jeg bruger et svar i http://www.eksperten.dk/spm/309524
men jeg kan ikke få de sidste ting i resultatet med i tabellen
mvh Aksel
Avatar billede olebole Juniormester
22. marts 2013 - 16:03 #1
<ole>

Det afhænger helt af, hvordan din DB-tabel ser ud - og hvilke data, du skal have med

/mvh
</bole>
Avatar billede majbom Novice
25. marts 2013 - 11:51 #2
hvordan ser din kode ud og hvad kommer ikke med?

Det er jo svært at hjælpe uden noget info...
Avatar billede Buchwald Novice
29. marts 2013 - 14:47 #3
Den gode gamle mysql-connect - der er blevet opdateret med i (intelligent) og virker hver gang

UDEN at have den fjerneste anelse om hvile datafelter du står og skal hente fra databasen, eller hvordan du ønsker at tabeller tar' sig ud, så virker den hér fremgangsmåde hver gang :

BEMÆRK mysql(i) tillader direkte forbindelse til tabellen
hvor man før kørte en forespørgsel på den respektive tabel

// OPRET FORBINDELSE TIL DATABASE
$con = mysqli_connect($db_localhost, $db_username, $db_password, $db_database);
if (!$con) {
    die('Kunne ikke forbinde til database: ' . mysqli_error());
}

// FORETAG FORESPØRGSEL TIL DATABASE
$con_result = mysqli_query($con, "SELECT * FROM 'tabelnavn');
if (!$con_result) {
    die('Invalid query: ' . mysqli_error());
}

//START TABELLEN FØR LØKKEN (for at undgå gentagelser i kildekoden)
echo "<tabel width=\"300px\" cellspacing=\"0\" cellpadding=\"0\">

//OMDAN FORESPØRGSLEN TIL VARIABEL - her $get['tabelværdi']
WHILE ($get = mysqli_fetch_array($con_result)) {

// HER SKABER DU TABELLENS INDHOLD
echo "<tr>\n";
echo "<td>".$get['tabel_værdi']."</td>\n";
echo "</tr>\n";

} // HUSK AT LUKKE LØKKEN

//AFSLUT MED AT LUKKE FORBINDELSEN TIL DATABASEN
mysqli_close($con);


Håber det var svar nok :) Du skal naturligvis ændre tabellen så den passer til det du skal bruge, men på den her måde er det super nemt at huske hvad man skal hente fra databasen, da det bare er kolonneoverskriften man indsætter vha. variablen $get (eks. echo "Velkommen ".$get['fornavn']." ".$get['efternavn']."\n";
Avatar billede olebole Juniormester
29. marts 2013 - 17:49 #4
<ole>

@techmann: I'et i MySQLI står for improved. Havde det stået for intelligent, havde din kode sikkert set helt anderledes ud. Undskyld, men det kan
være 'en boomerang', når man spiller kæk  *o)

Sådan bør koden nok nærmere se ud:

// OPRET FORBINDELSE TIL DATABASE
$con = mysqli_connect($db_localhost, $db_username, $db_password, $db_database);
if (!$con) {
    die('Kunne ikke forbinde til database: ' . mysqli_error());
}

// FORETAG FORESPØRGSEL TIL DATABASE
$con_result = mysqli_query($con, "SELECT * FROM 'tabelnavn'");
if (!$con_result) {
    die('Invalid query: ' . mysqli_error());
}

// OPRET ET ARRAY TIL HTML'EN
$html = array('<table>');

//OMDAN FORESPØRGSLEN TIL VARIABEL - her $get['tabelværdi']
WHILE ($get = mysqli_fetch_array($con_result)) {
// HER SKABER DU TABELLENS INDHOLD
    $html[] = '<tr>';
    $html[] = '<td>'.$get['tabel_værdi'].'</td>';
    $html[] = '</tr>';
} // HUSK AT LUKKE LØKKEN
// HUSK AT LUKKE TABELLEN
$html[] = '</table>';

// TØM RESULTATET
mysqli_free_result($con_result);
//AFSLUT MED AT LUKKE FORBINDELSEN TIL DATABASEN
mysqli_close($con);

// UDSKRIV TABELLEN
echo implode('', $html);

/mvh
</bole>
Avatar billede Buchwald Novice
29. marts 2013 - 19:01 #5
@olebole
I rest my case. Du har naturligvis ret i at men ved implode et array vil få en mere politisk korrekt løsning
Og for god orden skyld skal jeg da beklage hvis indlægget virker kækt, det er på ingen måde meningen, men udelukkende personligt ønske om at gøre koden mere forståelig overfor de af os der ikke kan pryde os med en cand.merc.altmulig i kodning.
Avatar billede olebole Juniormester
29. marts 2013 - 20:00 #6
Nuvel, 'det kække' skrev jeg også med en tydelig smily - det var ikke ment groft  *o)

Der er faktisk en del deciderede fejl i din kode - udover at array'et nok performer bedre. Du har en escaping-fejl i din query. Den første streng, der echo'es, er ikke afsluttet - hverken med gåseøje eller semikolon. I samme linje er table stavet forkert - og tagget indeholder i øvrigt forlængst deprecated attributter. Der mangler vel også et slut-tag på tabellen - og så er det god skik at tømme et resultatsæt.

Jeg forstår godt argumentet for at bruge echo i hver linje i løkken. Problemet er bare, at netop folk, som 'ikke kan pryde sig med en cand.merc.altmulig i kodning', har det med at tro, at 'sådan koder man'.

Derfor er der også mange, som tror, at udviklere generelt bruger '*' i SQL-queries. Det gør de kun i eksempelkode - og i de få situationer, hvor alle felter i tabellen faktisk skal bruges på siden. Normalt vil en udvikler i stedet bruge en kommasepareret liste af de feltnavne, som skal bruges.

Der er mange af den slags misforståelser, som bunder i forskellen på eksempler og real-life kode. Derfor kunne man vende argumentet 180º og anføre, at det specielt er en skidt idé at vise uhensigtsmæssig - men let overskuelig - kode for folk, som ikke er erfarne udviklere  =)
Avatar billede olebole Juniormester
29. marts 2013 - 20:09 #7
PS: - og så bør man i øvrigt nøjes med at hente et associativt array for hver række, når det er dét, der bruges:

while ($get = mysqli_fetch_array($con_result, MYSQLI_ASSOC)) {

Default er MYSQLI_BOTH, som henter både et talindekseret og et associativt array. Da der ikke er grund til at slæbe rundt på dobbelt mængde data, bør array-typen angives
Avatar billede Buchwald Novice
29. marts 2013 - 22:39 #8
Jeg kan sagtens følge dig i, at man kun henter de data, der er nødvendig - hvorfor bruge resourcer på mere end højst nødvendig. Alt andet lige må det også have en indflydelse på perfomance.
Mht kodeeksemplerne så kan jeg kun give dig ret. Det også min opfattelse at størstedelen der sidder med den fornødne viden har tendens til at spille konger, og forventer at alle forstår den underliggende struktur, i stedet for at forklare den korrekte fremgangsmåde og kommentere koden.

Og i øvrigt RIGTIG MANGE tak for irettesættelsen, kan godt se der er noget hø jeg fik lagt ud dér. Pludselig er der en masse der giver mening !-)
Avatar billede aksel Praktikant
07. april 2013 - 00:12 #9
Hej techmann og ole
tak for jeres svar :)
Jeg ved ikke så meget om MYSQLI - endnu.
jeg har fundet frem til at jeg kan bruge en kode hvor man selv kan se hvor mange søjler man vil have - jeg håber det er rigtigt?
Er der noget der er bedre?

//udtræk fra db
$res = mysql_query("SELECT * FROM `frivillige` ORDER BY Navn LIMIT 0 , 200");

//Hvor mange søjler i tabellen
$ColumnCount = 6;
//echo "column : " .$ColumnCount.'<br/>';
//Hvor mange poster i udtrækket
$RecordCount = mysql_num_rows($res);
//echo "recordcount : " .$RecordCount.'<br/>';
//Hvor mange rækker får vi brug for
$RowCount = (int) ($RecordCount / $ColumnCount) ;
//echo "Row".$RowCount.'<br/>';
echo "<table border=2>\n";
//loop over rækker
for ($i=0;$i<=$RowCount;$i++) {
    echo "\t<tr>\n";
    //loop over søjler
    for ($j=0;$j<$ColumnCount;$j++) {
        echo "\t\t<td >";
        //hvis vi ikke er nået til sidste post
       
        if(($i)*$ColumnCount+$j < $RecordCount) {
            list($id,$navn,$dato,$telefon,$mobil) = mysql_fetch_row($res);
         
            $billede =  "userfiles/$id.jpg";
         
            if (file_exists($billede)) {
           

                echo '<a href="ret.php?id='.$id.'"><img src = "'.$billede.'"/><a/><br/>';
             
            } else {
              echo '<img src = "userfiles/rk-billede.jpg"/><br/>';
            }
echo '<a href="ret.php?id='.$id.'">';
echo  $navn.'</br>';
echo  $telefon.' * '.$mobil.'</br>';
echo '<a/>' ;
             
        }
        echo "</td>\n";
    }
    echo "\t</tr>\n";
}
echo "</table>\n";

mvh Aksel
Avatar billede olebole Juniormester
07. april 2013 - 00:47 #10
Det gamle MySQL-API er dybt forældet og forsvinder helt fra PHP i en af de næste versioner. Det er der ingen, der bruger mere - så det kan kun gå for langsomt med at få lært MySQLI. Virkede det ikke, da du kopierede #4 ind i et dokument og testede?

Ja, der er masser, som er bedre. For det første hænger HTML-koden, som PHP-koden udskriver, heller ikke sammen i #9.

Derudover er det altid en skidt idé at blande PHP-kode ind imellem sidens HTML-kode. De to bør holdes hver for sig. Derfor skriver man ikke HTML ud i løkker, men skriver i stedet til en buffer i form af en streng eller et array.

Du kan separere sprogene ved at skrive PHP-koden som en funktion før din doctype:

<?php
function getTableHtml() {
    // OPRET FORBINDELSE TIL DATABASE
    $con = mysqli_connect($db_localhost, $db_username, $db_password, $db_database);
    if (!$con) {
        die('Kunne ikke forbinde til database: ' . mysqli_error());
    }
   
    // FORETAG FORESPØRGSEL TIL DATABASE
    $con_result = mysqli_query($con, "SELECT * FROM 'tabelnavn'");
    if (!$con_result) {
        die('Invalid query: ' . mysqli_error());
    }
   
    // OPRET ET ARRAY TIL HTML'EN
    $html = array('<table>');
   
    //OMDAN FORESPØRGSLEN TIL VARIABEL - her $get['tabelværdi']
    WHILE ($get = mysqli_fetch_array($con_result, MYSQLI_ASSOC)) {
    // HER SKABER DU TABELLENS INDHOLD
        $html[] = '<tr>';
        $html[] = '<td>'.$get['tabel_værdi'].'</td>';
        $html[] = '</tr>';
    } // HUSK AT LUKKE LØKKEN
    // HUSK AT LUKKE TABELLEN
    $html[] = '</table>';
   
    // TØM RESULTATET
    mysqli_free_result($con_result);
    //AFSLUT MED AT LUKKE FORBINDELSEN TIL DATABASEN
    mysqli_close($con);
   
    // RETURNER TABELLEN PÅ STRENGFORM
    return implode('', $html);
}
?>

- og så udskriver tabellen nede i HTML-koden ved at echo'e et kald til funktionen:

<div><?php echo getTableHtml() ?></div>
Avatar billede aksel Praktikant
07. april 2013 - 14:31 #11
Hej Ole og andre Eksperter
Jeg kunne fint bruge #4 og #10 :)
Men jeg ville gerne have mulighed for selv sætte tabellen op med antal søjler (fx 6) og der skal jeg vel bruge en for løkke??
Jeg var inde og se på hvad det er med mysqli i http://www.eksperten.dk/guide/1480.
Der er noget nyt man skal lære - igen..
Er der nogen der kender en bog om myscli?
mvh Aksel
Avatar billede Buchwald Novice
07. april 2013 - 18:35 #12
Du har helt ret Aksel

Løkken gentager kodesekvens.
Så når du skal bruge en tabel med 6 kolonner vil du kun skulle beskrive "skabelonen" for en række som altså gentages til en færdig tabel.
Sagt med andre ord, så definere du antallet af celler i rækken svarende til antallet af kolonner du ønsker i tabellen.

// OPRET ET ARRAY TIL HTML'EN
  $html = array('<table>');
 
//OMDAN FORESPØRGSLEN TIL VARIABEL - her $get['tabelværdi']
  WHILE ($get = mysqli_fetch_array($con_result, MYSQLI_ASSOC)) {
    // HER SKABER DU TABELLENS INDHOLD
        $html[] = '<tr>';
        $html[] = '<td>'.$get['tabel_værdi1'].'</td>';
        $html[] = '<td>'.$get['tabel_værdi2'].'</td>';
        $html[] = '<td>'.$get['tabel_værdi3'].'</td>';
        $html[] = '<td>'.$get['tabel_værdi4'].'</td>';
        $html[] = '<td>'.$get['tabel_værdi5'].'</td>';
        $html[] = '<td>'.$get['tabel_værdi6'].'</td>';
        $html[] = '</tr>';
    } // HUSK AT LUKKE LØKKEN

// HUSK AT LUKKE TABELLEN
    $html[] = '</table>';



Ønsker du der imod at hente en begrænser del af din database kan du gøre det med LIMIT i forespørgslen.
Her har jeg sat Limit til 5, 5 det vil sige at forespørgslen starter ved 5. række i databasen og henter de efterfølgende 5 rækker (dvs. række 6, 7, 8, 9 og 10)

// FORETAG FORESPØRGSEL TIL DATABASE
$con_result = mysqli_query($con, "SELECT * FROM 'tabelnavn' LIMIE 5, 5");
    if (!$con_result) {
        die('Invalid query: ' . mysqli_error());
    }
Avatar billede Buchwald Novice
07. april 2013 - 18:37 #13
BEMÆRK DER SKAL SELVFØLGELIG STÅ LIMIT

// FORETAG FORESPØRGSEL TIL DATABASE
$con_result = mysqli_query($con, "SELECT * FROM 'tabelnavn' LIMIT 5, 5");
    if (!$con_result) {
        die('Invalid query: ' . mysqli_error());
    }
Avatar billede olebole Juniormester
07. april 2013 - 21:10 #14
Du kunne også gøre sådan:

<?php
function getTableCell($data=null) {
    if ($data) {
        $img_path = 'userfiles/'.$data['id'].'.jpg';
        if (file_exists($img_path)) {
            $img = '<a href="ret.php?id='.$data['id'].'"><img src="userfiles/'.$data['id'].'.jpg"></a>';
        } else {
            $img = '<img src="userfiles/rk-billede.jpg">';
        }
        return '<td>'.$img.'<div><a href="ret.php?id='.$data['id'].'">'.$data['navn'].'<br>'
              .$data['telefon'].' * '.$data['mobil'].'</a></td>';
    } else {
        return '<td></td>';
    }
}
function getTableHtml($num_cols) {
    $mysqli = mysqli_connect($db_localhost, $db_username, $db_password, $db_database);

    if (!$mysqli) {
        die('Kunne ikke forbinde til database: ' . mysqli_error());
    }
   
    $result = $mysqli->query("SELECT id, navn, dato, telefon, mobil FROM tabelnavn");
    if (!$result) {
        die('Invalid query: ' . $mysqli->error);
    }
   
    $inx = 0;
    $html = array('<table><tr>');
    while ($row = $result->fetch_assoc()) {
        if ($num_cols===$inx) {
            $html[] = '</tr><tr>';
            $inx = 0;
        }
        $html[] = getTableCell($row);
        $inx++;
    }
    if ($inx>0) {
        for ($i=$inx; $i<$num_cols; $i++) {
            $html[] = getTableCell();
        }
    }
    $html[] = '</tr></table>';
   
    $result->free();
    $mysqli->close();
   
    return implode('', $html);
}
?>
Avatar billede olebole Juniormester
07. april 2013 - 21:26 #15
- nå ja og så kalde med dette fra din HTML-kode:

<div><?php echo getTableHtml(5) ?></div>

Hvad angår at lære nyt, så er det jo altid et vilkår ved en spritny teknologi. I branchen taler man ofte om en 'videnshalveringstid' på 3 år. Det betyder, at hvis du er væk fra branchen i tre år og ikke holder dig opdateret, er halvdelen af din viden forældet, når de tre år er gået.

Derudover har MySQLI været del af PHP de sidste ni år, så det kan næppe kaldes nyt  =)

Jeg har skrevet denne guide, og ellers er selve dokumentationen her
Avatar billede aksel Praktikant
09. april 2013 - 11:22 #16
Tak Ole.

Jeg har været væk fra "branchen" i 8 år så det er ikke bare halvdelen der er væk  - det nok det hele :)
Men jeg synes det en en sport at sætte ind i det igen - selv om det er svært!!

Jeg er sådan set startet forfra igen og jeg mangler en rigtig begynder bog - om mysqli

Vil du have point - Ole?

mvh Aksel

Tak også til Techmann
Avatar billede olebole Juniormester
09. april 2013 - 13:39 #17
Personligt kender jeg ikke bøger, der omhandler MySQLI, men bøger - som omhandler MySQL 4.1.3 og/eller PHP 5.0 og op - burde omtale MySQLI. At det er tilfældet, kan jeg ikke garantere.

Ellers tak, jeg samler ikke point, så de må gå til andre  =)
Avatar billede aksel Praktikant
22. april 2013 - 23:59 #18
svar
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

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