PDA

View Full Version : آخرین id درج شده زمانی که از stored procedure و pdo استفاده میکنیم (حل شد)



sarapepors
جمعه 13 تیر 1393, 12:19 عصر
سلام به همگی ،جهت درج رکورد از pdo و storedprocedure استفاده میکنم می خوام آخرین id درج شده رو داشته باشم از کد
$this->lastInsertId() استفاده میکنم و در پایان sp هم از کد select last_insert_id() استفاده میکنم اما مقدار بازگشتی برابر با صفر هست
میشه راهنمایی کنید کجا دارم اشتباه میکنم؟
مرسی

2undercover
جمعه 13 تیر 1393, 12:35 عصر
http://stackoverflow.com/questions/13151861/fetch-last-inserted-id-form-stored-procedure-in-mysql

مهرداد سیف زاده
جمعه 13 تیر 1393, 13:51 عصر
کار lstInsertId به این صورت هست که شما در همون کانکت به Mysql قرار دارید و query رو زدید حالا در همون کانکشن آخرین id که توسط شما درج شده رو بر میگردون. در واقع ابتدا باید کار درج انجام بشه و بعد به شما id رو که درج شده بر میگردونه.
و فکر کنم کار شما این هست که ابتدا آخرین id رو که قبلا درج شده بدست بیارید و بعد از این مقدار آخرین id‌درج شده در query جدید استفاده کنید و دستور insert رو بدید. برای این کار راهی ندارید جز یک دستور select زدن و گرفتن آخرین مقدار id

sarapepors
شنبه 14 تیر 1393, 08:06 صبح
سلام ، من قبلا این کار رو انجام دادم در واقع در کارهای قبلیم که از mysqli استفاده میکردم این مشکل رو حل کردم یک پارامتر از نوع out میفرستم به sp در پایان sp با دستو
ر set outparam=last_insert_id مقدار رو برمیگردونم و در برنامه با اجرای کوعری select outparam میخوندم و درست هم کار میکرد اما الان با pdo که دارم کار میکنم این حالت گویا جواب نمیده تو نت هم گشتم مثلا یکی از دوستان ی لینکی دادند از stackoverflow من خودم 3 یا 4 تا لینک پیدا کردم راه حلشم همونی بود که در پست اول گقتم اجرای pdo->lastinsertid که من موفق نشدم ، روشی هم که آقای مهرداد 66 میگن من فکر میکنم اگز دو کاربر همزمان یک رکورد رو درج کنن و من بیام آخری رو بگیرم اینا به نظرتون با هام قاطی نمیشه مثلا من جای کد این رکورد که تازه درج کردم برم کد یه رکورد دیگه که همزمان توسط یک کاربر دیگه اد شده
مرسی

2undercover
شنبه 14 تیر 1393, 08:21 صبح
راهی که توی اینترنت بود برای PDO، اجرای کوئری:
SELECT LAST_INSERT_ID()
بود و از لحاظ ایجاد همزمانی با کاربرای دیگه و مشکل به وجود اومدن، LAST_INSERT_ID متکی به ارتباط حاضر با پایگاه داده است و هر کاربر ارتباط جداگانه ای با پایگاه داده برقرار می کنه که در نتیجه از این لحاظ مطمئن هست.

مهرداد سیف زاده
شنبه 14 تیر 1393, 09:13 صبح
همونطور که گفتم و دوستمون 2undercover هم تایید کردن
شما در همون کانکشن آخرین id که درج شده رو میگیرید
البته دقیق هدفتون رو متوجه نشدم. شما میخواید دستور insert رو بدید و آخرین id که بعد از این insert درج شده را بگیرید یا قبل از دستور insert آخرین id رو بگیرید؟

sarapepors
شنبه 14 تیر 1393, 09:15 صبح
راهی که توی اینترنت بود برای PDO، اجرای کوئری:
SELECT LAST_INSERT_ID()
بود و از لحاظ ایجاد همزمانی با کاربرای دیگه و مشکل به وجود اومدن، LAST_INSERT_ID متکی به ارتباط حاضر با پایگاه داده است و هر کاربر ارتباط جداگانه ای با پایگاه داده برقرار می کنه که در نتیجه از این لحاظ مطمئن هست.

مرسی ،بله منم به این خاطر که این روش مشکل همزمانی نداره میخوام ازش استفاده کنم، یعنی این کوعری رو بعد اجرای insert query اجرا کنم داخلا بلاک پروسیجر یا در خود برنامه و بعد اجزای پروسیجر ؟
مرسی

sarapepors
شنبه 14 تیر 1393, 09:17 صبح
همونطور که گفتم و دوستمون 2undercover هم تایید کردن
شما در همون کانکشن آخرین id که درج شده رو میگیرید
البته دقیق هدفتون رو متوجه نشدم. شما میخواید دستور insert رو بدید و آخرین id که بعد از این insert درج شده را بگیرید یا قبل از دستور insert آخرین id رو بگیرید؟

بعد از جرای دستور میخوام id رو بگیرم یعنی همین رکورد جاری که درج شد من به id ش نیاز دارم

مهرداد سیف زاده
شنبه 14 تیر 1393, 09:42 صبح
شما در همون پروسیجر و بعد از دستور insert میتونید last_insert_id رو بگیرید
برای این کار در تعریف پروسیجر یک پارامتر خروجی تعریف کنید و مقدار last_insert_id رو در اون بریزید

SET out_param = LAST_INSERT_ID();

sarapepors
دوشنبه 16 تیر 1393, 08:37 صبح
مرسی از راهنمایی تون دوستان ، مشکل حل شده در واقع هیچ فرقی با راه حلی قبلا استفاده میکردم نداشت من یک پارامت ربه صورت out پروسیجر فرستادم با دستور set last =last_insert_id()
مقدار دهیش کردم در پیان sp ، در خود برنامه هم کوئری select @last رو اجرا کردم و بعد هم fetchAll کردم پارامتر out رو هم در برنامه با last@ مقدار دهی کرده بودم در واقع کد مربوط به آخرین id در خود sp نوشته شد