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

הוסטס - פורום אחסון האתרים הגדול בישראל (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=72380)

0xfo7d 02-03-09 15:28

שאלה קטנה ב PHP...
 
שלום...

אני מפתח כרגע מערכת של אינדקס חברות ומוצרים.

המערכת תעבוד בצורה כזו:
אופציה להוספת קטגוריה.
אופציה להוספת חברה/מוצר(בתהליך ההוספה יהיה בחירת מספר קטגוריות לשיוך אותה החברה/מוצר).

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

את רוב הדבר הזה כבר עשיתי ואין שום בעיה...
מה שאני קצת מסתבך בו זה העניין שבהוספת החברה/מוצר אני רוצה לעשות בחירה מרובה של קטגוריות...אז אני שולף מהטבלה של הקטגוריות את כל הקטגוריות ומדפיס כפלט תיבות סימון ב-V ליד כל שם של כטגוריה...אבל איך אני מכניס את זה למסד...?
ואח"כ אחרי שהכנסתי...איך בסינון תוצאות אני מציג רק את החברותמוצרים שמשוייכים לאותה קטגוריה...?


אשמח לעזרה במהרה,
מתן.

vadimg88 02-03-09 15:46

למידע מסוג זה עדיף תשתמש בתיבת בחירה מרובה ולא בתיבות סימון. לדוגמא:

קוד:

<select name='cats' multiple='multiple'>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>

ידפיס תיבת בחירה שאפשר לבחור יותר מערך אחד. לאחר מכן כשתרצה לשמור את מה שהמשתמש בחר תעשה משהו כזה:

קוד:

# Save to DB
$saved_cats = is_array($_POST['cats']) ? implode(',', $_POST['cats']) : $_POST['cats'];

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

קוד:

# Get from DB
$cats_array = explode(',', $row['cats']);


DvirCohen 02-03-09 15:50

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

<select name='cats[]'...

0xfo7d 02-03-09 16:01

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

vadimg88 02-03-09 16:03

כן זה צריך להיות cats[] שמעיד שזהו מערך ולא ערך בודד. אתה לא יכול להכניס מערך למסד נתונים זה ישבור אותו. זה או שתבצע serialize על המערך ותשמור את זה או שתבצע implode על המערך ותשמור אותו כסטרינג מופרד בפסיק או כל דבר אחר.

0xfo7d 02-03-09 16:18

לא ממש הבנתי אותך ואדים...

תראה בסופו של דבר אני רוצה שבפאנל ניהול תהיה הבחירה מרובה הזו...

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

אם יהיה חברה/מוצר שבבחירה מרובה בחרתי להם 3 קטגוריות...אז בסינון תוצאות שהגולש עושה הם יופעו תחת 3 הקטגוריות האלו...

הבנת את הרעיון?

AlmogBaku 02-03-09 18:34

הפתרון של ואדים פשוט, אתה מכניס את השמות קטג' בהפרדה של פסיקים...

למשל
cat_1, cat2, cat3


כדי לחפש אתה פשוט עושה like לשדה הזה.
וכדי להציג שמות קטג' אתה עושה explode ולתשובה אתה מנתח את מה שאתה רוצה..

SDF 02-03-09 20:19

ככה לא בונים חומה.
איך אחריי זה תתחיל לשלוף את כל המוצרים שבקטגוריה X?
עם LIKE וחבריו?

לדעתי הדרך היא:

3 טבלאות:
טבלת קטגוריות
טבלת מוצרים

טבלה שמקשרת קטגוריות למוצרים ( קשר רבים-לרבים )
השליפה עם JOIN.

עוד על זה:
http://en.wikipedia.org/wiki/Database_normalization
http://www.tonymarston.net/php-mysql/many-to-many.html

ופה:
http://www.phpro.org/tutorials/Taggi...And-MySQL.html
יש טאגים לכתבות,
במקרה שלך קטגרויות למוצרים, המימוש זהה.

AlmogBaku 03-03-09 00:38

לדעתי זה מסובך וביזבוז משאבים, ובטח- לא מסודר.בחירה שלך..

SDF 03-03-09 01:54

like ברוב המקרים יעשה fulltable scan
ו join עם אינדקסים מתאימים לא.

וגם, אם יש מוצר שיושב ב100 קטגרויות, אז אתה צריך עבור כל שורה, שהתא של הקטגרויות,
יכיל 100*מס' מקסימלי של תווים בקטגוריה.
אבל רגע, אם נרצה מוצר שיושב ב200 קטגוריות, מה אז?

אז מה יותר מבזבז משאבים?

vadimg88 03-03-09 08:24

לא מחפשים סטרינג בעזרת LIKE, גם בטוח לא בשיטה השנייה ש SDF הציע שרק תסבך הכל כאן ולא תעזור הרבה. בישביל לחפש אחר ערך כלשהו בתור שדה שיש בו סטרינג המופרד בפסיקים אפשר להשתמש או ב explode ואז שימוש בשאילתה ב IN או ב CONCAT אחד מהשניים יעשה את העבודה.

SDF 03-03-09 12:30

אולי קצת יותר מסובך, אבל הרבה יותר יעיל.
אתה רוצה משהו טוב או משהו קל?

vadimg88 03-03-09 12:33

זה לא יותר יעיל. למה ששימוש ב JOIN כדי לבצע שאילתה על כמה טבלאות תיהיה יעילה יותר משמירת הנתונים כסטרינג בעמודה אחת בטבלה אחת ושליפת הנתונים בעזרת פקודות מובנות של SQL כמו IN ו CONCAT?!

AlmogBaku 03-03-09 17:13

???????


שמעת על המושג scalability?

SDF 03-03-09 21:08

ציטוט:

נכתב במקור על ידי vadimg88 (פרסם 700993)
זה לא יותר יעיל. למה ששימוש ב JOIN כדי לבצע שאילתה על כמה טבלאות תיהיה יעילה יותר משמירת הנתונים כסטרינג בעמודה אחת בטבלה אחת ושליפת הנתונים בעזרת פקודות מובנות של SQL כמו IN ו CONCAT?!

כי שימוש בפונקציה בתוך WHERE גורר לרוב full table scan
כשאתה עושה join לפי מפתחות יש לך אינדקסים שמשפרים ביצועים.

אתה גם מוזמן לראות איך מערכות גודולות עושות את זה,
למשל wordpress:
http://codex.wordpress.org/images/8/83/WP_27_dbsERD.png

wp_term_relantionship מקשרת בין wp_term_taxanomy (קטגוריות) ל wp_posts.

intercooler3819 03-03-09 21:19

ואדים
מה שהוא אמר יותר נכון גם לוגית

כאשר יש לך 2 טבלאות ויש לך קשר של many to many רצוי ליצור relations table או יותר נכון צריך ליצור אחת כזאת
שתהיה משהו כמו
id | a_id | b_id

ותפעיל 2 פונקצית אינדקסים פעם אחת לפי a_id, b_id פעם שניה הפוך ופעם שלישית לפי id

אחרכך בעת שליפה פשוט תשחק עם הטבלאת יחסים ועם JOIN פשוט הכל בחוץ

LIKE, CONCAT, IN וכד' לרוב מחייבים סריקה של כל הטבלה

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

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

וואדים הראש שלך בכלל בענניםן בנוגע ליעילות...

SDF - כל הכבוד על הידע
לא חשבתי שיש פה אנשים כמוני שמתעסקים ביעילות (;

AlmogBaku 03-03-09 21:39

יעיל יעיל אבל לא נוח לעבודה.
אתה יכול לבנות את זה ככה אבל זה מסורבל.


לא מדובר פה על דבר שמשפיע ברמה קריטית, כך שמה שאתם טוענים הוא קטנוניות שעולה בנוחיות.

vadimg88 03-03-09 21:51

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

1. אני בטוח שהוא לא יריץ את הפקודה על טבלה עם 100,000 רשומות אלה הרבה פחות, שבמקרים כאלה הפקודות CONCAT ו IN יעבדו מספיק מהר (לא יודע אם יותר מהר השיטה הנוספות) אבל בהחלט משהו שהוא לא מורגש למשתמש.
2. שיטה זו היא לא משהו שמתכנת בסדר גודל של פותח האשכול מעוניין לעבוד איתו, אם הוא שואל שאלות כאלו.
3. אין ספק שימוש ב LIKE בהחלט יעשה סריקה לאורך כל הטבלה, אבל שוב ראו #1 ובנוסף אפשר בהחלט לכתוב את זה בצורה אופטימלית עם שימוש ב LIMIT או DISTINCT וכדומה, לא חסר.

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

ציטוט:

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

intercooler3819 03-03-09 21:57

אני לא טיפוס שחצן, להפך

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

בכל מקרה אני זזתי


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

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