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

הוסטס - פורום אחסון האתרים הגדול בישראל (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 קטגוריות, מה אז?

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


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

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