הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   [PHP] קטגוריות רקורסיביות (?) (https://hosts.co.il/forums/showthread.php?t=39497)

sUP 08-02-07 16:05

[PHP] קטגוריות רקורסיביות (?)
 
הי :-D

יש לי עבודה קטנה על קטגוריות רקורסיביות,
כך שלדוגמא בכל קטגוריה \ תת קטגוריה \ תת-תת-תת קטגוריה יוכלו להוסיף פריט מסויים

אני קצת נתקע עם התכנות של זה

אשמח אם תוכלו לעזור לי |קורץ|

תודה

BlueNosE 08-02-07 18:19

קטגוריות תמיד יש.
לכן נוסיף טבלה שתיקרא Cats.
נחלק את הטבלה Cats בצורה הבאה:
ID - Name - Description - cID
ID צריך להיות PRIMARY וכל השיט.
Name הוא שם הקטגוריה.
Description הוא תיאור הקטגוריה.
cID צריך לקבל ערך 0. אם הוא לא 0, הערך שיקבל יהיה הקטגוריה שמעליו (בעצם אם הוא לא 0 הוא לא קטגוריה אלא סאב קטגוריה).

בתוכם יוכלו להיות או אייטמים או סאב קטגוריות.
לכן ניצור טבלה חדשה, Items.
את Items נחלק כך:
ID - Name - Description - cID
ID שוב יהיה PRIMARY עם מספור אוטומטי.
Name שם, Description תיאור..
עכשיו cID זה הקטגוריה / הסאב.

שליפה:
PHP קוד:

function getinto($Cat)
{
$qry = @mysql_query ("SELECT * FROM Cats WHERE ID={$Cat}");
$q mysql_fetch_assoc ($qry);// או אריי, איך שבא לך
echo "details here.. {$q['Name']}{$q['Description']}";
$qry = @mysql_query ("SELECT * FROM Cats WHERE cID={$Cat}");
if (@
mysql_num_rows ($qry) > 0)
while (
$c mysql_fetch_array ($qry))
{
echo 
"{$c['Name']} - {$c['Description']}";
getinto($c['ID']);
}
$qry = @mysql_query ("SELECT * FROM Items WHERE cID={$Cat}");
if (@
mysql_num_rows ($qry) > 0)
while (
$i mysql_fetch_array ($qry))
echo 
"{$i['Name']} - {$i['Description']}";
}

$qry mysql_query ("SELECT * FROM Cats WHERE cID=0");
while (
$q mysql_fetch_array ($qry))
{
echo 
"{$q['Name']} - קטגוריה ראשית";
getinto($q['ID']);


נסה.. בוא נגיד שזה הומצא בתיבת טקסט זו..

nevo 08-02-07 18:27

לדעתי אפשר לעשות את זה בטבלה אחת, יותר טוב :)
פשוט תוסיף עוד שדה
c_type
שנגיד 1 = קטגוריה || 2 = סאב קטגוריה || 3 = סאב סאב... וכו'....

ali_napso 08-02-07 18:27

בעיקרון אתה עושה שלכל קטגוריה יהיה קישוריות מסויימת לקטגוריה שמעליו(מן הסתם הID שלו) ובשליפה אתה בודק אם לקטגוריה שמעליו יש עוד קטגוריה מעליו וכך הלאה עד שאתה מגיע לראשי


ציטוט:

נכתב במקור על ידי nevo (פרסם 420124)
לדעתי אפשר לעשות את זה בטבלה אחת, יותר טוב :)
פשוט תוסיף עוד שדה
c_type
שנגיד 1 = קטגוריה || 2 = סאב קטגוריה || 3 = סאב סאב... וכו'....

אבל שאתה מוסיף קטגוריה אתה תצטרך לבדוק כל פעם מחדש כמה "סאבים" יש וזה יהיה סתם ביזבוז

sUP 08-02-07 18:43

בחלה :)
תודה עומר

BlueNosE 08-02-07 18:46

ציטוט:

נכתב במקור על ידי sUP (פרסם 420137)
בחלה :)
תודה עומר

בכיף :)
הצלחת, הכל היה ברור?

Level-Serv 08-02-07 18:47

עשיתי לפני איזה חודש פונקציה נורא יפה של קטגוריות רקורסיוביות...
הפונקציה היא פונקציה רקורסיבית עם div נפתחים שלכל קטגוריה יש קטגוריות נוספות ודפי תוכן. אי הגבלה לכמות הקטגוריות שניתן להכניס (לעומק של הרקורסיה).

אם אתה רוצה את הפונקציה צור קשר ואני אתן לך...

The Crow 08-02-07 18:50

BlueNosE, הקוד שלך ממש ממש ממש לא יעיל.
4 שאליתות + 3 לולאות שקוראות לעצמן...
ממש לא מומלץ.

בכל אופן, הטבלה של הקטגוריות צריכה להראות כך:
קוד:

id | parent_id | title
אם זו קטגוריה ראשית, אתה שם 0 ב parent_id.

בשליפה של הקטגוריות:
1. קודם כל שלוף את כל הקטגוריות לתוך מערך
2. קרא לפונקציה מסוימת, נקרא לה getCats והפונקציה הזאת תקבל 2 פרמטרים: catArr, parent_id
catArr - מערך עם כל הקטגוריות שיצרת בשלב 1
parent_id - כדי להציג את כל הקטגוריות הוא צריך להיות 0

בתוך הפונקציה, אתה עובר על המערך ובודק עבור כל ערך אם ה parent_id שלו שווה ל parent_id של הפונקציה. אם כן, אתה מדפיס/מאחסן אותו איפשהו וקורא לפונקציה getCats עם אותו מערך, רק שהפרמטר השני יהיה ה id של הערך הנוכחי.

הנה דוגמא של הפונקציה:
PHP קוד:

function getCats($arr$parent 0)
{
   foreach (
$arr as $val)
   {
        if (
$val['parent_id'] == $parent)
        {
           echo 
$val['title'];
           
getCats($arr$val['id']);
        }
   }


מקווה שהכל מובן.
בהצלחה :)

BlueNosE 08-02-07 18:54

ציטוט:

נכתב במקור על ידי The Crow (פרסם 420144)
BlueNosE, הקוד שלך ממש ממש ממש לא יעיל.
4 שאליתות + 3 לולאות שקוראות לעצמן...
ממש לא מומלץ.

בכל אופן, הטבלה של הקטגוריות צריכה להראות כך:
קוד:

id | parent_id | title
אם זו קטגוריה ראשית, אתה שם 0 ב parent_id.

בשליפה של הקטגוריות:
1. קודם כל שלוף את כל הקטגוריות לתוך מערך
2. קרא לפונקציה מסוימת, נקרא לה getCats והפונקציה הזאת תקבל 2 פרמטרים: catArr, parent_id
catArr - מערך עם כל הקטגוריות שיצרת בשלב 1
parent_id - כדי להציג את כל הקטגוריות הוא צריך להיות 0

בתוך הפונקציה, אתה עובר על המערך ובודק עבור כל ערך אם ה parent_id שלו שווה ל parent_id של הפונקציה. אם כן, אתה מדפיס/מאחסן אותו איפשהו וקורא לפונקציה getCats עם אותו מערך, רק שהפרמטר השני יהיה ה id של הערך הנוכחי.

הנה דוגמא של הפונקציה:
PHP קוד:

function getCats($arr$parent 0)
{
   foreach (
$arr as $val)
   {
        if (
$val['parent_id'] == $parent)
        {
           echo 
$val['title'];
           
getCats($arr$val['id']);
        }
   }


מקווה שהכל מובן.
בהצלחה :)

ולהריץ לולאת FOREACH בכל בדיקה לא תיקח יותר משאבים?
מילא אם היית עושה continue בין לבין..

חוץ מזה, הוא ביקש הצגת משהו בתוך הקטגוריה לא?..

The Crow 08-02-07 18:58

ציטוט:

נכתב במקור על ידי BlueNosE (פרסם 420147)
ולהריץ לולאת FOREACH בכל בדיקה לא תיקח יותר משאבים?
מילא אם היית עושה continue בין לבין..

חוץ מזה, הוא ביקש הצגת משהו בתוך הקטגוריה לא?..

לא, זה לא יקח יותר משאבים.
הצגת המידע על אותו עקרון... אני לא הולך לכתוב לו את כל הקוד.

sUP 08-02-07 19:03

אני אנסה לשלב בין מה שעומר הביא למה שאתה הבא (רן)
תודה שוב :)

אני עוד עובד על זה חח

BlueNosE 08-02-07 19:17

ציטוט:

נכתב במקור על ידי The Crow (פרסם 420151)
לא, זה לא יקח יותר משאבים.
הצגת המידע על אותו עקרון... אני לא הולך לכתוב לו את כל הקוד.

ובכל זאת, אני בעד לשים continue במקרה של מציאה.

RS324 08-02-07 19:54

למה לא לעשות משהו בסגנון :

PHP קוד:

mysql_query("SELECT cat.* ,pcat.title AS pcattitle
                 FROM category AS cat
                 LEFT JOIN category AS pcat ON (cat.pcatid = pcat.catid)
                 "
); 

ואז בשליפה של ה WHILE אתה מקבל את הכתורת ואת ה ID של הקטגוריה... צריך לעבוד קצת על ה MYSQL אבל זה נראה לי הרבה יותר יעיל מכל ההצעות שרצו פה...

sUP 08-02-07 20:11

ממ.. אפשר הסבר על השאילתה?
לא יצא לי עדיין ללמוד את זה

BlueNosE 08-02-07 20:20

ציטוט:

נכתב במקור על ידי sUP (פרסם 420199)
ממ.. אפשר הסבר על השאילתה?
לא יצא לי עדיין ללמוד את זה

PHP קוד:

mysql_query("SELECT cat.* ,pcat.title AS pcattitle
                 FROM category AS cat
                 LEFT JOIN category AS pcat ON (cat.pcatid = pcat.catid)
                 "
); 

cat.*
שלוף מהטבלה cat הכל (CAT הוא קיצור)
pcat.title
שלוף מהטבלה pcat כותרת (PCAT הוא קיצור)
AS pcattitle
בהמשך, קרא לו pcattitle (ALIAS אם אתה מכיר את המושג)
FROM category AS cat
מהטבלה category בקיצור CAT - כאן מוגדר הקיצור CAT.
LEFT JOIN category AS pcat
שלוף גם מcategory כPCAT - כאן מוגדר הקיצור PCAT.
ON (cat.pcatid = pcat.catid)
איפה שcat.pcatid שווה לpcat.catid, כלומר איפה שהPCATID בCAT שווה לCATID בPCAT.
שוב שימוש בALIASES.

tnadav 09-02-07 22:55

לא כל-כך קראתי את מה שהיה פה לעומק, אבל אני מציע בחום לעשות פעילות כזאת, אפילו במערכת קטגוריות, בצד לקוח ולא בצד שרת.
יש פה מדריך ליצירת פורום כזה ב- ASP, אבל מן הסתם העיקרון פה ה- JS, ולא קשה להפוך את ה- ASP ל- PHP.

לגבי היעילות של הקוד JS, לא בדקתי את זה יותר מידי, בכלל רקורסיה לא עושה טוב לראש שלי :) אז הנה קישור למדריך ב- WebMaster (יש פה עוד כמה בונוסים, תקרא על הבניית פורום לינארי)
http://www.webmaster.org.il/article.asp?id=149

sUP 10-02-07 01:09

ציטוט:

נכתב במקור על ידי tnadav (פרסם 420808)
לא כל-כך קראתי את מה שהיה פה לעומק, אבל אני מציע בחום לעשות פעילות כזאת, אפילו במערכת קטגוריות, בצד לקוח ולא בצד שרת.
יש פה מדריך ליצירת פורום כזה ב- ASP, אבל מן הסתם העיקרון פה ה- JS, ולא קשה להפוך את ה- ASP ל- PHP.

לגבי היעילות של הקוד JS, לא בדקתי את זה יותר מידי, בכלל רקורסיה לא עושה טוב לראש שלי :) אז הנה קישור למדריך ב- WebMaster (יש פה עוד כמה בונוסים, תקרא על הבניית פורום לינארי)
http://www.webmaster.org.il/article.asp?id=149

Jesussss
מה לעזאזל? חחח8-*

זה נירא לי כמו ג'יבריש

אבל תודה על הנסיון

tnadav 10-02-07 11:52

ציטוט:

נכתב במקור על ידי sUP (פרסם 420860)
Jesussss
מה לעזאזל? חחח8-*

זה נירא לי כמו ג'יבריש

אבל תודה על הנסיון

זה מאוד חשוב.. כעיקרון אתה צריך רק את החלק הראשון...
זה בעצם שיפור לפורום רקורסיבי, הבעיה בפורום רקורסיבי, זה שרקורסיה זאת טכניקה שידועה כמבזבזת משאבים, מה שמראים במאמר הזה, זה איך לחסוך את הרקורסיה מצד שרת, להוציא לפלט מחרוזת, עכשיו, את הרקורסיה מבצעים ב- JS בצד-לקוח, היתרון הוא שבמקום שהשרת יעשה את הפעולה הכבדה מאות פעמים, השרת יעשה פעולה פשוטה יחסית, ואת החישוב ה- "מסיבי" יעשו בצד לקוח, וככה, חסכת המון משאבים.

sUP 11-02-07 17:22

OK
ומזה בעצם עושה?
מה הפונקציה getString ב ASP עושה?


כל הזמנים הם GMT +2. הזמן כעת הוא 12:33.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ