php mysql tree

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

php mysql tree

Δημοσίευση από ksamole » 23 Νοέμ 2008 15:41

Λοιπον εχω τον συγκεκριμενο πινακα:

Κώδικας: Επιλογή όλων

CREATE TABLE `categories` (
  `categoryID` int(10) unsigned NOT NULL auto_increment,
  `parentID` int(10) unsigned NOT NULL default '0',
  `title` text,
  PRIMARY KEY  (`categoryID`),
  KEY `FK_categories_1` (`parentID`),
  CONSTRAINT `FK_categories_1` FOREIGN KEY (`parentID`) REFERENCES `categories` (`categoryID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Και αυτο που θελω ειναι με php να παιρνω σε δενδρική μορφη τις κατηγορίες και τις υποκατηγορίες ...
Πως μπορώ να το κάνω αυτό?
Τελευταία επεξεργασία από το μέλος ksamole την 24 Νοέμ 2008 16:57, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
Pavel
Honorary Member
Δημοσιεύσεις: 1046
Εγγραφή: 08 Αύγ 2003 00:05
Τοποθεσία: UK

php mysql tree

Δημοσίευση από Pavel » 23 Νοέμ 2008 16:03

Δες εδώ:
http://www.sitepoint.com/forums/showthread.php?t=568978

Κώδικας: Επιλογή όλων

<?php
    function get_all_categories&#40;$parent, $indent = 0&#41;&#123;
        $output        = '';
        $sqlResult     = mysql_query&#40;"SELECT * Categories WHERE parent=".$parent." ORDER BY title ASC"&#41;; 
        $num_rows     = mysql_num_rows&#40;$sqlResult&#41;; 
        if &#40;$num_rows > 0&#41; &#123; 
            while&#40;$row = mysql_fetch_assoc&#40;$sqlResult&#41;&#41; &#123; 
                $output .= $row&#91;'title'&#93; . '<br>'; 
                if &#40;has_sub&#40;$row&#91;'id'&#93;&#41;&#41; &#123; 
                    $output .= get_all_categories&#40;$row&#91;'id'&#93;, $indent++&#41;; 
                &#125; 
            &#125; 
        &#125; 

        return $output;
    &#125;

    function has_sub&#40;$id&#41;&#123;
        $sqlResult     = mysql_query&#40;"SELECT id FROM Categories WHERE parent=".$id&#41;; 
        $num_rows     = mysql_num_rows&#40;$sqlResult&#41;; 

        return $num_rows >= 1 ? true &#58; false;
    &#125;
?>

Εσύ είσαι τρελός.

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

php mysql tree

Δημοσίευση από cherouvim » 23 Νοέμ 2008 18:22

Αν έχεις λίγες εγγραφές μέσα σε αυτό το table τότε πάρτα όλα με ένα query και κάνε τη διμιουργία του δέντρου με PHP. Πολύ πιο φτηνό από τα πολλά queries.

Οι λίγες εγγραφές μπορεί να είναι και 100. Ανάλογα και πόσο βάθος έχει το δέντρο.

ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

php mysql tree

Δημοσίευση από ksamole » 23 Νοέμ 2008 18:48

εκει κολλαω πως θα το κανω με php...

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

php mysql tree

Δημοσίευση από korgr » 23 Νοέμ 2008 19:02

Αν ψάχνεις ένα τρόπο παρουσίασης σαν και αυτούς:
http://www.webpage.gr/test/multilevel_categories/

Tutorial & κώδικα θα βρεις εδώ:
http://www.freestuff.gr/forums/viewtopic.php?t=39468
http://www.vcdc.gr/forum/viewtopic.php?t=14155
http://www.vcdc.gr/tests/test_categories/files.zip

ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

php mysql tree

Δημοσίευση από ksamole » 24 Νοέμ 2008 12:05

Για δειτε αυτο...

Κώδικας: Επιλογή όλων

DROP TABLE IF EXISTS `categories`;
CREATE TABLE `categories` &#40;
  `categoryID` int&#40;10&#41; unsigned NOT NULL auto_increment,
  `parentID` int&#40;10&#41; unsigned NOT NULL default '0',
  `title` text,
  PRIMARY KEY  &#40;`categoryID`&#41;,
  KEY `FK_categories_1` &#40;`parentID`&#41;,
  CONSTRAINT `FK_categories_1` FOREIGN KEY &#40;`parentID`&#41; REFERENCES `categories` &#40;`categoryID`&#41; ON DELETE CASCADE ON UPDATE CASCADE
&#41; ENGINE=InnoDB DEFAULT CHARSET=utf8;

Κώδικας: Επιλογή όλων

function getCatItems&#40;$first=true,$parent=0,$table=null,$partable=null,$folder=null&#41;&#123;

	if&#40;$first&#41;&#123;
		$sql="select * from categories";
		$result = mysql_query&#40;$sql&#41;;
		while&#40;$row=mysql_fetch_array&#40;$result, MYSQL_ASSOC&#41;&#41;&#123;
			if&#40;$row&#91;'parentID'&#93;==$row&#91;'categoryID'&#93;&#41;&#123;
				$parent=$row&#91;'parentID'&#93;;
			&#125;
			$table&#91;$row&#91;'parentID'&#93;&#93;&#91;$row&#91;'categoryID'&#93;&#93;=null;
			$partable&#91;$row&#91;'categoryID'&#93;&#93;=$row&#91;'parentID'&#93;;
			$folder&#91;$row&#91;'categoryID'&#93;&#93;=$row;
		&#125;
	&#125;
	$result='';
	while&#40;list&#40;$key&#41;=each&#40;$table&#91;$parent&#93;&#41;&#41;&#123;
		$result.='<li><a href="#">'.$folder&#91;$key&#93;&#91;'title'&#93;.'</a></li>';
		if &#40;isset&#40;$table&#91;$key&#93;&#41;&#41;&#123;//child
			$result=substr&#40;$result, 0, strlen&#40;$result&#41;-5&#41;;
			$result.="<ul>";
                        if&#40;$key!=$parent&#41;&#123;
			    $result.=getCatItems&#40;false,$key,$table,$partable,$folder&#41;;
			    $result.="</ul></li>";
                        &#125;
		&#125;
	&#125;

	return $result;
&#125;
το προβλημα ειναι οτι μου μου βγαζει καλα το html οutput κατα τα αλλα δουλευει με 1 query πολυ καλα.
Πριν την function θελει <ul>
echo getCatItems();
και μετα </ul>
Πως μπορω να το φτιάξω αυτό?
Τελευταία επεξεργασία από το μέλος ksamole την 24 Νοέμ 2008 17:00, έχει επεξεργασθεί 4 φορές συνολικά.

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

php mysql tree

Δημοσίευση από korgr » 24 Νοέμ 2008 12:43

Δεν έχω χρόνο να δοκιμάσω την function σου αλλά με πρώτη ματιά βλέπω πως όταν ξανακαλείς την function δεν περνάς σωστά ορίσματα:

getCatItems($langID,false,$key,$table,$partable,$folder)

Τι θέλει αυτό το $langID στη θέση της $first που σωστά πρέπει να είναι false αλλά ως δεύτερο όρισμα δεν θα γίνει false (άρα ξανακαλείς το query)

ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

php mysql tree

Δημοσίευση από ksamole » 24 Νοέμ 2008 12:59

απο λαθος μπηκε το $langID το εσβησα

Άβαταρ μέλους
loxy
Δημοσιεύσεις: 208
Εγγραφή: 17 Ιούλ 2007 01:18

php mysql tree

Δημοσίευση από loxy » 24 Νοέμ 2008 13:32

Επειδη διαβαζω τα περισσοτερα τοπικ σε αυτη την κατηγορια , αν γινεται προσπαθηστε( οσοι δεν το κανετε ) να βαζετε τον κωδικα
μεσα στα καταλληλα tags και οχι ως απλο κειμενο, γιατι πονανε τα ματια μας...

ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

php mysql tree

Δημοσίευση από ksamole » 24 Νοέμ 2008 17:33

Καλυτερη εκδοχη που δουλευει..

Κώδικας: Επιλογή όλων

DROP TABLE IF EXISTS `cats`;
CREATE TABLE `cats` &#40;
  `categoryID` int&#40;10&#41; unsigned NOT NULL auto_increment,
  `parentID` int&#40;10&#41; unsigned NOT NULL default '0',
  `title` text,
  PRIMARY KEY  &#40;`categoryID`&#41;,
  FOREIGN KEY &#40;`parentID`&#41; REFERENCES `cats` &#40;`categoryID`&#41; ON DELETE CASCADE ON UPDATE CASCADE
&#41; ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records 
-- ----------------------------
INSERT INTO `categories` VALUES &#40;'1', '1', root&#41;;
INSERT INTO `categories` VALUES &#40;'2', '1', sub1&#41;;
INSERT INTO `categories` VALUES &#40;'3', '1', sub2&#41;;
INSERT INTO `categories` VALUES &#40;'4', '3', sub2_1&#41;;
INSERT INTO `categories` VALUES &#40;'5', '3', sub2_2&#41;;
INSERT INTO `categories` VALUES &#40;'6', '5', sub2_2_1&#41;;


function getCats&#40;$parent = 1, $first = true, $table = null, $partable = null,$folder = null&#41;&#123;

    $count1 = 0;
    $count2 = 0;
    if &#40;$first&#41; &#123;
        echo '<ul class="navmenu">';
        $sql = "select * from cats";
        $result = mysql_query&#40;$sql&#41;;

        while &#40;$row = mysql_fetch_array&#40;$result, MYSQL_ASSOC&#41;&#41; &#123;
            if &#40;$row&#91;'parentID'&#93; == $row&#91;'categoryID'&#93;&#41; &#123;
                $parent = $row&#91;'parentID'&#93;;
            &#125;
            $table&#91;$row&#91;'parentID'&#93;&#93;&#91;$row&#91;'categoryID'&#93;&#93; = null;
            $partable&#91;$row&#91;'categoryID'&#93;&#93; = $row&#91;'parentID'&#93;;
            $folder&#91;$row&#91;'categoryID'&#93;&#93; = $row;
            $count1++;
        &#125;
    &#125;
    $result = '';
    while &#40;list&#40;$key, $val&#41; = each&#40;$table&#91;$parent&#93;&#41;&#41; &#123;
        $result .= '<li><a href="' . $_SERVER&#91;'PHP_SELF'&#93; . '?catID=' . $folder&#91;$key&#93;&#91;'categoryID'&#93; . '">' . $folder&#91;$key&#93;&#91;'title'&#93; .'</a></li>';
        if &#40;isset&#40;$table&#91;$key&#93;&#41;&#41; &#123; //child
            $result = substr&#40;$result, 0, strlen&#40;$result&#41; - 5&#41;;
            $result .= '<ul>';
            if &#40;$key != $parent&#41; &#123;
                $result .= getCats&#40;$key, false, $table, $partable, $folder&#41;;
                $result .= "</ul></li>";
            	$count2++;
			&#125;
            $count2++;
        &#125;
        $count2++;
    &#125;
    if &#40;$count2 == $count1&#41; &#123;
        $result .= '</ul></ul>';
    &#125;

    return $result;
&#125;
και το css για drop down menu

Κώδικας: Επιλογή όλων

/* Root = Vertical, Secondary = Vertical */
ul.navmenu,
ul.navmenu li,
ul.navmenu ul &#123;
margin&#58;0;
padding&#58;0;
list-style&#58; none;
width&#58;148px;
&#125;
ul.navmenu&#123;
border-left&#58;1px solid #E1DAA6;
border-right&#58;1px solid #E1DAA6;
margin-bottom&#58;20px;
&#125;
ul.navmenu ul&#123;
border&#58;0;
border-left&#58;2px solid #ffffff;
&#125;
ul.navmenu&#58;after /*From IE 7 lack of compliance*/&#123;
clear&#58; both;
display&#58; block;
font&#58; 1px/0px serif;
content&#58; ".";
height&#58; 0;
visibility&#58; hidden;
&#125;

ul.navmenu li &#123;
float&#58; left; /*For IE 7 lack of compliance*/
display&#58; block !important; /*For GOOD browsers*/
display&#58; inline; /*For IE*/
position&#58; relative;
&#125;

/* Root Menu */
ul.navmenu a &#123;
border-bottom&#58;1px solid #D9D0A7;
padding&#58; 0 6px;
display&#58; block;
background&#58;url&#40;../images/menuBarRight.gif&#41; 8px 8px no-repeat ;padding&#58;0 0 0 16px;
color&#58;#40361B;
font&#58; normal 12px/23px Arial, Helvetica, sans-serif;
text-decoration&#58; none;
height&#58; auto !important;
height&#58; 1%; /*For IE*/
&#125;

/* Root Menu Hover Persistence */
ul.navmenu a&#58;hover,
ul.navmenu li&#58;hover a,
ul.navmenu li.iehover a &#123;
/*background&#58; #640000;*/
background&#58;url&#40;../images/menuBarRightHover.gif&#41; 8px 8px no-repeat #640000;padding&#58;0 0 0 16px;color&#58;#fff;
&#125;

/* 2nd Menu */
ul.navmenu li&#58;hover li a,
ul.navmenu li.iehover li a &#123;
background&#58;url&#40;../images/menuBarRight.gif&#41; 10px 8px no-repeat #F0EDCE;padding&#58;0 0 0 18px;
color&#58;#40361B;
&#125;

/* 2nd Menu Hover Persistence */
ul.navmenu li&#58;hover li a&#58;hover,
ul.navmenu li&#58;hover li&#58;hover a,
ul.navmenu li.iehover li a&#58;hover,
ul.navmenu li.iehover li.iehover a &#123;
background&#58;url&#40;../images/menuBarRightHover.gif&#41; 10px 8px no-repeat #640000;padding&#58;0 0 0 18px;color&#58;#fff;
&#125;

/* 3rd Menu */
ul.navmenu li&#58;hover li&#58;hover li a,
ul.navmenu li.iehover li.iehover li a &#123;
background&#58;url&#40;../images/menuBarRight.gif&#41; 10px 8px no-repeat #F0EDCE;padding&#58;0 0 0 18px;
color&#58;#40361B;
&#125;

/* 3rd Menu Hover Persistence */
ul.navmenu li&#58;hover li&#58;hover li a&#58;hover,
ul.navmenu li&#58;hover li&#58;hover li&#58;hover a,
ul.navmenu li.iehover li.iehover li a&#58;hover,
ul.navmenu li.iehover li.iehover li.iehover a &#123;
background&#58;url&#40;../images/menuBarRightHover.gif&#41; 10px 8px no-repeat #640000;padding&#58;0 0 0 18px;color&#58;#fff;
&#125;

/* 4th Menu */
ul.navmenu li&#58;hover li&#58;hover li&#58;hover li a,
ul.navmenu li.iehover li.iehover li.iehover li a &#123;
background&#58;url&#40;../images/menuBarRight.gif&#41; 10px 8px no-repeat #F0EDCE;padding&#58;0 0 0 18px;
color&#58;#40361B;
&#125;

/* 4th Menu Hover */
ul.navmenu li&#58;hover li&#58;hover li&#58;hover li a&#58;hover,
ul.navmenu li.iehover li.iehover li.iehover li a&#58;hover &#123;
background&#58;url&#40;../images/menuBarRightHover.gif&#41; 10px 8px no-repeat #640000;padding&#58;0 0 0 18px;color&#58;#fff;
&#125;

ul.navmenu ul,
ul.navmenu ul ul,
ul.navmenu ul ul ul &#123;
display&#58; none;
position&#58; absolute;
top&#58; 0;
left&#58;100%;
&#125;

/* Do Not Move - Must Come Before display&#58;block for Gecko */
ul.navmenu li&#58;hover ul ul,
ul.navmenu li&#58;hover ul ul ul,
ul.navmenu li.iehover ul ul,
ul.navmenu li.iehover ul ul ul &#123;
display&#58; none;
&#125;

ul.navmenu li&#58;hover ul,
ul.navmenu ul li&#58;hover ul,
ul.navmenu ul ul li&#58;hover ul,
ul.navmenu li.iehover ul,
ul.navmenu ul li.iehover ul,
ul.navmenu ul ul li.iehover ul &#123;
display&#58; block;
&#125;


Αν καποιος μπορει να κανει και καλυτερο τον κωδικα γιατι ειναι χυμα....
Τελευταία επεξεργασία από το μέλος ksamole την 25 Νοέμ 2008 11:33, έχει επεξεργασθεί 4 φορές συνολικά.

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

php mysql tree

Δημοσίευση από korgr » 24 Νοέμ 2008 19:56

Προσωπικά δεν κατάφερα να το κάνω να δουλέψει...
Στην αρχή "κτυπούσε" στα errors
(δημιουργία πίνακα categories και μετά query σε πίνακα cats)
(Recursive call της function με άλλο όνομα, getCatItems αντί getCats)
Αφού τα διόρθωσα αυτά, μου επιστρέφει λευκή σελίδα. Ο πίνακας σωστός στη βάση (έτρεξα την sql σου)

ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

php mysql tree

Δημοσίευση από ksamole » 25 Νοέμ 2008 09:55

πρεπει να εχεις ποιο πριν κωδικα για να κανεις connect στη βαση

και μετα echo getCats();

μηπως ξεχασες το echo ?

και με το καταληλο css style το κανεις drop down το μενου χωρις javascript που ειναι
σημαντικο γιατι φαντασου να μην εχει ο αλλος js και να μην του παιζει το μενου

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

php mysql tree

Δημοσίευση από korgr » 25 Νοέμ 2008 11:28

Και connect στη βάση έγινε κανονικά και echo υπήρχε.
Βλέπω πως και τώρα μετά το edit σου κάνεις:
drop cats
create categories
select στο cats

Τελικά πως λέγεται ο πίνακάς σου?

Anyway αφού εσένα σου δουλεύει, εμένα μου περισσεύει :wink:

ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

php mysql tree

Δημοσίευση από ksamole » 25 Νοέμ 2008 11:34

τωρα μετα τις αλλαγες πρεπει να παιζει,,,

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

php mysql tree

Δημοσίευση από korgr » 25 Νοέμ 2008 12:49

ok μια χαρά τώρα!
Έχει περιορισμό σε βάθος επιπέδων? (κάτι είδα στο css με levels 1 to 4)

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες