PDA

View Full Version : تعیین last insert id در این کد که برای insert استفاده میکنم ؟! (حل شد)



sarapepors
یک شنبه 23 تیر 1392, 11:56 صبح
سلام من سعی کردم کدی بنویسم که به صورت داینامیک اعمال insert,delete,update رو باهاش انجام بدم قضد دارم که آخرین id درج شده وقتی از کوئری insert استفاده میکنم رو بفهمم که تا حالا موفق نشدم اگر میشه کمک کنید


try{
$this->connector(1);
if (mysqli_prepare($this->conn,$sql)){
$stmt=mysqli_prepare($this->conn,$sql);
if ($type&&$param){
$bind_names[]=$type;
for($i=0;$i<count($param);$i++){
$bind_name='bind'.$i;
$$bind_name=$param[$i];
$bind_names[]=&$$bind_name;}
call_user_func_array(array($stmt,'bind_param'),$bi nd_names);}
mysqli_stmt_execute($stmt);
if (mysqli_stmt_affected_rows($stmt) == 1){
echo mysqli_stmt_insert_id($stmt);
}
$this->connector(0);


}
}
catch(Exception $e){
$this->errorMessage[]= $e->getMessage()."<br>";
}

خط آخر در بلاک try رو برای اینکار استفاده کردم اما صفر برگردونده

sarapepors
یک شنبه 23 تیر 1392, 21:49 عصر
خیلی به پاسخ این پرسش نیازدارم دوستان کسی نمیتونه کمک کنه آیا؟!

کامروا
یک شنبه 23 تیر 1392, 22:12 عصر
فیلد Id از نوع AUTO_INCREMENT هست؟

AliRezaPro
یک شنبه 23 تیر 1392, 23:30 عصر
از دستورات SQL برای کارتون استفاده کنید . تابع MAX در SQL بزرگترین مقدار یک ستون رو بر میگردونه . البته روش زیاده
تو کتاب آقای شهرکی اینجوری بود :

$result=mysql_query('SELECT * FROM `articles` ORDER BY `id` DESC LIMIT 1');
if(mysql_num_rows($result)>0)
{
$id=mysql_result($result,0,0);
}
درواقع بصورت ORDER BY `id` DESC LIMIT 1 بصورت برعکس آخرین رکورد رو گرفتن و با تابع result به او دسترسی پیدا کردن . که 100 البته تابع MAX خیلی ساده تر و قابل فهم تر و منطقی تر است

کامروا
دوشنبه 24 تیر 1392, 00:32 صبح
به احتمال زیاد فیلدی که شما میخوای آخرین مقدار INSERT شده رو بیرون بکشید، دارای خصوصیت AUTO_INCREMENT نیست.

زمانی که فیلد شما دارای خصویت AI نیست، دیگه توابعی مثل LAST_INSERT_ID و ... کاربرد نداره، چرا که این توابع مقدار آخرین فیلدی که خاصیت AI رو داشته باشه برمیگردونند، در غیر اینصورت مقدار 0 رو برمیگردونند.
یکی از روش ها رو دوستمون گفت، راه بعدی استفاده از یک فیلد از نوع TimeStamp هست که باید زمان INSERT شدن رکورد رو توی خودش نگه داره، و شما به راحتی میتونید با یک SELECT ساده آخرین رکورد درج شده رو بیرون بکشید.

موفق باشید

sarapepors
دوشنبه 24 تیر 1392, 08:57 صبح
به احتمال زیاد فیلدی که شما میخوای آخرین مقدار INSERT شده رو بیرون بکشید، دارای خصوصیت AUTO_INCREMENT نیست.

زمانی که فیلد شما دارای خصویت AI نیست، دیگه توابعی مثل LAST_INSERT_ID و ... کاربرد نداره، چرا که این توابع مقدار آخرین فیلدی که خاصیت AI رو داشته باشه برمیگردونند، در غیر اینصورت مقدار 0 رو برمیگردونند.
یکی از روش ها رو دوستمون گفت، راه بعدی استفاده از یک فیلد از نوع TimeStamp هست که باید زمان INSERT شدن رکورد رو توی خودش نگه داره، و شما به راحتی میتونید با یک SELECT ساده آخرین رکورد درج شده رو بیرون بکشید.

موفق باشید
با سلام و تشکر
فیلدها AUTO INCRIMENT هستند من فکر کردم برای این که از این روش استفاده میکنم شاید کد رو اشتباه نوشتم آخه کدهای مختلفی برای این کار دیدم که استفاده میشه
میشه راجب فیلد timestamp توضیح بیشتری بدید و کوئری رو بی زحمت بنویسید ؟

sarapepors
دوشنبه 24 تیر 1392, 09:02 صبح
از دستورات SQL برای کارتون استفاده کنید . تابع MAX در SQL بزرگترین مقدار یک ستون رو بر میگردونه . البته روش زیاده
تو کتاب آقای شهرکی اینجوری بود :

$result=mysql_query('SELECT * FROM `articles` ORDER BY `id` DESC LIMIT 1');
if(mysql_num_rows($result)>0)
{
$id=mysql_result($result,0,0);
}
درواقع بصورت ORDER BY `id` DESC LIMIT 1 بصورت برعکس آخرین رکورد رو گرفتن و با تابع result به او دسترسی پیدا کردن . که 100 البته تابع MAX خیلی ساده تر و قابل فهم تر و منطقی تر است
مرسی از کمکتون این مسئله به ذهنم رسید در واقع فبلا من از همین روش استفاده میکردم اما من این کد رو برای قسمت درج آگهی در یک سایت تتلغاتی میخام که یکی از فیلدهای جدول آگهی کد پرداخت هست که کلید اصلی یک جدول دیگه س من میخوام وقتی یک رکورد در جدول پرداخت درج شده id اون رکورد رو در جدول آگهی همون لحظه درج کنم علت استفاده نکردنم از این روش max هم اینه که ممکنه همون لحظه یک مدیر یا کاربر دیگه ای هم در حال درج باشه و کد ماکسیمم id اشتباه خونده بشه البته نمیدونم نگرانیم درسته یا فقط یک حساسیت ریزه ؟!
مرسی

MMSHFE
دوشنبه 24 تیر 1392, 09:20 صبح
درهرحال بین اینکه با کوئری مثل کد زیر:
SELECT MAX(`id`) AS `max_id` FROM `table`
بیشترین ID رو بدست بیارین و اینکه با mysql_insert_id یا معادل اون در MySQLi و... آخرین ID درج شده رو در بیارین، تفاوت خاصی وجود نداره چون اگه همزمان یک نفر دیگه بیاد و رکوردی درج کنه، هر دو، ID آخرین رکورد درج شده رو برمیگردونن و راه حل منطقی و صحیح این کار، استفاده از Transaction یا قفل کردن Table تا زمانی هست که ID رو بدست بیارین و بعد از اون، جدول رو آزاد کنید. توی این فاصله هم Queryهایی که میان، توی صف قرار میگیرن.

sarapepors
دوشنبه 24 تیر 1392, 10:06 صبح
درهرحال بین اینکه با کوئری مثل کد زیر:
SELECT MAX(`id`) AS `max_id` FROM `table`
بیشترین ID رو بدست بیارین و اینکه با mysql_insert_id یا معادل اون در MySQLi و... آخرین ID درج شده رو در بیارین، تفاوت خاصی وجود نداره چون اگه همزمان یک نفر دیگه بیاد و رکوردی درج کنه، هر دو، ID آخرین رکورد درج شده رو برمیگردونن و راه حل منطقی و صحیح این کار، استفاده از Transaction یا قفل کردن Table تا زمانی هست که ID رو بدست بیارین و بعد از اون، جدول رو آزاد کنید. توی این فاصله هم Queryهایی که میان، توی صف قرار میگیرن.
مرسی سعی میکنم همینکارو انجام بدم(:

lord_viper
دوشنبه 24 تیر 1392, 10:08 صبح
میتونین تابعتون رو طوری تعریف کنین که اگه کوئری insert بود از تابع زیر برای گرفتن اخرین ایدی استفاده کنید
تابع mysql_insert_id() اخرین id که insertشده توسط کانکشن یک کاربر را برمیگردونه در این حالت دیگه تداخلی در گرفتن اخرین ایدی پیش نمیاد


mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();

sarapepors
دوشنبه 24 تیر 1392, 10:44 صبح
میتونین تابعتون رو طوری تعریف کنین که اگه کوئری insert بود از تابع زیر برای گرفتن اخرین ایدی استفاده کنید
تابع mysql_insert_id() اخرین id که insertشده توسط کانکشن یک کاربر را برمیگردونه در این حالت دیگه تداخلی در گرفتن اخرین ایدی پیش نمیاد


mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();
دوست عزیز منم آخه همین کار رو میخوام انجام بدم کمی در php تازه کارم من از mysqli استفاده کردم در پست شمار 1 هم کدم رو نوشتم منتها علی رغم اتو اینکریمنت بودن فیلدها مقدار صفر برگردانده میشود!

کامروا
دوشنبه 24 تیر 1392, 12:16 عصر
شما میگین فیلد ID دارای خصوصیت AI هست! خب این یکم عجیبه!!:متفکر:
بنظر من شما دستورات Create همین جدول رو قرار بدید تا ببینیم مشکلش چیه و چرا جواب نمیده.

sarapepors
دوشنبه 24 تیر 1392, 12:29 عصر
CREATE TABLE IF NOT EXISTS `tbl_advertisement` (
`advertisement_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`cat_id` int(10) unsigned NOT NULL,
`title` varchar(200) COLLATE utf8_persian_ci NOT NULL,
`description` text COLLATE utf8_persian_ci NOT NULL,
`tell` varchar(50) CHARACTER SET latin1 NOT NULL,
`confirmation_status` tinyint(1) NOT NULL,
`advertisement_service` int(11) NOT NULL,
`website` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
`advertisement_image` varchar(200) CHARACTER SET latin1 NOT NULL,
`lastupdate_date` varchar(10) COLLATE utf8_persian_ci NOT NULL,
`expire_date` varchar(10) COLLATE utf8_persian_ci NOT NULL,
`insert_date` varchar(10) COLLATE utf8_persian_ci NOT NULL,
`address` varchar(200) COLLATE utf8_persian_ci NOT NULL,
`city` int(11) NOT NULL,
`keywords` varchar(200) COLLATE utf8_persian_ci NOT NULL,
`payment_id` bigint(20) NOT NULL,
`show_contact_page` tinyint(1) NOT NULL,
`user_id` bigint(20) NOT NULL,
`admin_id` int(10) unsigned NOT NULL,
`number_visit` int(11) NOT NULL,
PRIMARY KEY (`advertisement_id`),
KEY `cat_code` (`cat_id`,`advertisement_service`,`city`,`payment_ id`,`user_id`),
KEY `city` (`city`),
KEY `user_id` (`user_id`),
KEY `admin_id` (`admin_id`),
KEY `advertisement_service` (`advertisement_service`),
KEY `payment_id` (`payment_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=69 ;


اینم از کوئری create جدول ،ممکنه بخاطر کد و نحوه هینسرت کردنم یا استفاده از mysqli باشه؟

کامروا
دوشنبه 24 تیر 1392, 13:39 عصر
جدول شما درسته و مشکلی نداره.

ببینید من توی خود MySQL یک رکورد رو Insert‌ کردم :
مثلا :
INSERT INTO tbl_advertisement(cat_id,title) VALUES (10,'myTitle1')

و بعدش با تابع زیر آخرین مقدار ‍‍‍`advertisement_id` رو بدست میارم.
به این شکل :

SELECT LAST_INSERT_ID();

توی PHP هم امتحان کردم به این شکل :

<?php
$mysqli = new mysqli("localhost", "root", "123456", "test");

if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "INSERT INTO tbl_advertisement(cat_id,title) VALUES (11,'myTitle2')";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

$mysqli->close();
?>

کاملا جواب میده و مشکلی نداره.

sarapepors
دوشنبه 24 تیر 1392, 15:01 عصر
درهرحال بین اینکه با کوئری مثل کد زیر:
SELECT MAX(`id`) AS `max_id` FROM `table`
بیشترین ID رو بدست بیارین و اینکه با mysql_insert_id یا معادل اون در MySQLi و... آخرین ID درج شده رو در بیارین، تفاوت خاصی وجود نداره چون اگه همزمان یک نفر دیگه بیاد و رکوردی درج کنه، هر دو، ID آخرین رکورد درج شده رو برمیگردونن و راه حل منطقی و صحیح این کار، استفاده از Transaction یا قفل کردن Table تا زمانی هست که ID رو بدست بیارین و بعد از اون، جدول رو آزاد کنید. توی این فاصله هم Queryهایی که میان، توی صف قرار میگیرن.
میشه راجب استفاده از transaaction بیشتر راهنماییی کنید ؟

sarapepors
سه شنبه 25 تیر 1392, 13:41 عصر
به این خاطر کدم صفر برمیگردونه که از stored procedure استفاده کردم فکر کنم البته

sarapepors
پنج شنبه 27 تیر 1392, 10:39 صبح
با تشکر از همه دوستان بنده این مشکل رو حال کردم


CREATE PROCEDURE `insertuser`(full_name VARCHAR(50),user_name VARCHAR(50),pass_word VARCHAR(50),tell VARCHAR(50),e_mail VARCHAR(50)
,lastlogin_date VARCHAR(10),confirmationStatus TINYINT,OUT last INT)
BEGIN
INSERT INTO tbl_user(fullname,username,password,user_tell,emai l,last_login_date,confirmation_status) VALUES (full_name ,user_name ,pass_word ,tell,e_mail,lastlogin_date,confirmationStatus );

SET last= LAST_INSERT_ID();
END

این از storedprocedure
در برنامه هم مقدار گارامتر out که به sp فرستادم رو با این کد خوندم


$result=mysqli_query($this->conn,"select @id");
$last=mysqli_fetch_row($result);
return $last[0];

این پستم برا اون دسته از عزیزانی که شاید روزی با این مشکل مواجه بشن گذاشتم
(: مرسی از همگی