php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.05.2006, 20:55  
Neuer Benutzer
 
Registriert seit: 04.03.2005
Beiträge: 10
PHP-Kenntnisse:
Fortgeschritten
netdirk
netdirk eine Nachricht über Skype™ schicken
Standard rekursion in php

ich stehe schon seit tagen bei dem thema total auf dem schlauch.
ich möchte einen navigationsbaum darstellen. wenn man auf einen punkt klickt öffnet er sich. dachte das ich das mit ner rekursion lösen könnte. aber rigendwie klappt es nicht.

parent definiert den mutterpunkt sozusagen,
open wird per get übergeben und soll den punkt bezeichnen der jetzt geöffnet werden soll.
hier mein code:

Code:
function show_navi($parent, $open, $depth = 0)
{
    global $a_db, $PHP_SELF;

    echo $open;

    $sql = "
    SELECT
        *
    FROM
        rubrik ru
    WHERE
        ru.parent = '".$open."'";

    #echo $sql;
    $query = mysql_query($sql,$a_db);

    if( mysql_num_rows($query) )
    {
        echo '<ul>';
        while($row = mysql_fetch_assoc($query))
        {
            echo '[*]<a href="'.$PHP_SELF.'?open='.$row["id"].'">'.$row["name"].'';

            echo $open.'/'.$row["parent"].'<hr>';
            if( $open == $row["parent"] )
            {
                 echo ''.$row["name"].'';
            }
        }
        echo '[/list]';
    }
}

show_navi(0, $open, 0);
habe schon alles ausprobiert. endweder kriege ich ne endlosschleife. oder ich sehe als ausgabe nur den punkt den ich gerade angeklikkt habe. der mutterpunkt ist verschwunden.
wie löse ich das problem?
netdirk ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 06.05.2006, 21:08  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Wo ist hier die Rekursion?
Zergling-new ist offline  
Alt 06.05.2006, 22:19  
Neuer Benutzer
 
Registriert seit: 04.03.2005
Beiträge: 10
PHP-Kenntnisse:
Fortgeschritten
netdirk
netdirk eine Nachricht über Skype™ schicken
Standard

wo dur echt hast hast du recht:

so ist es richtiger

Code:
function show_navi($parent, $open)
{
    global $a_db, $PHP_SELF;

    echo $open;

    $sql = "
    SELECT
        *
    FROM
        rubrik ru
    WHERE
        ru.parent = '".$open."'";

    #echo $sql;
    $query = mysql_query($sql,$a_db);

    if( mysql_num_rows($query) )
    {
        echo '<ul>';
        while($row = mysql_fetch_assoc($query))
        {
            echo '[*]<a href="'.$PHP_SELF.'?open='.$row["id"].'">'.$row["name"].'';

            echo $open.'/'.$row["parent"].'<hr>';
            if( $open == $row["id"] )
            {
                 show_navi($row["parent"],$open);
            }
        }
        echo '[/list]';
    }
}

show_navi(0, $open, 0);
netdirk ist offline  
Alt 07.05.2006, 10:03  
Erfahrener Benutzer
 
Registriert seit: 13.11.2005
Beiträge: 2.583
xabbuh
Standard

Ein paar Sachen, die mir aufgefallen sind:

Zitat:
Zitat von netdirk
PHP-Code:
global $a_db$PHP_SELF
Was ist $a_db? Warum benutzt du $PHP_SELF und verwendest stattdessen nicht das superglobale $_SERVER-Array?

Zitat:
Zitat von netdirk
PHP-Code:
show_navi(0$open0); 
Warum rufst du show_navi() hier mit drei Argumenten auf, obwohl du die Funktion lediglich mit zwei Parametern definiert hast?

Zusätzlich:
Wie sieht der Code aus, mit du in einer Endlosschleife landest? Mit welchem Code wird dir nur ein Punkt ausgegeben?
Steht error_reporting auf E_ALL? Ist display_errors aktiviert?
Außerdem wären Kommentare und Beispieldatensätze sehr hilfreich.
xabbuh ist offline  
Alt 07.05.2006, 11:00  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Wieviel Datensätze stehen denn in der Datenbank? Wenns es eine überschaubare Zahl ist hol dir auf einmal alle raus und übernimm die tatsächliche Auswahl mit PHP.

So hast du pro Rekursionsaufruf eine Datenbankabfrage. Das ist sehr unschön.
Zergling-new ist offline  
Alt 07.05.2006, 21:43  
Benutzer
 
Registriert seit: 27.07.2005
Beiträge: 72
skaterboy
Standard

php unterstützt doch meiner meinung nach gar keine rekursion oder?
skaterboy ist offline  
Alt 07.05.2006, 22:01  
Erfahrener Benutzer
 
Registriert seit: 13.11.2005
Beiträge: 2.583
xabbuh
Standard

Wo hast du das denn her?
xabbuh ist offline  
Alt 07.05.2006, 22:28  
Neuer Benutzer
 
Registriert seit: 04.03.2005
Beiträge: 10
PHP-Kenntnisse:
Fortgeschritten
netdirk
netdirk eine Nachricht über Skype™ schicken
Standard

@xabbuh
$a_b ist die verbindung zur datenbank
dein einwurf bezüglich $PHP_SELF ist korrekt. ich habe das korrigiert.
auch den aufruf der funktion habe ich korrigiert.
das alles kommt durch das ewige rumprobieren und ire´gendwie komme ich keinen schritt weiter

@zergling
die funktion benögiutge ich für ein projekt in dem man selbst die rubriken festelgen und ineinader verschachteln kann. maximal denke ich wird man vieleicht auf 50 rubriken kommen. mehr habe ich bisher noch nirgendwo entdecken können.

ich habe jetzt alles nochmal überarbeitet. das war ein vorschlag aus einem anderen forum. herausgekommen ist eine endlosschleife.
weiß echt nicht was ich falsch mache.

ich will doch nur eine baumstruktur in der sich die unterpunkte per klick öffnen. was ist falsch?

Code:
function show_navi($parent, $open)
{
    global $a_db, $_SERVER["PHP_SELF"];
    
    $sql = "
    SELECT
        *
    FROM
        1_rubrik ru, 
    WHERE
        ru.parent = '".$parent."'";

    $query = mysql_query($sql,$a_db);

    if( mysql_num_rows($query) )
    {
        echo '<ul>';
        while($row = mysql_fetch_assoc($query))
        {
            echo '[*]<a href="'.$_SERVER["PHP_SELF"].'?open='.$row["id"].'">'.$row["name"].'';

            if( $open == 0 )show_navi(0, $open);
            else show_navi($open, $row["parent"]);
        }
        echo '[/list]';
    }
}
netdirk ist offline  
Alt 07.05.2006, 23:36  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hm das wären ja im Worst-Case 50 Datenbank Abfragen. Das ist zuviel.

Das Problem könnte sein, dass du tatsächlich eine Endlosschleife hast (schon in der Datenbank).

Aber ich sehe gerade warum du eine Endlosschleife hast. Du übergibst der Funktion ja immer wieder $parent = 0. Das kann ja nichts werden.
Du musst ihr einen Wert aus $row zuordnen (da du beim SELECT * benutzt, weiß ich nicht welche Spalten es gibt http://www.php-faq.de/q/q-sql-select.html)

Edit: Dein Skript ist Banane:
Prototyp: show_navi($parent, $open)
Aufruf: show_navi(0, $open), show_navi($open, $row["parent"])

Merkst du was?
Zergling-new ist offline  
Alt 08.05.2006, 22:14  
Neuer Benutzer
 
Registriert seit: 04.03.2005
Beiträge: 10
PHP-Kenntnisse:
Fortgeschritten
netdirk
netdirk eine Nachricht über Skype™ schicken
Standard

so ich habe mich nochmal rangesetzt und einen lösungsansatz entwickelt.
hier kommt er:

Code:
error_reporting(E_ALL);

## die uid wird zu parent und bezeichnet immer das elternteil,
## wenn das nicht vorhanden ist wird parent zu 0
if ( !isset($_REQUEST["open"]) )
{
    $open = 0;
}
else
{
    $open = $_REQUEST["open"];
}

include_once("db.inc");

session_start();


#echo'<pre>';
#print_r($_SERVER);

function show_navi($parent, $open)
{
    global $a_db, $PHP_SELF;
    
    #echo $_SERVER["PHP_SELF"];

    $sql = "
    SELECT
        *
    FROM
        1_rubrik ru, 1_assign ass
    WHERE
        ru.id = ass.strange_id      AND
        ass.parent = '".$parent."'";

    #echo 'db: '.$a_db;
    #echo '
query: '.$sql;
    $query = mysql_query($sql,$a_db);

    if( mysql_num_rows($query) )
    {
        echo '<ul>';
        while($row = mysql_fetch_assoc($query))
        {
            echo '[*]
                '.$row["name"].'
            ';
            
            if($open != 0)
			{
                show_navi($row["id"], $row["id"]);
			}
			/*
            if( $open == 0 )show_navi(0, $open);
            else show_navi($open, $row["parent"]);
            */
        }
        echo '[/list]';
    }
}

#show_navi(0, 0);

$navi = show_navi(0,$open);
ansehen kann man es sich unter:
http://www.hydrotip.de/admi_neu/struktur-sicher.php

dabei gibt es jetzt nur ein problem.
das skript öffnet alle unterpunkte wenn man auf einen pukt klickt. das will ich aber nicht. ich möchte das sich nur der punkt öffnet den man angeklickt hat. wie in einem navigationsbaum.

wie mache ich das?
netdirk ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Rekursion zur Ausgabe von Kategorien und Unterkategorien goofreezer PHP Tipps 2008 19 20.06.2008 10:43
Nested Sets oder Rekursion? litterauspirna PHP Tipps 2008 8 06.06.2008 16:57
rekursion ist nicht mein freund.... ;-) Promaetheus PHP Tipps 2008 6 11.10.2007 18:49
Türme von Hanoi - Rekursion Erecthoma2006 PHP Tipps 2006 7 07.06.2006 18:54
Rekursionsfehler? HTML, Usability und Barrierefreiheit 6 10.05.2006 21:02
Wie nennt man so etwas? Rekursion bei Klassen? Andreas PHP Tipps 2007 3 16.11.2005 12:50
Rekursion als sql DerDesian Datenbanken 1 20.04.2005 11:59
Klassen Frage!!! PHP-Fortgeschrittene 20 04.03.2005 22:24
Rekursion PHP Tipps 2004 2 15.06.2004 11:31

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
navigationsbaum, php_self navigation parent

Alle Zeitangaben in WEZ +2. Es ist jetzt 14:57 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.