Avatar billede Jureco Novice
25. januar 2017 - 12:02 Der er 7 kommentarer og
1 løsning

Kode spørgsmål

Jeg sidder med et projekt, hvor jeg skal have printet en række tabeller ud fra en mysql database. Koden finder selv ud af hvor mange kolonner der er i tabellen og tabelnavnet - jeg kan bare ikke få overført $tal til $max, da den kommer ud med et 0. Der er åbnet for databasen og $max skal bruges længere nede.... men igen - det centrale er $max = $tal, giver 0.....hvad gør jeg forkert.?

  $tablename = "kaffe";
   
    // http://stackoverflow.com/questions/600446/how-do-you-return-the-column-names-from-a-table
   
    $print="<table><tr>";
    $result = $DBH->prepare("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ?");
    $result->bindparam(1,$tablename);
    $result->execute();
    while($kolonnenavn = $result->fetch()){
       
    //    $print = $print . "<tr>";
        for ($tal=0; $tal<=250; $tal++){
            //echo "Tal: " . $tal;
    //    foreach($kolonnenavn as $value2){
        if($kolonnenavn[$tal] <> NULL){
        $print = $print . "<th>".$kolonnenavn[$tal]."</th>";
        $max = $tal;
        }}}
        $print = $print . "</tr>"; 
       
        echo "max: " .  $max;
       
       
       
       
       
        //$print = $print . "<tr><td>".$kolonnenavn[0]."</td></tr>";}
        //$print = $print . "</table>";
   
//    echo $print;
//}   

//if($_SESSION["PHPSESSID"]>=5){
   
    //http://stackoverflow.com/questions/13656667/php-using-a-variable-to-hold-a-table-name-and-using-that-variable-in-queries
    //$print="<table>";
    $statement = $DBH->prepare("SELECT * FROM `{$tablename}`");
    $statement->execute();
   
    while ($row = $statement->fetch()) {
        $print = $print . "<tr>";
        foreach($row as $value2){
        $print = $print . "<td>".$value2."</td>";}
        $print = $print . "</tr>";}
        $print = $print . "</table>";
    echo $print;             
}
Avatar billede jakobdo Ekspert
25. januar 2017 - 14:48 #1
Hvad får du, hvis du printer $max efter denne linje:
$max = $tal;

Tæller den op ?
Avatar billede olsensweb.dk Ekspert
25. januar 2017 - 15:07 #2
har du slået error_reporting og display error til, dere r en del fejl i din code, som du får oplyst når det er slået til.


er du sikker på denne linje er korrekt ??
$result->bindparam(1,$tablename);
burde det ikke være
$result->bind_param("s", $tablename);
http://php.net/manual/en/mysqli-stmt.bind-param.php
http://stackoverflow.com/questions/1676750/mysqli-prepared-statement-in-bindparam-not-working

en quick guide til mysqli
http://www.computerworld.dk/uploads/eksperten-guider/1480-Prepared-Statements-under-MySQLI-kom-igang.pdf


får $max nogle sinde tildelt en værdi ??
kommer du nogle sinde ind i denne 
if ($kolonnenavn[$tal] <> NULL) {
?? (nej)


hvad ønsker du der skal ske her ??

for ($tal=0; $tal<=250; $tal++){
            //echo "Tal: " . $tal;
    //    foreach($kolonnenavn as $value2){
            if($kolonnenavn[$tal] <> NULL){
                $print = $print . "<th>".$kolonnenavn[$tal]."</th>";
                $max = $tal;
            }
    //    }
}
       


er det ikke bare dette du vil have fat i
ref http://stackoverflow.com/questions/1526688/get-table-column-names-in-mysql
SHOW COLUMNS FROM my_table;
Avatar billede Jureco Novice
25. januar 2017 - 23:38 #3
Det som jeg prøver er at få printet tablen ud på skærmen, som den står i databasen. Hvis vi bruger terminologien fra Excel over på databsen, så kan vi ikke være sikker at alle felter i tablen er fyldt ud med data, men vi kan være helt sikker på at hver celle i overskriften er fyldt ud. Så længe der er en kolonnenavn, så længe vil koden ligge værdien over i $max.

Når vi så skal begynde at udskrive content ud fra databasen, så vil $max sat et endshop, for hver række den køre.

PDOen funger og henter content ud af databasen, men det gør den dobbelt, primært fordi jeg forsøgt at kode ud fra foreach, som både printer nummeriske array ud og ikke nummeriske array ud. Ved at lave en for-lykke, forsøger jeg at undgå de ikke numeriske array. Men det lykkes ikke rigtig...

håber det giver mening...

Martin
Avatar billede olsensweb.dk Ekspert
26. januar 2017 - 11:53 #4
OK vi snakker PDO, jeg antog det var mysqli.


>men det gør den dobbelt,
det er pga du fetcher BOTH (default)
http://php.net/manual/en/pdostatement.fetch.php

denne linje
while($kolonnenavn = $result->fetch()){
skal se sådan ud
while ($kolonnenavn = $result->fetch(PDO::FETCH_ASSOC)) {

ved BOTH vil $kolonnenavn indeholde
Array (
[COLUMN_NAME] => id
[0] => id
)
(første genneløb)

Array (
[COLUMN_NAME] => first_name
[0] => first_name
)
(anden genneløb)

hvor det ved ASSOC kun er
Array (
[COLUMN_NAME] => id
)
(første genneløb)

Array (
[COLUMN_NAME] => first_name
)
(anden genneløb)


så dette
for ($tal = 0; $tal <= 250; $tal++) {
    //echo "Tal: " . $tal;
    //    foreach($kolonnenavn as $value2){
    if ($kolonnenavn[$tal] <> NULL) {
        $print = $print . "<th>" . $kolonnenavn[$tal] . "</th>";
        $max = $tal;
        echo "her er  ".$max;
    }
    //}
}
så ved BOTH, vil det virke ved første gennemløb (tal = 0), og blive sat til 0, og derefter fejle
Avatar billede olsensweb.dk Ekspert
26. januar 2017 - 11:54 #5
jeg har omskrevet din code lidt, så du har noget at arbejde ud fra.

<?php
$databasename = "test";
$tablename = "tbl_users";


$hostname = "localhost";
$username = "root";
$password = "";
try {

    $DBH = new PDO("mysql:host=$hostname;dbname=$databasename;charset=utf8", $username, $password);
} catch (PDOException $e) {
    echo $e->getMessage();
}

// http://stackoverflow.com/questions/600446/how-do-you-return-the-column-names-from-a-table
$print = "<table><tr>";
$sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ?";
if ($result = $DBH->prepare($sql)) {
    $result->bindparam(1, $tablename);
    $result->bindparam(2, $databasename);
    $result->execute();
    while ($kolonnenavn = $result->fetch(PDO::FETCH_ASSOC)) {
        $print .= "<th>" . $kolonnenavn['COLUMN_NAME'] . "</th>";
    }
    $print . "</tr>";
    //http://stackoverflow.com/questions/13656667/php-using-a-variable-to-hold-a-table-name-and-using-that-variable-in-queries
    $statement = $DBH->prepare("SELECT * FROM `{$tablename}`");
    $statement->execute();
    while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
        $print = $print . "<tr>";
        foreach ($row as $value2) {
            $print = $print . "<td>" . $value2 . "</td>";
        }
        $print = $print . "</tr>";
    }
    $print = $print . "</table>";
    echo $print;
}

BTW hvorfor anvender du ? som placeholders (numbered/annonyme) i din sql ??
det er nemmere at læse med named placeholders IMHO
http://php.net/manual/en/pdostatement.bindparam.php
Avatar billede Zochko Juniormester
28. januar 2017 - 21:36 #6
Hmm, jeg har lige prøvet noget af din kode af, og det ser for mig ud til, at det er resultatet af din sql der giver problemet.

Sådan som jeg lige ser det så bliver denne del kørt 1 gang:

//    $print = $print . "<tr>";
        for ($tal=0; $tal<=250; $tal++){
            //echo "Tal: " . $tal;
    //    foreach($kolonnenavn as $value2){
        if($kolonnenavn[$tal] <> NULL){
        $print = $print . "<th>".$kolonnenavn[$tal]."</th>";
        $max = $tal;
        }}}

Og da der ikke i dit resultat fra sql er mere end et resultat som giver dig mere eller mindre end null, får du kun sat din $max den ene gang.

Hvad får du af resultat hvis du lige efter:
while($kolonnenavn = $result->fetch()){

prøver at printe $kolonnenavn ud?
print_r($kolonnenavn);
Avatar billede Jureco Novice
28. januar 2017 - 23:57 #7
olsensweb.dk, tak for hjælpen, det virker. .... har skrevet en besked på din facebook profil.
Avatar billede olsensweb.dk Ekspert
29. januar 2017 - 14:16 #8
FB bruger jeg meget sjældent, men jeg har sendt dig et svar på FB
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