עזרה!!

amircx

New member
עזרה!!

חברים אני מנסה לקחת מה DB רקורד ראנדומלי וזה לא עובד לי (זה נותן לי רקורד מספר 2 או משהו לא ידוע בקיצור לא עושה ראנדומייז) למישהו יש מושג למה??? הקוד: mysql_select_db("DDDD"); if ($id == "rnd") { $q = mysql_query("SELECT * FROM cxtik ORDER BY rand() LIMIT 1") or die("There is an SQL Error."); echo "randomize!!"; } else { $q = mysql_query("select * from cxtik where id='$id'") or die("There is an SQL Error."); } $r = mysql_fetch_array($q)
 

אמיר ט

New member
לא יותר פשוט...

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

orenphp

New member
לא יודע אם פשוט, אבל...

תכנותית זה בטח שלא נכון. שמע, עשית התחברות מול המסד, שלפת X תוצאות שיש במסד (לצורך הדגמה אני ינקוט פה בשיטת ההגזמה - מיליון רשומות), העברת את לresource בPHP (כאשר באותו הresource תשתמש באמצעות מערך או אובייקט), בחרת לעצמך ID רנדמולי שוב בPHP ואז שלפת את הרשומה מאותו המערך שמכיל מיליון רשומות(!) - אני כמובן לא צריך לדבר פה על יעילות/זיכרון וכו'. חוץ מזה שזו לא עבודה תקינה - ויתור על פונקציה שנתמכת ברמת בסיס הנתונים. כל דבר שאתה יכול לעשות ברמה של בסיס הנתונים (שגם ככה תאלץ להשתמש בו) - תעשה שם (יותר מהיר ויותר "נכון" תכנותית - הפרדת שכבות). נעבור לחלק של הקוד: הקוד כפי שראיתי נראה תקין. קראתי באתר של mysql והנה כמה דברים על הפונקציה:
RAND() is not meant to be a perfect random generator, but instead a fast way to generate ad hoc random numbers that will be portable between platforms for the same MySQL version.​
כלומר אין פה שלמות למרות שזה אמור לעבוד סה"כ מספיק טוב. בטבלה שבחרת, כמה רשומות יש? מה בדיוק קורה כאשר אתה בוחר רשומה? הוא תמיד בוחר את הראשונה או שנייה? אני מניח שכבר עשית את זה - אבל אחרי שקיבלת את הרשומה, תנסה להדפיס את הרשומה הזו עם:
$q = "select * from x order by rand() LIMIT 1"; $res = mysql_fetch_array(mysql_query($q)); print_r($res);​
תוודא שאכן קיבלת כל פעם את אותם הפרטים (לוודא שאכן הפונקציה לא עובדת). תביא את התוצאות שלך לפה וננסה להמשיך לעזור - בדרך התקינה יותר (אני מנסה להיות פוליטקלי קורקט ולא להגיד הדרך הנכונה) - דרך שכבת המסד נתונים.
 

אמיר ט

New member
לא ירדת לדעתי

הכוונה שלי לא הייתה לשלוף את כל הרשומות אלא לעשות ראנדום בין 1 ל מקסימום ואז לשלוף מהמסד נתונים את הארשומה בעלת ה ID שנבחר רנדומלית. זה אולי לא הפתרון הכי יעיל אבל הוא בהחלט פשוט מאד.
 

orenphp

New member
אבל בשביל לקבל את המספר המקס'

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

orenphp

New member
המשך בנושא:

ראיתי פיתרון באחד הדפים בmysql.com וחשבתי להביא אותו לפה ולקוות שהוא יעזור לך (שיפצרתי אותו קצת שיתאים למקרה שלך):
SELECT *, MD5(RAND()) AS myRandom FROM cxtik ORDER BY myRandom LIMIT 0, 1​
במקרה הזה אמור להיווצר קוד MD5 רנדומלי לחלוטין (כל פעם שונה מקודמו) אשר יבטיח תוצאה שונה (לא נבדק על ידי, אבל נראה שזה עובד טוב אצל אחרים) קישור: ------ http://www.mysql.com/doc/en/Mathematical_functions.html#IDX1272
 

White Trash

New member
עוד בעיה

וסליחה על ההתערבות, אבל מה עם ה-ID הם לא מספרים רציפים (אולי נמחקו רשומות מהאמצע ? - אני לא מכיר את המקרה הספציפי). זה עלול לגרום לחיפוש של ID לא קיים, ואז יהייה צריך לבחור חדש ו...
 

Mr Boggy Man

New member
בשביל זה צריך לדעת לנהל מסד נתונים

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

DannyZ

New member
אבל הorderby

המספרים שלו ה orderby זה המספרים של התוצאות מהשאילתה אני חושב. זה לא המספרים של הID ולOrenphp בדרך שלך אתה שולף את כל התוצאות ועושה רנדומייז לשורה שתפלט ראשונה.. אתה עדיין בוחר את כל 'מיליון' השורות שיש שם.. (זה ביחס לדוגמה הראשונה שלך)
 

orenphp

New member
לא נכון...

השאליתא תחזיר שורה אחת (ורנדומלית) בלבד! "LIMIT 1". במקרה ולא הבנת, לפי השיטה של אמיר, ישלפו כל התוצאות מהמסד אל מערך בPHP (או בצורת עבודה עם אובייקטים, זה לא משנה כרגע), ואז בPHP תתבצע השליפה של שורה בודדת. אני העברתי את הטיפול לידי המסד נתונים אשר יחזיר לי לPHP רק שורה אחת!
 

danibz

New member
תבקש את - שוקי בבקשה../images/Emo157.gif

אולי שוקי יעזור לך הוא בפורום זה "שלום כאן שוקי מדבר"
 
למעלה