PDA

View Full Version : سوال: حذف ركورد بعد از تائيد ثبت ركورد ديگر



numberone1
یک شنبه 23 بهمن 1390, 21:18 عصر
سلام
من توي اسكريپتم نياز دارم كه بعد تائيد ثبت شدن مقدار قبلي در ديتابيس اون مقدار از يك تيبل ديگه حذف كنم
چطور مشه از عمليات حذف مطمئن شد؟

MMSHFE
یک شنبه 23 بهمن 1390, 21:24 عصر
بعد از اجرای کوئری ثبت، با استفاده از mysql_affected_rows ببینید تعداد رکوردهای تغییریافته برابر با 1 هست یا نه و اگه بود یعنی ثبت انجام شده و اونوقت کوئری حذف رو اجرا کنید. مثال:


mysql_query('INSERT INTO `users` (`username`,`password`) VALUES (\'ali\',\'1234\')');
if(mysql_affected_rows() == 1) {
mysql_query('DELETE FROM `tmp_users` WHERE (`username`=\'ali\')');
}

موفق باشید.

numberone1
یک شنبه 23 بهمن 1390, 22:14 عصر
ممنون آقاي شهركي گرامي

براي كوئري آپديت هم ميشه از همين روش استفاده كرد؟

امیـرحسین
یک شنبه 23 بهمن 1390, 23:28 عصر
از Transaction یا MultiQuery هم میتونید استفاده کنید که سریعتره.
برای Transaction حتما باید Engineای که استفاده میکنید ساپورت کنه مثل InnoDB (با MyISM نمیشه). این سریعتر نیست ولی راه حله (محض ایده گرفتن):

mysql_query("START TRANSACTION;");
$result = mysql_query("INSERT INTO tbl SET ........;");
if($result === false){
mysql_query("ROLLBACK;");
} else {
$result = mysql_query("DELETE FROM ........;");
if($result === false)
mysql_query("ROLLBACK;");
else
mysql_query("COMMIT;");
}
با PDO سریعتر و تمیزتر:

$pdo = new PDD(.......);

$pdo->beginTransaction();
$result = $pdo->exec("INSERT INTO tbl SET ........;");
if($result === false){
$pdo->rollback();
} else {
$result = $pdo->exec("DELETE FROM ........;");
if($result === false)
$pdo->rollback();
else
$pdo->commit();
}

اما اگر InnoDB نمیتونید داشته باشید توسط MultiQuery هم میشه. MultiQuery رو با PDO و MySQLiمیتونید اجرا کنید. به این شکل که چند تا کوئری اجرا رو پشت سر هم اجرا میکنید و توسط توابع MySQL از کوئریهای قبلی مطلع میشید:

$pdo = new PDD(.......);

$result = $pdo->query("
INSERT INTO tbl SET ........;
DELETE FROM ....... WHERE ..... AND LAST_INSERT_ID()>0;
SELECT LAST_INSERT_ID() AS id;
");
if($result !== false){
$res = null;
while($result->nextRowset()){
$res = $result;
}
echo 'Last ID: '.$res->fetchColumn();
$result = $res = null;
} else {
echo 'Error';
}
و فکر کنم توسط متغیرهای MySQL سریعتر هم میشه:

$result = $pdo->query("
INSERT INTO tbl SET ........;
SET @lastId = LAST_INSERT_ID();
DELETE FROM ....... WHERE ..... AND @lastId!=FALSE;
SELECT @lastId AS id;
");
البته برای اینکار پشتیبانی از MultiQuery لازم لازم هم نیست یعنی میتونید به ازای هر کوئری یکبار mysql_query اجرا کنید که شبیه روش اوله و جالب نیست ولی MultiQuery هم سریعتره و هم ضمانت میکنه که حتما مثلا تابع LAST_INSERT_ID مقدار کوئری قبلی رو بده نه یه کوئری موازی با این عملیات!

numberone1
چهارشنبه 26 بهمن 1390, 18:52 عصر
جالا اگر مقدار بازگشتي اين تابع نا معلوم بود بايد چيكار كنم؟
mysql_affected_rows() == 1
ميخوام از يك تيبلي تعداد نامعلومي از ركورد ها رو با شرط حذف كنم چطور ميتونم از پاك شدنشون اطمينان حاصل كنم؟

MMSHFE
چهارشنبه 26 بهمن 1390, 19:02 عصر
میتونید با یک کد زیر، قبل از اجرای دستور UPDATE تعداد رو بدست بیارین:

$count = mysql_result(mysql_query("SELECT COUNT(*) AS `count` FROM `table` WHERE (CONDITIONS)"), 0, 0);
و به جای CONDITIONS همون شرایطی رو بگذارین که برای دستور UPDATE و... میگذارین. بعد count$ رو با mysql_affected_rows مقایسه کنید و اگه برابر بود یعنی همه رکوردهای شامل شرایط CONDITIONS آپدیت شدن.
موفق باشید.