MYSQL_INSERT_ID

patael

New member
MYSQL_INSERT_ID

האם הפונקציה הזו מחזירה את ה ID האחרון שנכנס ל DB, או שהיא מחזירה את ה ID האחרון שנכנס לDB ע"י משתמש מסויים. למשל, יש לי שני משתמשים ONLINE והם מעדכנים נתונים ל DB . יכול להיווצר מצב ששניים עדכנו לתוך ה DB ממש בסמוך, ואחד שמריץ MYSQL_INSERT_ID קיבל את התוצאה של השני שהכניס נתונים? כלומר את את ה ID האחרון שהוכנס ל DB? אבי
 

Megapuzik

New member
-

תראה, בעיקרון אם עשית בטבלאה שלך PRIMARY ID אז היא תחזיר אותו, זאת אומרת את האחרון שנרשם, ובמקרה הזה לא יכול בשם אופן לצאת אותו מספר פעמיים או שמישהו אחר יקבל מספר שונה וכו´...
 

patael

New member
אז יש לי חדשות (נראה לי....).

יש לי רשת, המון מחשבים. אני ועוד 4 אנשים, יחד* ממחשבים שונים עשינו SUBMIT כל אחד לשם שלו. ויחד עם זאת ביקשנו את ה MYSQL_INSERT_ID של כל אחד. התאמנו את מה שקיבלנו למה שקיים ב DB וזה היה ממש שונה, כמעט כל אחד הוחזר לו ערך שונה ממש שיש ב DB. 4 רשומות ב DB כל רשומה עם ID ושם, מה שקיבלנו בMYSQL_INSERT_ID שונה ממה שקיבלנו בפועל בתוך ה DB 4 נסיונות עם כשלונות.... *ממש באותה חצי שניה אבי
 

Megapuzik

New member
ואללה ?

או שזה באג בPHP או שפיספסנו את המטרה של הפונקציה
 

אמיר ט

New member
MYSQL_INSERT_ID

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

shanor

New member
נו באמת איזה מצחיקים אתם....

הפונקציה הזו עושה בדיוק מה שתיארתם רק שפיספסתם קצת... היא לא מחזירה את השורה האחרונה שהוכנסה למאגר הנתונים שלכם (היא כן אבל תנו לי שניה להסביר). מה שהפוקנציה הזו עושה הוא בעצם להציג את ה-ID שנוצר בעקבות פעולת ה- INSERT האחרונה שביצע משתמש. עכשיו, העיניין הוא כזה שכשמתשמש אחד שולח נתון (לשם הפשטות נניח שיש נתון אחד בלבד) דרך INSERT למאגר, נוספת שורה ונתון שהוגדר קודם כ- AUTOINCREASE, גודל ב-1. התשובה ש-MYSQL נותן מוחזרת בפרמטר שמצביע על המוקם בזיכרון ששם יושבת התגובה של ה- MYSQL, במקרה הזה כלום במקרה של הצלחה או הודעת שגיאה במקרה של כישלון. באותו בלוק זיכרון, שהפרמטר הזה מצביע עליו יש עוד מספר נתונים (חלקם הם תוצאה של פלט ה- MYSQL) אחד מהם הוא ה-ID שהתווסף בעקבות פעולת ה- INSERT האחרונה. עכשיו בואו נניח שיש שני משתמשים, ששולחים בדיוק באותו הרגע (מאית השניה) את הנתונים של כל אחד מהם, כל אחד מהם יקבל בלוק בזיכרון שבו מאוכסנת תשובת ה- MYSQL. בתוך הבלוק הזה תהיה התייחסות לפעולת ה- INSERT שהרגע בוצעה ומה ה- ID שלה. אז אם אפילו 20 איש שולחים את הפעולות שלהם כל אחד יקבל את ה-ID שהיא התוצאה של השורה שהוא הכניס בפעולת ה- INSERT. חוץ מזה, כנראה פיספסתם קצת את העיניין של נעילת טבלאות בMYSQL, כאשר יש פעולת INSERT, יש נעילה של הטבלה עד סיום הפעולה אז אפילו אם מגיעות שתי בקשות, בהפרשים אפסיים, הפעולה הראשונה היא זו שתנעל את הטבלה, וכשהיא תסתיים הפעולה השניה תתבצע גם היא. כדי לקבל את ה-ID של הפעולה האחרונה אפשר לבצע שאילתה פשוטה של MAX... מקווה שהברחתי קצת ערפילים. שנאור.
 

Megapuzik

New member
-

אז מה אמורה לעשות הפונקציה ????? לקבל את הID מהשאילתה, לא ? ואם יש נעילה של טבלאות, אז למה כמה אנשים קיבלו אותו ID ? "להציג את ה-ID שנוצר בעקבות פעולת ה- INSERT האחרונה שביצע משתמש" - זה בדיוק מה שהתכוונתי
 

shanor

New member
דיי פשוט

הפונקציה הזו אכן מקבלת את ה-ID של הפעולה האחרונה אבל, של הפעולה שהרגע ביצעת, ככה שאם אתה לא עורך שאילתה נוספת אתה מקבל את התוצאה של שאילתת ה- INSERT האחרונה שקיבלת. הפונקציה הזו לא עורכת שאילתה נוספת לתוך ה- MYSQL אלא מסתמכת על הפויינטר שאתה נותן לה RESULT$, והפויינטר הזה מצביע על הבלוק בזיכרון שמכיל את התשובה שאתה קיבלת בשאילתת ה- INSERT האחרונה שאתה ביצעת. ככה יוצא שאם יש הרבה משתמשים וכל אחד בזמנו שלו ביצע פעולת INSERT, כל אחד מהם רואה את ה- ID האחרון אבל לא בהכרח האחרון במציאות אלא האחרון שהיה כשהם ביצעו את ה- INSERT שלהם (משמע הם רואים את ה-ID של הפעולה שהם ביצעו). אין קשר לנעילת טבלאות במובן הזה. נעילת הטבלאות מתבצעת בדיוק בשביל למנוע מצב שבו שני משתמשים מבצעים INSERT בדיוק באותו הרגע והנתונים של שניהם יתערבבו ביחד - דבר זה לא קורה משום שהטבלאות ננעלות. עכשיו אחרי ההסבר הטכני בוא נלך להסבר על פני לוח זמנים: 1. משתמש א´ ומשתמש ב´ שולחים שאילתת INSERT. 2. שתי השאילתות מגיעות ל- MYSQL. 3. השאילתה הראשונה מבצעת פעולת INSERT, והטבלה ננעלת. השאילתה מקבלת הקצאה של BLOCK (בלוק) זיכרון על פי גודל תשובת ה- MYSQL ששם יאוכסנו הנתונים. בכללם גם משתנה אחד שנקרא INSERT_ID, שאומר בדיוק מה ה- ID שקיבלו הנתונים שהוכנסו. שים לב, הנתון הזה נמצא בבלוק התשובה של השאילתה של משתמש א´. 4. התשובה עוברת למשתמש א´, ובמקביל הטבלה נפתחת והשאילתה של משתמש ב´ נכנסת לפעולה. 5. אותו הדבר קורה כמו ב- 3, אלא שמשתמש ב´ מקבל הקצאה של בלוק זיכרון שונה וגם התשובה של INSERT_ID שונה בעקבות הID של פעולת ה-INSERT שמתשמש ב´ הרגע ביצע. 6. השאילתה של משתמש ב´ מסתיימת הקצאות הזיכרון הסתיימו והטבלה נפתחת. עכשיו התשובה שמשתמש א´ יקבל תהיה שונה מהתשובה שמשתמש ב´ יקבל משום שכל אחד בכמה אלפיות השניה שלקח לMYSQL לנעול, לכתוב, להקצות, ולפתוח את הטבלה, היתה פעולת ה- INSERT האחרונה. כאשר אתה שואל מהו ה- ID האחרון של פעולת ה- INSERT אצל משתמש א´ הוא יקבל את התשובה שלו ולא את התשובה של משתמש ב´ משום שהוא (כשהתבצעה הקצאת הזיכרון וכל הנתונים) עוד לא ידע על השאילתה של משתמש ב´. כמו שאמרתי קודם, אם אתה רוצה לדעת מהיא הרשומה האחרונה בתוך מאגר הנתונים שלך, תיצור שאילתה שתעשה בדיוק את זה ואל תסתמך לשם כך על INSERT_ID. בסביבה של מתשמש אחד היא אמנם תעבוד מצויין ותעשה בדיוק את מה שאתה מצפה שהיא תעשה אבל בסביבה רבת משתמשים אשר יעבדו בסמיכות זמנים מאוד גדולה (בהפרשים מאוד קטנים) היא תעשה בדיוק את מה שהיא צריכה לעשות ולא את מה שאתה רוצה שהיא תעשה. מקווה שפיזרתי קצת ערפילים. שנאור.
 

patael

New member
מה אני עושה במצב

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

shanor

New member
מה הבעיה בדיוק?

אני מניח שהמצב שלך הוא כזה: 1. בטבלת לוגאין יש שם ID, שם משתמש וסיסמא. 2. כאשר יש לך משתמש חדש אתה מבצע INSERT על השם שלו ומקבל את ה- ID שלו. 3. על פי הID שקיבלת אתה פותח לו ספריה. אם זה המצב אני לא רואה איפה הבעיה... משום שבפעם הבאה שהוא יכנס אתה כבר לא צריך לעשות שוב INSERT על טבלת הלוגאין שלך אלא רק SELECT או UPDATE... אני צריך הסבר יותר מפורט על הבעיה. שנאור.
 
למעלה