Κατηγοριες υποκατηγοριες

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

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

Απάντηση
NDH
Δημοσιεύσεις: 403
Εγγραφή: 03 Φεβ 2009 13:56
Επικοινωνία:

Κατηγοριες υποκατηγοριες

Δημοσίευση από NDH » 28 Μαρ 2012 19:03

Γεια σας εχω φτιαξει ενα μικρο συστημα κατηγοριοποιησης και θα ηθελα βοηθεια .
SQL Table : id, title, description, sub_cat

Ας πουμε οτι βαζω τις εξης κατηγοριες και υποκατηγοριες.

Κατηγοριες / Ειναι υποκατηγορια της..
1 ----------------- 0
2 ----------------- 1
3 ----------------- 2
4 ----------------- 2
5 ----------------- 3
6 ----------------- 3
7 ----------------- 5

Σκευτικα οτι σε περιπτοση διαγραφης τις πρωτης οι υπολοιπες υποκατηγοριες θα μεινουν κατι που δεν ειναι σωστο γιατι απο την 2 και κατω ολες ειναι υποκατηγοριες της 1 οποτε λεω οτι μπορω να βαλω στον πινακα μου ενα κελι ακομα με ονομα πχ main οπου θα δειχνει την μητρικη κατηγορια. Ναι αλλα αν παω να διαγραψω την 3 θα διαγραφη η 3 η 5 και η 6 που φενετε οτι η 5,6 ειναι υποκατηγοριες της 3, η 7? πως? και αν η εφτα ειχε και αλλες υποκατηγοριες? πως μπορω να το κανω αυτο?

Ευχαριστω!

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Κατηγοριες υποκατηγοριες

Δημοσίευση από dva_dev » 28 Μαρ 2012 19:23

Αυτό το ρόλο παίζουν τα database relations και τα constraints.
Μάλλον αυτό που θέλεις είναι είναι το cascade delete.

Αν το ψάχνεις σε php, το κοιτάς σε λάθος περιοχή. Κοίτα το σε σχέση με τη βάση δεδομένων που χρησιμοποιείς.
(Μπορεί να γίνει και με php αλλά θα έλεγα ότι είναι ο λάθος τρόπος να το κάνεις).

[edit]
οποτε λεω οτι μπορω να βαλω στον πινακα μου ενα κελι ακομα με ονομα πχ main οπου θα δειχνει την μητρικη κατηγορια
Κάθε κατηγορία είναι μητρική κατηγορία για τις υποκατηγορίες της, οπότε αυτό δεν θα βγάλει πουθενά.
[/edit]

NDH
Δημοσιεύσεις: 403
Εγγραφή: 03 Φεβ 2009 13:56
Επικοινωνία:

Κατηγοριες υποκατηγοριες

Δημοσίευση από NDH » 28 Μαρ 2012 19:43

Απο οτι ειδα το cascade delete θελει 2 πινακες αν ειναι ετσι τοτε τι θα κραταει ο δευτερος πινακας?

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Κατηγοριες υποκατηγοριες

Δημοσίευση από dva_dev » 28 Μαρ 2012 20:52

Μπορεί να γίνει self join πάνω στον ίδιο πίνακα. Γι αυτό το λόγο δεν έχεις βάλει τα κατηγορία και υποκατηγορία (βασικά μητρική κατηγορία).
Αυτό που ίσως χρειαστεί αλλαγή είναι το 0 στο υποκατηγορία να γίνει null και το πεδίο να επιτρέπει nulls.

NDH
Δημοσιεύσεις: 403
Εγγραφή: 03 Φεβ 2009 13:56
Επικοινωνία:

Κατηγοριες υποκατηγοριες

Δημοσίευση από NDH » 28 Μαρ 2012 21:53

και παλι νομιζω δεν θα τα διαγραφει ολα σωστα!

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27616
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Κατηγοριες υποκατηγοριες

Δημοσίευση από cordis » 28 Μαρ 2012 22:47

ή φτιάχνεις μια διαδικασία με ανάδραση που πάει και τις σβήνει όλες από πάνω προς τα κάτω.
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

NDH
Δημοσιεύσεις: 403
Εγγραφή: 03 Φεβ 2009 13:56
Επικοινωνία:

Κατηγοριες υποκατηγοριες

Δημοσίευση από NDH » 28 Μαρ 2012 22:56

δηλαδη? (λιγες παραπανω λεπτομεριες να καταλαβω)

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27616
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Κατηγοριες υποκατηγοριες

Δημοσίευση από cordis » 28 Μαρ 2012 23:47

feedback loop, βρόγχος με ανάδραση.

είναι μια διαδικασία / function που καλεί τον εαυτό της.

σε φυσική γλώσσα νομίζω ότι θες κάτι τέτοιο:

διαδικασία > σβήσε την κατηγορία (Χ)
βρες εάν η Χ κατηγορία είναι μητρική σε κάποια άλλη.
κάλεσε για κάθε μια που είναι μητρική την διαδικασία > σβήσε την κατηγορία ( αριθμός κατηγορίας που είναι μητρική )
σβήσε την κατηγορία Χ όταν δεν υπάρχουν άλλες κατηγορίες που είναι μητρική


αυτό σταδιακά θα σβήνει από κάτω προς τα πάνω φτάνοντας και στην αρχική κατηγορία που θες να σβήσεις.
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

NDH
Δημοσιεύσεις: 403
Εγγραφή: 03 Φεβ 2009 13:56
Επικοινωνία:

Κατηγοριες υποκατηγοριες

Δημοσίευση από NDH » 28 Μαρ 2012 23:56

Nαι αλλα νομιζω σε αυτο που λες πχ στο παραδειγμα που πρωτο εδωσα εαν βαλεις να σβηστει η 3 θα σβησει και τιν 5 και 6 οπου εχουν μητρικη την 3 αλλα την 7 που εχει μητρικη την 5? Θα μεινει ξεφραγη σαν βαρος στην βαση .
Κατηγοριες / Ειναι υποκατηγορια της..
1 ----------------- 0
2 ----------------- 1
3 ----------------- 2
4 ----------------- 2
5 ----------------- 3
6 ----------------- 3
7 ----------------- 5

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27616
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Κατηγοριες υποκατηγοριες

Δημοσίευση από cordis » 29 Μαρ 2012 00:34

αφού θα σβήσει την 5 και την 6 γιατί να μη σβήσει και την 7;

κάποια στιγμή θα τρέξει το:

διαδικασία > σβήσε την κατηγορία (5)
βρες εάν η 5 κατηγορία είναι μητρική σε κάποια άλλη.
κάλεσε για κάθε μια που είναι μητρική την διαδικασία > σβήσε την κατηγορία ( αριθμός κατηγορίας που είναι μητρική --7--)
σβήσε την κατηγορία 5 όταν δεν υπάρχουν άλλες κατηγορίες που είναι μητρική
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27616
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Κατηγοριες υποκατηγοριες

Δημοσίευση από cordis » 29 Μαρ 2012 01:14

κάτι τέτοιο... το έγραψα στο γρήγορα και χωρίς να το τεστάρο...

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

function delete_cat($cat_id) {
   $sql = "select cat_id from cats where parent_cat = " . $cat_id;
   $res = mysql_query($sql);
   while ($row = mysql_fetch_array($res) ) delete_cat($row[0]);
   $sqld = "delete from cats where cat_id = " . $cat_id;
   $resd = mysql_query($sqld);
}
Τελευταία επεξεργασία από το μέλος cordis την 29 Μαρ 2012 14:21, έχει επεξεργασθεί 1 φορά συνολικά.
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

NDH
Δημοσιεύσεις: 403
Εγγραφή: 03 Φεβ 2009 13:56
Επικοινωνία:

Κατηγοριες υποκατηγοριες

Δημοσίευση από NDH » 29 Μαρ 2012 02:21

Ευχαριστω πολυ θα το κοιταξω!
Και αλλαγη σε αυτο

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

$resd = mysql_query($sql); 
ετσι

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

$resd = mysql_query($sqld); 
Edit: Τελικα δουλευει ! Ευχαριστω!

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

Κατηγοριες υποκατηγοριες

Δημοσίευση από korgr » 29 Μαρ 2012 09:32

χαχα θα κλάψουν μανούλες :D
Ωραία να διαγράφεις με recursive function ΑΛΛΑ:

1ο πρόβλημα
όσα προϊόντα έχουν αντιστοίχιση στις διαγραφόμενες κατηγορίες μένουν orphans

2ο πρόβλημα (για με κυριότερο γιατί μου έχει τύχει)
Επιλέγει ο πελάτης από το admin κατά λάθος να διαγράψει μια root κατηγορία που έχει την μάνα της και τον πατέρα της! Άντε γεια :)

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

Κατηγοριες υποκατηγοριες

Δημοσίευση από Khronos » 29 Μαρ 2012 10:48

Αν δεν μπορούν να γίνουν όλοι αυτοί οι έλεγχοι σε επίπεδο βάσης (επειδή δεν υποστηρίζονται foreign keys) το καλύτερο για μένα είναι προγραμματιστικά να ελέγχεις αν η κατηγορία που θες να διαγράψεις έχει εγγραφές που εξαρτώνται απο αυτήν, είτε είναι άλλες κατηγορίες, είτε προϊόντα κτλ κτλ. και να μην αφήνεις να τη διαγράψει.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Κατηγοριες υποκατηγοριες

Δημοσίευση από dva_dev » 29 Μαρ 2012 11:37

Αν δεν μπορούν να γίνουν όλοι αυτοί οι έλεγχοι σε επίπεδο βάσης (επειδή δεν υποστηρίζονται foreign keys), διάλεξε άλλη βάση που να μπορούν να γίνουν αυτοί οι έλεγχοι.
Ούτως ή άλλως ο έλεγχος πρέπει να γίνεται για να ενημερώνεται ο χρήστης/διαχειριστής ότι πρόκειται να διαγράψει το σύμπαν.

Απάντηση

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

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

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