php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 19-02-2012, 17:02
sanktusm
 Registrierter Benutzer
Links : Onlinestatus : sanktusm ist offline
Registriert seit: Aug 2005
Beiträge: 634
sanktusm zeigte ein beschämendes Verhalten in der Vergangenheit
Standard nested sets: mehrere bäume öffnen/schließen

Hallo,
mit folgendem Code kann ich Teilbäume eines aktiven Links ($_GET['id']) öffnen. Wenn ich nun einen anderen Link anklicke, schließt sich der vorige und öffnet sich der aktuelle. Nun will ich, dass ich mehrere Bäume gleichzeit öffnen kann. Dazu befüllt ich einen Array mit id - Werten. Wie aber bringe ich das in den funktionen unter? Hat jemand eine Idee?

PHP-Code:
public function getTreePart($id) {
        
$sql "SELECT n." $this->pk ", n." $this->name ", COUNT(*)-1 AS level,  ROUND ((n.rgt - n.lft - 1) / 2) AS children FROM " $this->table " AS n, " $this->table " AS p WHERE n.lft BETWEEN p.lft AND p.rgt GROUP BY n.lft ORDER BY n.lft;";
        
$result $this->db->query($sql);
        if (
$this->db->affected_rows == 0) {
            return 
$this->error(1true);
        }
        
$tree = array();
        
$i 0
        
$level count($this -> getPath($id));
    
        while (
$row $result->fetch_assoc()) {            
            
$last_id $this -> getLastId($id,$row['level']); // $last_id und $id 
                        
muss nach Möglichkeit mehrere Werte parallel beinhalten
         
if($row['level'] == OR ($level $row['level'] AND 
                 
in_array($row[$this->pk],$this -> getForwardTree($last_id))) 
                OR (
$level == $row['level'] AND is_array($this -> getForwardTree($id)) 
               AND 
in_array($row[$this->pk], $this -> getForwardTree($id))))  {
     
            
$tree[$i] = $row;
            
$i++;
        
            }     
        }
    
        return 
$tree;
    }


public function 
getForwardTree($id) {     

        
$sql "SELECT n." $this->pk "
              FROM " 
$this->table " as n
              JOIN " 
$this->table " as p
              LEFT JOIN " 
$this->table " as q 
                  ON q.lft < n.lft
                    AND q.rgt > n.rgt
                    AND q.lft > p.lft
                    AND q.rgt < q.rgt
              WHERE p." 
$this->pk " = " $id "
                     AND n.lft > p.lft
                    AND n.rgt < p.rgt
               GROUP BY n.lft
           ORDER BY 
                  n.lft;"
;
        
$result $this->db->query($sql);
        if (
$this->db->affected_rows == 0) {
            return 
$this->error(1true);
        }
        
$tree = array();
        
$i 0;
         
        while (
$row $result->fetch_assoc()) {
          
            
$tree[$i] = $row[$this->pk];
            
$i++;
            
        }                           
        return 
$tree;
    } 

Geändert von sanktusm (24-02-2012 um 17:07 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 20-02-2012, 19:32
sanktusm
 Registrierter Benutzer
Links : Onlinestatus : sanktusm ist offline
Registriert seit: Aug 2005
Beiträge: 634
sanktusm zeigte ein beschämendes Verhalten in der Vergangenheit
Standard Alternativer Lösungsansatz

Zugegeben, war der erste Ansatz etwas kompliziert, es hat zwar fast geklappt aber eben nur fast. Der folgende Ansatz gibt alle punkte aus, die geöffnet sind. Nun möchte ich auch diejenigen Punkte geöffnet wissen, die innerhalb der nächsten und der ebene liegen. Hat jemand eine Idee?

PHP-Code:
    public function getTreePart() {
        
$sql "SELECT n." $this->pk ", n." $this->name ", COUNT(*)-1 AS level,  ROUND ((n.rgt - n.lft - 1) / 2) AS children FROM " $this->table " AS n, " $this->table " AS p WHERE n.lft BETWEEN p.lft AND p.rgt GROUP BY n.lft ORDER BY n.lft;";
        
$result $this->db->query($sql);
        if (
$this->db->affected_rows == 0) {
            return 
$this->error(1true);
        }
        
$tree = array();
        
$i 0

      
$this -> section_handler(0,0,0); 

        while (
$row $result->fetch_assoc()) {            
         if(
$this -> open_sections[$row[$this->pk]] != $row[$this->pk]) {
     
     
$lft $this -> getActiveLft($row[$this->pk]);
     
$rgt $this -> getActiveRgt($row[$this->pk]);
     } 
     
         if(!
in_array($this -> getActiveLft($row[$this->pk]), range($lft$rgt )))  {
            
$tree[$i] = $row;
            
$i++;
      }     
        }
      
        return 
$tree;
    } 
Mit Zitat antworten
  #3 (permalink)  
Alt 22-02-2012, 19:46
sanktusm
 Registrierter Benutzer
Links : Onlinestatus : sanktusm ist offline
Registriert seit: Aug 2005
Beiträge: 634
sanktusm zeigte ein beschämendes Verhalten in der Vergangenheit
Standard Neuer Lösungsansatz

Folgender Ansatz gibt leider alle Menupunkte aus, wenn anstelle von p." . $this->pk . " IN ... eine einzelne Id angegeben wird, wird nur der Teilbaum unterhalb der aktiven Id ausgeben. Ich bitte um unterstützung.

PHP-Code:
public function getForwardTree() {     

$count_open_sections 0;
$open_path "p." $this->pk " IN (";

foreach(
$this -> open_sections AS $id) {
$open_path .= " '" $id "' ";
$count_open_sections++;
if(
count($this -> open_sections) == $count_open_sections)
$open_path .= " ";
else
$open_path .= " , "
}
$open_path .= " ) ";
        
$sql "SELECT n." $this->pk "
              FROM " 
$this->table " as n
              JOIN " 
$this->table " as p
              LEFT JOIN " 
$this->table " as q 
                  ON q.lft < n.lft
                    AND q.rgt > n.rgt
                    AND q.lft > p.lft
                    AND q.rgt < q.rgt
              WHERE " 
$open_path "
                     AND n.lft > p.lft
                    AND n.rgt < p.rgt
               GROUP BY n.lft
           ORDER BY 
                  n.lft;"
;
        
$result $this->db->query($sql);
        if (
$this->db->affected_rows == 0) {
            return 
$this->error(1true);
        }
        
$tree = array();
        
$i 0;
         
        while (
$row $result->fetch_assoc()) {
          
            
$tree[$i] = $row[$this->pk];
            
$i++;
            
        }                           
        return 
$tree;
    } 
Mit Zitat antworten
  #4 (permalink)  
Alt 22-02-2012, 20:34
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

@sanktusm

Bitte brich deinen Quellcode um! Kein Mensch schaut sich das an, wenn man kilometerweit horizontal nach rechts scrollen muss.

Danke
Peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
Mit Zitat antworten
  #5 (permalink)  
Alt 24-02-2012, 17:11
sanktusm
 Registrierter Benutzer
Links : Onlinestatus : sanktusm ist offline
Registriert seit: Aug 2005
Beiträge: 634
sanktusm zeigte ein beschämendes Verhalten in der Vergangenheit
Standard letzer Lösungsansatz

Hallo, dieser Lösungsansatz bringt die beste Lösung. Das Problem allerding:
es wird immer die ganze Evene unterhalb des Knotenpunkt geöffnet.

Da ich jetzt schon eine ganze Weile daran arbeite, bin ich über jeden Tipp sehr dankbar.

PHP-Code:
public function getTreePart() {
        
$sql "SELECT n." $this->pk ", n." $this->name ", COUNT(*)-1 AS level,  ROUND ((n.rgt - n.lft - 1) / 2) AS children FROM " $this->table " AS n, " $this->table " AS p WHERE n.lft BETWEEN p.lft AND p.rgt GROUP BY n.lft ORDER BY n.lft;";
        
$result $this->db->query($sql);
        if (
$this->db->affected_rows == 0) {
            return 
$this->error(1true);
        }
        
$tree = array();
        
$i 0
        
$arr_rgt = Array();
      
$this -> section_handler(0,0,0); 
        while (
$row $result->fetch_assoc()) {            
         if(
$this -> open_sections[$row[$this->pk]]) {
         
$level count($this -> getPath($row[$this->pk]));
     
$last_id $this -> getLastId($row[$this->pk],$row['level']);  
     
$id $row[$this->pk];
     
$rgt $this -> getActiveRgt($row[$this->pk]);
     }
       
         if((
$level $row['level'] AND 
                
$rgt $this -> getActiveLft($last_id)) OR 
               (
$level == $row['level'] AND 
               
is_array($this -> getForwardTree($id)) AND 
               
in_array($row[$this->pk], $this -> getForwardTree($id))))  {
     
            
$tree[$i] = $row;
            
$i++;
      }     
        }
      
        return 
$tree;
    }

public function 
getIdfromRgt($lft) {     

$sql "SELECT n." $this->pk " FROM " $this->table " WHERE p.lft = '$rgt'";

$result $this->db->query($sql);
        if (
$this->db->affected_rows == 0) {
            return 
$this->error(1true);
        }
    
      
$row $result->fetch_assoc(); 
      
$id $row[$this->pk];
          
    
    
                              
        return 
$id;
    }
public function 
getForwardTree($id) {     

        
$sql "SELECT n." $this->pk "
              FROM " 
$this->table " as n
              JOIN " 
$this->table " as p
              LEFT JOIN " 
$this->table " as q 
                  ON q.lft < n.lft
                    AND q.rgt > n.rgt
                    AND q.lft > p.lft
                    AND q.rgt < q.rgt
              WHERE p." 
$this->pk " = " $id "
                     AND n.lft > p.lft
                    AND n.rgt < p.rgt
               GROUP BY n.lft
           ORDER BY 
                  n.lft;"
;
        
$result $this->db->query($sql);
        if (
$this->db->affected_rows == 0) {
            return 
$this->error(1true);
        }
        
$tree = array();
        
$i 0;
         
        while (
$row $result->fetch_assoc()) {
          
            
$tree[$i] = $row[$this->pk];
            
$i++;
            
        }                           
        return 
$tree;
    } 
Mit Zitat antworten
Antwort

Lesezeichen


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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mehrere Wurzeln bei Nested Sets Postaria SQL / Datenbanken 12 03-03-2014 11:06
MySQL Bäume (nested sets) - Fragen bzgl. Update carapau SQL / Datenbanken 11 15-07-2010 17:34
Nested Sets timepoint5 SQL / Datenbanken 1 04-08-2006 08:16
Nested Sets Arci PHP Developer Forum 4 07-03-2005 23:42
Das 'Nested Sets' Modell - Bäume mit SQL Berni Tutorials 0 06-01-2003 00:33

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 04:24 Uhr.