php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 17-10-2006, 11:52
TobiasKa
 Newbie
Links : Onlinestatus : TobiasKa ist offline
Registriert seit: Oct 2006
Beiträge: 12
TobiasKa ist zur Zeit noch ein unbeschriebenes Blatt
Standard Virtueller Verzeichnisbaum mittels rekursiver Abfrage

Hi,

ich möchte mit Hilfe einer Datenbank einen virtuellen Verzeichnisbaum aufbauen (jedes Bild liegt pysikalisch im gleichen Verzeichnis)
Dazu werden Ordner (Datensätze in der DB) angelegt, in die man dann die Bilder verteilen kann. Alles auf der Basis von id und parent_id.

Als erstes habe ich jetzt einmal eine Funktion geschrieben, die mir den ganzen Verzeichnisbaum abruft:

PHP-Code:
function get_tree($table$pid=0$path_name='') {
    global 
$auth$mysql_sys;
    
$sql 'SELECT id, name, pid
        FROM ' 
DB_PREFIX $table '
        WHERE pid = ' 
$pid '
        ORDER BY name'
;
    
$result $mysql_sys->query($sql);
    while (
$data mysql_fetch_array($resultMYSQL_BOTH)) {
        if (
$pid == $data['pid']) {
            
$path_name $path_name '/' $data['name'];
            
$output .= $path_name '<br>';
            
$output .= get_tree($table$data['id'], $path_name);
        }    
    }
    return 
$output;

Leider schaukelt sich die Ausgabe durch $path_name hoch, dass ich zu folgendem Ergebnis komme:

Code:
/1985
/1985/Tobi
/1985/1990
/1985/1990/Judy
Richtig wäre aber

Code:
/1985
/1985/Tobi
/1990
/1990/Judy
Gibts da irgenteine Möglichkeit mit Arrays oder muss die Funktion anders aufgebaut sein?
Mit Zitat antworten
  #2 (permalink)  
Alt 17-10-2006, 11:56
axo
 Junior Member
Links : Onlinestatus : axo ist offline
Registriert seit: Jan 2006
Ort: 127.0.0.1
Beiträge: 196
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

einmal auf die finger klopfen und 100 mal an die tafel schreiben:
* ich werde nie wieder rekursive datenbank-abfragen schreiben
* ich werde nie wieder rekursive datenbank-abfragen schreiben

und dann nach "Nested Sets" oder "adjacency list" oder nach "xml" suchen.

niemand zwingt dich, eine verschachtelte struktur in einer datenbank abzulegen.

grüße
axo
Mit Zitat antworten
  #3 (permalink)  
Alt 17-10-2006, 12:06
TobiasKa
 Newbie
Links : Onlinestatus : TobiasKa ist offline
Registriert seit: Oct 2006
Beiträge: 12
TobiasKa ist zur Zeit noch ein unbeschriebenes Blatt
Standard

problem: nested sets sind beim verschieben sehr kompliziert und bei meiner anwendung brauch ich die rekursive abfrage eigentlich nur einmal:
beim Aufbauen des Verzeichnisbaums.

Sonst wird immer nur der Ordner angezeigt, dessen inhalt nur mittels $pid gefilter werden muss.

hast du nicht trotz meines schlimmen php und db missbrauchs einen tipp für mich?
Mit Zitat antworten
  #4 (permalink)  
Alt 17-10-2006, 12:08
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

$output mal am Anfang der Funktion initialisieren ...?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #5 (permalink)  
Alt 17-10-2006, 12:19
axo
 Junior Member
Links : Onlinestatus : axo ist offline
Registriert seit: Jan 2006
Ort: 127.0.0.1
Beiträge: 196
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von TobiasKa
[B]problem: nested sets sind beim verschieben sehr kompliziert und bei meiner anwendung brauch ich die rekursive abfrage eigentlich nur einmal:
beim Aufbauen des Verzeichnisbaums.
auch das eine mal kann zu viel sein, und das bereits wenn deine tabelle 80-100 einträge beinhaltet.

nested sets programmiert man auch nicht selbst, und ein paar methoden aufzurufen ist nie zu viel.
egal.



Zitat:
hast du nicht trotz meines schlimmen php und db missbrauchs einen tipp für mich?
du fährst besser, wenn du alle einträge, die du benötigst auf einmal mit einem einzigen select aus der datenbank liest und das array dann zu fuß per php in eine baumstruktur packst.

grüße
axo
Mit Zitat antworten
  #6 (permalink)  
Alt 17-10-2006, 13:05
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von axo
auch das eine mal kann zu viel sein, und das bereits wenn deine tabelle 80-100 einträge beinhaltet.
und warum soll er das machen?
für eine einmalige Ausführung und cachen von ergebnisen muss man nicht unbedingt nestedset nehmen.
ausserdem mit 100 abfragen wird er in 2 sekunden fertig.
ausser dem das ist doch Adjacency List Model mit ausname, dass er für parent_id keine extra tabelle gemacht hat.

versuch bitte so
PHP-Code:
while ($data mysql_fetch_array($resultMYSQL_BOTH)) {
    
$output .= $path_name '/' $data['name']. '<br>';
    
$output .= get_tree($table$data['id'], $path_name '/' $data['name']);

__________________
Slava
bituniverse.com

Geändert von Slava (17-10-2006 um 13:43 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 17-10-2006, 13:07
TobiasKa
 Newbie
Links : Onlinestatus : TobiasKa ist offline
Registriert seit: Oct 2006
Beiträge: 12
TobiasKa ist zur Zeit noch ein unbeschriebenes Blatt
Standard

jo, ist eine gute idee.

irgentwelche Tipps dazu? zumindest eine Idee für ein Konzept wie man das ganze angehen könnte?
Mit Zitat antworten
  #8 (permalink)  
Alt 17-10-2006, 13:16
TobiasKa
 Newbie
Links : Onlinestatus : TobiasKa ist offline
Registriert seit: Oct 2006
Beiträge: 12
TobiasKa ist zur Zeit noch ein unbeschriebenes Blatt
Standard

okay, jetzt hab ich mal die Lösung von Slava genommen:

Es wird das richtige ausgegeben. Wieviele DB Abfragen macht er jetzt insgesamt? 6 Stück oder? Denn er muss ja immer schauen, ob da noch was untergeordnetes existiert.

Bei error-reporting e_all kommen jetzt noch 5 Fehler, die von der nicht definirten output variable herrühren: "Notice: Undefined variable: output...."

dreimal wo diese zuerst angegeben wird: $output .= usw
und zweimal beim returnaufruf

das passiert doch, wenn nix untergeornetes mehr gefunden werden kann.

Wie kann ich das vermeiden?

Noch eine interessante idee für die array zu fuß lösung?

UPDATE: mit if (empty($output)) $output = ''; hab ich die notice Meldungen wegbekommen? verwendet man da lieber !isset() oder ist empty okay?

Geändert von TobiasKa (17-10-2006 um 13:21 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 17-10-2006, 13:23
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

du muss einfach dein $output einfach declarieren
$output =""; irgendwo am anfang von function.
es ist aber zu empfehlen, dass diese function nur bei änderung von verzeichnisstruktur ausgeführt wird und die ausgabe einfach in eine datei abspeichert, die du in deiner seite einbinden muss.
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #10 (permalink)  
Alt 17-10-2006, 14:49
Patrick_PQ
 Registrierter Benutzer
Links : Onlinestatus : Patrick_PQ ist offline
Registriert seit: Aug 2003
Beiträge: 480
Patrick_PQ ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ich habe mal was ähnliches mit nested sets gelöst - ist zwar auf den ersten Blick etwas kompliziert, dafür kann man aber sehr viel mit einer einzelnen Abfrage erledigen. Auch das Verschieben ist relativ simple. Diese Seite hat mir beim Einstieg echt geholfen http://groups.google.com/group/micro...afe=off&rnum=4
Mit Zitat antworten
  #11 (permalink)  
Alt 18-10-2006, 11:27
TobiasKa
 Newbie
Links : Onlinestatus : TobiasKa ist offline
Registriert seit: Oct 2006
Beiträge: 12
TobiasKa ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zum ermitteln des Pfades brauchte ich noch eine rek. Abfrage, womit ich jetzt ein Problem habe:

ich muss die Ausgabe in der ungekehren Reihenfolge ordnen.
Leider bekomm ichs einfach nicht hin:


PHP-Code:
function get_path($table$id$path='') {
    global 
$auth;
    if (
$id=='0') return; //reached root level
    
if (empty($output)) $output '';
    
$sql 'SELECT pid, name
        FROM ' 
DB_PREFIX DB_PREFIX_C $table '
        WHERE id = ' 
$id '
        AND id_c = ' 
ID_C;
    
$data $auth->mysql->query($sql'array');
    
$output .= '/' $data['name'];
    
$output .= get_path($table$data['pid'], $data['name']);
    return 
$output;

Jemand eine idee?

danke schonmal!
Mit Zitat antworten
  #12 (permalink)  
Alt 18-10-2006, 12:34
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

die Problemstellung ist mir leider nicht ganz klar.

ich möchte aber gerne wissen, warum du $output wie vorgeschlagen nicht deklariert hast?
also @wahsaga als auch ich haben dich darauf aufmerksam gemacht.
Außerdem wenn ich jemandem ein Antwort oder Vorschlag schreibe, erwarte ich wenigstens eine kurze Bestätigung oder Meinung zum meinem Vorschlag bevor ich einem Fragesteller weiterhelfen versuche.
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #13 (permalink)  
Alt 18-10-2006, 12:51
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

@Slava: Das hat er doch jetzt gemacht - wenn auch in einem überflüssigen IF gekapselt. (Da $output eine lokale Variable ist, ist sie am Anfang der Funktion immer undefiniert - kann also dort ohne weitere Bedingung initialisiert werden.)

Zitat:
Original geschrieben von TobiasKa
ich muss die Ausgabe in der ungekehren Reihenfolge ordnen.
Leider bekomm ichs einfach nicht hin
Was machst du bisher? Bisherigen Inhalt nehmen, neues anhängen:
PHP-Code:
$output .= ergebnis_von_funktionsaufruf(); 
Das ist das gleiche wie
PHP-Code:
$output $output.ergebnis_von_funktionsaufruf(); 
Wenn du's jetzt andersherum haben willst - neues nehmen, bisherigen Inhalt anhängen - dann könnte man da vielleicht mal was umdrehen ...?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #14 (permalink)  
Alt 18-10-2006, 13:02
TobiasKa
 Newbie
Links : Onlinestatus : TobiasKa ist offline
Registriert seit: Oct 2006
Beiträge: 12
TobiasKa ist zur Zeit noch ein unbeschriebenes Blatt
Standard

funktioniert - wunderbar.

Frag mich nur warum ich da nicht selbst draufgekommen bin...

PHP-Code:
$output .= get_path($table$data['pid'], $data['name']) . '/' $data['name']; 
@slava: Sorry, dass ich keine Rückmeldung gegeben habe, wie du in der 2. funktion siehst, habe ich es eingebaut.

@wahsaga: wie soll ich es ohne if machen? denn wenn sie schon existiert, würde sie ja sonst gelöscht.
und ich kann sie ja nicht wie in einer klasse mit public $output; registrieren.
wenn cih sie aber einfach so verwende, bring e_all eine meldung
Mit Zitat antworten
  #15 (permalink)  
Alt 18-10-2006, 13:06
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von TobiasKa
wie soll ich es ohne if machen? denn wenn sie schon existiert, würde sie ja sonst gelöscht.
Dein "denn wenn" ist überhaupt nicht erfüllt.
Sie existiert zu Beginn deiner Funktion nicht, also kannst du sie dort einfach mit einem Leerstring initialisieren.

Wenn dir das nicht klar ist, mach dir klar, wie rekursive Funktionen funktionieren.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 03:12 Uhr.