Προς το περιεχόμενο

"μονοπάτι" με php,sql


antonisid

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,δεν είναι και πολύ περιγραφικός ο τίτλος του θέματος.Λοιπόν σ'ενα site που φτιάχνω θέλω να φαίνεται το "μονοπάτι" και το που βρίσκεται εκείνη την στιγμή ο χρήστης.Πχ τώρα εδώ στο ινσόμνια είναι

"home button-->Προγραμματισμός-->Web design/development-->"μονοπάτι" με php,sql"

 

Μπορείτε να μου δώσετε καμμιά ιδεά για το πώς θα το κάνω? Σκέφτηκα να φτιάξω λίστα <ul> με <li> το id της κατηγορίας που θα ανήκει το κάθε άρθρο και να εμφανίζει το title tag της κατηγορίας και το όνομα του άρθρου μέσω της βάσης δεδομένων.

 

Προφανώς θα πρέπει να υπάρχει κι ένας έλεγχος if για την δημιουργία <li> item κι αυτό με δυσκολεύει λιγάκι αλλά δε φαντάζει ακατόρθωτο.Έχετε κάποια καλύτερη ιδέα ή κάποιο παράδειγμα να δω?

Ευχαριστώ

Δημοσ.

Φαντάζομαι στην βάση σου ότι ένα πιθανόν μονοπάτι που μπορεί να πάει ο χρήστης (όπως το παράδειγμα που ανέφερες) το έχεις με ένα id.

 

Δηλαδή

"μονοπάτι" με php,sql" ->10

Web design/development -> 5

Προγραμματισμός -> 3

 

Επίσης αυτό το id θα ξέρεις ποιος είναι ο πατέρας του, δηλαδή σε ποια κατηγορία ανήκει. Και στο τέλος η αρχική κατηγορία δεν θα έχει πατέρα και έτσι θα ξεχωρίζεις και τις κατηγορίες από τις υποκατηγορίες.

 

Δηλαδή το κλειδί 10 έχει πατέρα το 5, το 5 έχει πατέρα τον 3 και τον 3 δεν έχει κανέναν (και βάζεις κενό ή το 0)

 

Με βάση αυτά τα δεδομένα που σου είπα και με μία function είναι πολύ εύκολο κα βρεις το path και να το εμφανίσεις όπως θέλεις εσύ.

 

Παρακάτω είναι και η συνάρτηση που θα καλέσεις για να δημιουργήσεις το path

(Εγώ τα έχω χωρίσει με το "/")

 

>
function get_group($id,$count)
{	
       global $group_data;

$sql = "SELECT sas_descr , sas_parent_id FROM categories WHERE sas_id = '".$id."' ";

$q2 = mysql_query($sql);
while ($r2 = mysql_fetch_array($q2))
{
	$sas_descr = $r2['sas_descr'];
	$sas_parent_id = $r2['sas_parent_id'];
}

if ($count == 0)
{
	$group_data = $sas_descr;
	$count++;
}
else
{
	$group_data .= "/".$sas_descr;
	$count++; 
}

if ($sas_parent_id > 0)
{
	get_group($sas_parent_id,$count);
}

return $group_data;
}

 

Την καλείς κάπως έτσι

>
$group_data = get_group($sau_sas_id,0);

όπου το $sau_sas_id είναι το id της τελευταίας κατηγορίας που βρίσκεται, δηλαδή στο παράδειγμα σου το "μονοπάτι" με php,sql"

Δημοσ.

Uberalles καταρχάς σ'ευχαριστώ για τον χρόνο σου.Διάβασα με προσοχή τον κώδικα σου κι έχω μια-δυό απορίες.

α)

if ($sas_parent_id > 0)

{

get_group($sas_parent_id,$count);

}

 

Σ'αυτο το κομμάτι,η συνάρτηση παίρνει στο όρισμα σαν τιμή το id της κατηγορίας που ανήκει το άρθρο ή η υποκατηγορία.Ξαναεκτελείται λοιπόν η εντολή

$sql = "SELECT sas_descr , sas_parent_id FROM categories WHERE sas_id = '".$id."' ";

μόνο που επιλέγεται το ίδιο πεδίο με πριν απο την βάση δεδομένων.Έτσι μπήκα σε σκέψεις μήπως είναι διαφορετικά δομημένη απ'ότι νόμιζα.Στην δική μου πχ έστω ότι υπάρχει η κατηγορία "Software" με υποκατηγορία "games" και άρθρο "Syberia".Καθένα απ'αυτα είναι σε διαφορετικό πίνακα και και η σύνδεση μεταξύ τους γίνεται ως εξής:

 

Η υποκατηγορία "games" έχει ένα πεδίο cat_id όπου δηλώνεται σε ποια κατηγορία ανήκει(software) , και το "Syberia" πεδίο games_id όπου δηλώνεται ότι ανήκει στην κατηγορία "games" αυτό το άρθρο.

 

Βάσει αυτής της λογικής υπάρχει κάποια αλλαγή που πρέπει να κάνω στον κώδικα που παρέθεσες?

 

β)Μπορείς να μου πεις πως θα καλέσω την συνάρτηση από τον Html κώδικα? Εννοώ αν τις τιμές θα τις ορίζω εγώ ή θα περνιούνται με κάποια μεταβλητή αυτόματα παίρνοντας το Id της βάσης.

 

 

Εαν δεν το ξέρεις, το "μονοπάτι" λέγεται "breadscrumbs" ή "backlinks". Εαν το ξέρεις τότε απλά αγνόησε αυτό το μήνυμα.

Δεν το γνώριζα,καλά έκανες και μου το'πες για να το ψάξω με τον ορισμό στο Google αν χρειαστεί τελικά.

Δημοσ.

Αντώνη, μάλλον χρειάζεσαι κάτι τέτοιο:

>$query="SELECT article.title as title, article.subcatid as articlesubcatid, 
subcat.id as subcatid, subcat.title as subcattitle, subcat.catid as subcatcatid, cat.title as cattitle
FROM article
LEFT JOIN subcat on subcat.id = article.subcatid
LEFT JOIN cat on cat.id = subcat.catid
WHERE article = ".$articleid;
$res=mysql_query($query);
$row = mysql_fetch_row($res);
echo $row['cattitle']." > ".$row['subcattitle']." > ".$row['articletitle'];

Εντάξει, οι ονομασίες στα πεδία είναι ό,τι να 'ναι, αλλα νομίζω ότι καταλαβαίνεις το νόημα

Δημοσ.

Ο κώδικας που σου έγραψα με την function δουλεύει και σε περίπτωση που έχεις ένα μονοπάτι (όπως μας ενημέρωσε και ο φίλος μας macabre_sunsets λέγεται breadcrumbs ή backlinks :) ) σαν το παρακάτω που έχει βάθος

 

Εικόνα, Ήχος -> Τηλεοράσεις -> TFT-LCD-LED -> Απο 32’’ εως 70’’ -> Samsung LE32C450

 

Δυστυχώς με ένα query δεν μπορείς να το φέρεις αυτό.

Και γενικά θα πρέπει να φτιάχνεις τον κώδικα σου να παραμετροποιείται εύκολα.

 

Δηλαδή, εάν τώρα έχεις μόνο ένα μονοπάτι τύπου Κατηγορία -> Υποκατηγορία γίνεται να το φέρεις αυτό με query αλλά εάν στο μέλλον θες να βάλεις Κατηγορία -> Υποκατηγορία -> Υπό-Υποκατηγορία, τότε τι κάνεις;; Πας και αλλάζεις παντού τον κώδικα;; Και πολύ πιθανόν να μην γίνεται.

 

Τώρα στο παράδειγμα που σου έγραψα (Εικόνα, Ήχος -> Τηλεοράσεις -> TFT-LCD-LED -> Απο 32’’ εως 70’’ -> Samsung LE32C450) στον πίνακα σου πρέπει να κρατάς την πληροφορία στην βάση ως εξής :

 

ΔΟΜΗ ΒΑΣΗΣ

sas_id , sas_descr , sas_parent_id

 

Έτσι, για την κατηγορία 'Εικόνα, Ήχος' έχουμε

sas_id = 1 , sas_descr = Εικόνα, Ήχος , sas_parent_id = 0 (ΠΑΤΕΡΑΣ)

 

Για την κατηγορία 'Τηλεοράσεις' έχουμε

sas_id = 10 , sas_descr = Τηλεοράσεις , sas_parent_id = 1

 

Για την κατηγορία 'TFT-LCD-LED' έχουμε

sas_id = 55 , sas_descr = TFT-LCD-LED, sas_parent_id = 10

 

Για την κατηγορία 'Απο 32’’ εως 70’’' έχουμε

sas_id = 112 , sas_descr = Απο 32’’ εως 70’’, sas_parent_id = 55

 

Για την κατηγορία 'Samsung LE32C450' έχουμε

sas_id = 692 , sas_descr = ΑSamsung LE32C450, sas_parent_id = 112

 

Επομένως, την 1η φορά που θα καλέσουμε την function γράφουμε

 

>
$group_data = get_group($sau_sas_id,0);

όπου το $sau_sas_id, θα είναι ίσο με την κατηγορία που θέλεις, δηλαδή στο παράδειγμα μας $sau_sas_id = 692 και θα μας επέστρεφε όλο το μονοπάτι

 

Εάν έβαζες $sau_sas_id = 55, τότε θα μας επέστρεφε μέχρι και την κατηγορία που έχει id το 55, δηλαδή Εικόνα, Ήχος -> Τηλεοράσεις -> TFT-LCD-LED

 

Ελπίζω τώρα να βοήθησα περισσότερο :rolleyes:

Δημοσ.

Κάτσε, γιατί τώρα μπερδεύτηκα κι εγώ... έχεις βάλει όλες τις κατηγορίες, τις υποκατηγορίες και τις υποκατηγορίες αυτών σε έναν πίνακα, με sas_id να είναι το primary;

Δημοσ.

Κάτσε, γιατί τώρα μπερδεύτηκα κι εγώ... έχεις βάλει όλες τις κατηγορίες, τις υποκατηγορίες και τις υποκατηγορίες αυτών σε έναν πίνακα, με sas_id να είναι το primary;

Ναι μπορείς να το κάνεις είτε το sas_id σαν primary αλλά μπορείς να βάλεις και ένα ακόμα πεδίο που θα είναι primary key

Δημοσ.

Κάτσε, γιατί τώρα μπερδεύτηκα κι εγώ... έχεις βάλει όλες τις κατηγορίες, τις υποκατηγορίες και τις υποκατηγορίες αυτών σε έναν πίνακα, με sas_id να είναι το primary;

 

Σ'εναν πίνακα? Πιο λογικό δεν είναι κάθε κατηγορία να'ναι σε ξεχωριστό πίνακα με το πεδίο ID να έχει οριστεί PRIMARY? και φυσικά να υπάρχει και πεδίο που θα δείχνει το parent.

Δημοσ.

Σ'εναν πίνακα? Πιο λογικό δεν είναι κάθε κατηγορία να'ναι σε ξεχωριστό πίνακα με το πεδίο ID να έχει οριστεί PRIMARY? και φυσικά να υπάρχει και πεδίο που θα δείχνει το parent.

Δεν έχεις καταλάβει την φιλοσοφία. Όλα τα δεδομένα σε έναν πίνακα της μορφής

 

+-------------+----------------------+--------+

| category_id | name | parent |

+-------------+----------------------+--------+

| 1 | ELECTRONICS | NULL |

| 2 | TELEVISIONS | 1 |

| 3 | TUBE | 2 |

| 4 | LCD | 2 |

| 5 | PLASMA | 2 |

| 6 | PORTABLE ELECTRONICS | 1 |

| 7 | MP3 PLAYERS | 6 |

| 8 | FLASH | 7 |

| 9 | CD PLAYERS | 6 |

| 10 | 2 WAY RADIOS | 6 |

Δημοσ.

Σ'εναν πίνακα? Πιο λογικό δεν είναι κάθε κατηγορία να'ναι σε ξεχωριστό πίνακα με το πεδίο ID να έχει οριστεί PRIMARY? και φυσικά να υπάρχει και πεδίο που θα δείχνει το parent.

Η βασική διαφορά είναι ότι με τη δική μας προσέγγιση χρειαζόστε ν πίνακες για ν βάθος κατηγοριών (και αντίστοιες αλλαγές στον κώδικά για κάθε προσθήκη βάθους), ενώ με αυτό που λέει ο Uberalles_gr χρειάζεσαι μόνο έναν πίνακα για όλα, ανεξαρτήτως βάθους ή μελλοντικών αλλαγών

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...