Avatar billede kjaergaard_anders Nybegynder
09. januar 2013 - 07:42 Der er 5 kommentarer og
1 løsning

output sprintf loop igennem str_replace

jeg har det her mysqli loop, jeg bruger echo sprintf til at udskrive og det fungere, men det bliver udskrevet i toppen af siden, det er jo ikke css stylet endnu.

if ($stmt = $mysqli->prepare("SELECT sider.sideid, sider.sidenavn FROM sider")){
    $stmt->execute();
        $stmt->bind_result($sideid, $sidenavn);
        while ($stmt->fetch()){       
    $txt = sprintf("<a href='%s'> %s </a> ", $sideid, $sidenavn);       
        echo $txt;
}
        $stmt->close();
    }else{
        printf("Prepared Statement Err: %s\n", $mysqli->error);
}

men hvis jeg nu gerne vil placere mysqli loopet et andet sted,
og jeg fjerner echo $txt og bruger en placeholder på mit design.htm, som hedder %%txt%% og jeg bruger

$skabelon = file_get_contents('design.htm', true);
$skabelon = str_replace("%%txt%%",$txt, $skabelon);
echo $skabelon;

så kommer $txt = sprintf("<a href='%s'> %s </a> ", $sideid, $sidenavn); ikke frem i mit output ??

kan man ikke bruge sprintf sammen med str_replace, og hvad vil være en bedre tilgang til visning af mysqli loopet, det rigtig sted i designet???
Avatar billede majbom Novice
09. januar 2013 - 09:07 #1
$txt vil jo kun indeholde den sidste side i de rækker du hiver ud - du overskriver $txt for hver iteration af dit loop
Avatar billede kjaergaard_anders Nybegynder
09. januar 2013 - 11:09 #2
Ja det stemmer, den sidste række var en tom række, den har jeg fjernet nu, og nu viser den kun den sidste række fra databasen. Det er jo ikke optimalt. Kan jeg lave mysqli sætningen om til en function, sådan at jeg kan udskrive databasen, det sted jeg har brug for det i mit design ??
Avatar billede majbom Novice
09. januar 2013 - 12:57 #3
hvad er det præcis du vil have vist? en liste over de rækker du trækker ud, eller?
Avatar billede arne_v Ekspert
09. januar 2013 - 17:52 #4
Jeg lavede dette her til et andet spoergsmaal.

Og det har en ekstra kroelle med to tabeller og 1:M.

Men alligevel kan det maaske give lidt inpisration:

<?php
class Main {
    public $txt;
    public $subs;
    public function __construct($txt) {
        $this->txt = $txt;
        $this->subs = array();
    }
};

class Sub {
    public $nam;
    public function __construct($nam) {
        $this->nam = $nam;
    }
};

function load() {
    $data = array();
    $con = new mysqli('localhost', 'root', '', 'Test');
    $stmt = $con->prepare('SELECT main.txt,subs.nam FROM main LEFT JOIN subs ON main.id=subs.main_id ORDER BY main.txt;');
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($maintxt, $subnam);
    $ix = 0;
    $lastmaintxt = '>>>>BOF<<<<';
    while($stmt->fetch()) {
        if($maintxt != $lastmaintxt) {
            $ix++;
            $data[$ix] = new Main($maintxt);
            $lastmaintxt = $maintxt;
        }
        if($subnam != null) $data[$ix]->subs[] = new Sub($subnam);
    }
    $stmt->close();
    $con->close();
    return $data;
};

function display_as_lists($data) {
    echo "<ul>\r\n";
    foreach($data as $main) {
        echo "<li>$main->txt</li>\r\n";
        echo "<ul>\r\n";
        foreach($main->subs as $sub) {
            echo "<li>$sub->nam</li>\r\n";
        }
        echo "</ul>\r\n";
    }
    echo "</ul>\r\n";
};

function display_as_table($data) {
    echo "<table border='1'>\r\n";
    echo "<tr><th>Text</th><th>Name</th></tr>\r\n";
    foreach($data as $main) {
        echo "<tr>\r\n";
        $n = count($main->subs);
        echo "<td rowspan='$n'>$main->txt</td>\r\n";
        for($ix = 0; $ix < $n; $ix++) {
            if($ix > 0) echo "</tr>\r\n<tr>\r\n";
            $sub = $main->subs[$ix];
            echo "<td>$sub->nam</td>\r\n";
        }
        echo "</tr>\r\n";
    }
    echo "</table>\r\n";
}

$data = load();
display_as_lists($data);
display_as_table($data);

?>
Avatar billede kjaergaard_anders Nybegynder
10. januar 2013 - 16:00 #5
Hej Arne tak for scriptet, det fungere rigtig godt, og jeg lære også  en del ved at kik det igennem.

Smider du et svar ?
:-)
Avatar billede arne_v Ekspert
10. januar 2013 - 18:36 #6
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
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