Avatar billede styrk Nybegynder
02. juli 2007 - 19:46 Der er 11 kommentarer og
1 løsning

indryk og parentid

Hejsa.

Jeg vil gerne lave en bullet-liste med mine artikler i mysql, sådan at det kan bruges til en menu senere (og evt. sitemap) med noget css-styling.

Til dette har jeg bikset følgende script sammen, men kan ikke rigtig få det vist rigtigt - Der kommer alt for mange <ul> og </ul>'s.

    function articlelist($pid = 0, $spaces = 0, $go = 0)
    {
        if ($go)
        {
            $query = sprintf(" id = '%d' ", $pid);
        }
        else
        {
            $query = sprintf(" parentid = '%d' ", $pid);
        }

        $sql = sprintf("SELECT * FROM articles WHERE %s",  $query);
        $q = $this->db->query($sql);


        while($r = $q->row())
        {
            for ($i = 0; $i < $spaces; $i++) { echo "<ul>"; }

            printf ("<li>%s</li>\n", $r[link_title]);

            for ($i2 = $spaces; $i2 > 0; $i2--) { echo "</ul>"; }
           
            $this->articlelist($r[id],$spaces+1);
        }
    }

Håber nogen kan hjælpe :-)
Avatar billede styrk Nybegynder
02. juli 2007 - 19:53 #1
jeg ændrede

        while($r = $q->row())
        {
            for ($i = 0; $i < $spaces; $i++) { echo "<ul>"; }

            printf ("<li>%s</li>\n", $r[link_title]);

            for ($i2 = $spaces; $i2 > 0; $i2--) { echo "</ul>"; }
         
            $this->articlelist($r[id],$spaces+1);
        }


til

        echo "<ul>";
        while($r = $q->row())
        {
            for ($i = 0; $i < $spaces; $i++) { echo "<ul>"; }

            printf ("<li>%s</li>\n", $r[link_title]);

            for ($i2 = $spaces; $i2 > 0; $i2--) { echo "</ul>"; }
         
            $this->articlelist($r[id],$spaces+1);
        }
        echo "</ul>";

- Det hjalp på visningen i browseren, men der er stadig alt for mange ul's hvis man kigger i kildekoden ;o
Avatar billede tmi Nybegynder
02. juli 2007 - 21:16 #2
Brug evt SQL-kommandoen COUNT, så kan du tælle hvor mange underliggende sider den har. Så hvis en side ingen underliggende sider har, skal du ikke kalde lave nogen <ul>.

function list($parent = 0) {

echo "<ul>";

$q = mysql_query("SELECT a1.*, COUNT(a2.id) n FROM articles a1 LEFT JOIN articles a2 ON (a1.id = a2.parentid) WHERE parentid = $parent GROUP BY a2.parentid;");
while ($d = mysql_fetch_assoc($q)) {
echo "<li>".$d["title"]." (".$d["n"]." undersider)</li>";
if ($d["n"]) list($d["id"]);
}
echo "</ul>";

}
Avatar billede styrk Nybegynder
02. juli 2007 - 21:22 #3
Column 'parentid' in where clause is ambiguous

Den har jeg ikke hørt før ;O
Avatar billede tmi Nybegynder
02. juli 2007 - 21:29 #4
nåja,
$q = mysql_query("SELECT a1.*, COUNT(a2.id) n FROM articles a1 LEFT JOIN articles a2 ON (a1.id = a2.parentid) WHERE a1.parentid = $parent GROUP BY a2.parentid;");

Tilføj a1 :-)
Avatar billede styrk Nybegynder
02. juli 2007 - 21:38 #5
# Forside (0 undersider)
# Test (2 undersider)

    * Test11 (0 undersider)

# Sjov sektion (7 undersider)

    * Test2 (0 undersider)


Den lister ikke mere end det.

Mit script ser således ud:


function articlelist($parent = 0)
{

    echo "<ul>\n";

    $q = "SELECT a1.*, COUNT(a2.id) n FROM articles a1 LEFT JOIN articles a2 ON (a1.id = a2.parentid) WHERE a1.parentid = $parent GROUP BY a2.parentid;";
    $hm = $this->db->query($q);
    while ($d = $hm->row())
    {
        echo "<li>".$d[link_title]." (".$d[n]." undersider)</li>\n";

        if ($d["n"])
        {
            $this->articlelist($d["id"]);
        }

        if ($d["n"] == 0 && $d[parentid] > 0)
        {
            echo "</ul>\n";
        }
    }
}

Jeg må indrømme at jeg ikke lige har styr på querys med brug af flere alias osv, det må jeg hellere få læst op på =p
Avatar billede styrk Nybegynder
02. juli 2007 - 21:42 #6
Det er vle fordi den stopper når if($d[n]) er lig 0. Altså når en underside, f.eks test11 ikke har nogle undersider.
Avatar billede tmi Nybegynder
02. juli 2007 - 21:50 #7
</ul> skal være efter while-lykken uanset hvad.
Men den stopper nok fordi du bruger samme objekt til begge queries..
Det kan du ikke gøre når det er rekursivt. Det der DB-objekt har aldrig hjulpet noget :-p gør som jeg skrev.
Bare skriv det her i første linje af filen:
mysql_connect("localhost", "username", "password");
mysql_select_db("databasenavn");

så virker kommandoerne i mit script
Avatar billede styrk Nybegynder
02. juli 2007 - 21:55 #8
Hehe, det er samme resultat:

<?


mysql_connect("localhost", "root", "xxxx");
mysql_select_db("tester");

function list1($parent = 0)
{

    echo "<ul>";

    $q = mysql_query("SELECT a1.*, COUNT(a2.id) n FROM articles a1 LEFT JOIN articles a2 ON (a1.id = a2.parentid) WHERE a1.parentid = $parent GROUP BY a2.parentid;");
    while ($d = mysql_fetch_assoc($q))
    {
        echo "<li>".$d["link_title"]." (".$d["n"]." undersider)</li>";

        if ($d["n"]) list1($d["id"]);
    }

    echo "</ul>";
}

list1();
?>
Avatar billede styrk Nybegynder
03. juli 2007 - 17:52 #9
ok, jeg fandt ud af det :-)

Det hjalp at lave en funktion som tjekkede om der var nogle undermenuer.

Løsningen er som følger:

    function hasChilds($id)
    {
        if ($id > 0)
        {
            $sql = sprintf ('SELECT * FROM articles WHERE parentid = %d', $id);
            $q = $this->db->query($sql);

            return $q->num_rows();
        }
    }

    function articlelist($pid = 0, $spaces = 0)
    {

        $sql = sprintf("SELECT * FROM articles WHERE parentid = %d ",
            $pid);
        $q = $this->db->query($sql);
       

        echo "<ul> \n";
        while($r = $q->row())
        {
           
            echo "<li>$r[link_title]</li> \n";
            /*$this->data[] = Array ( "id" => $r[id],
                                    "parentid" => $r[parentid],
                                    "link_title" => "$r[link_title]",
                                    "spaces" => $spaces);*/

            if($this->hasChilds($r[id]))
            {
                $this->articlelist($r[id], $spaces+1);
            }
        }
        echo "</ul> \n";
    }
Avatar billede styrk Nybegynder
03. juli 2007 - 17:52 #10
Du må gerne lægge et svar, så du kan få points for at peje mig i den rigtige retning :-)
Avatar billede tmi Nybegynder
03. juli 2007 - 18:05 #11
Det var så lidt :-)
Men jeg ville nok gøre noget ala det her i stedet:

function getGroup($parent = 0) {

    $group = array();
    $q = mysql_query("SELECT id, title, menuname FROM sites WHERE pid = '$parent' ORDER BY menuname;");
    while ($d = mysql_fetch_assoc($q)) $group[] = array($d["title"], $d["menuname"], $d["link"], getGroup($d["id"]));

    return $group;
}

print_r(getGroup(0));

Så er du fri for først at selecte undersiderne 2 gange. getGroup(0) returnerer altså et array, hvor sidste element i arrayet er et nyt array med undersider i og så derudad. Så hvis der er nul elementer i arrayet er der ingen undersider.

Men den kan du jo tykke lidt på ;-)
Avatar billede styrk Nybegynder
03. juli 2007 - 20:46 #12
Ok, det havde jeg ikke lige overvejet ;)

Tror jeg vil prøve med din metode til et andet projekt =)
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