PDA

View Full Version : سوال: اولویت بندی mysql_query



mohammadkiani
شنبه 19 بهمن 1392, 15:24 عصر
سلام دوستان
من در کد خود دو شرط دارم که در هر شرط یک mysql_query انجام می شود. اما ترتیب انها مهم است.


if(true)
{
mysql_query(); // Delete content in field in DB
}

if(true)
{
mysql_query(); // Update content in field in DB
}


حالا اول باید delete انجام بشه بعد update. اما این اتفاق نمی افته. مشکل چیست؟

beh3000
شنبه 19 بهمن 1392, 16:30 عصر
سلام دوست من



mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");

if(true)
$a1 = mysql_query(); // Delete content in field in DB

if(true)
$a2 = mysql_query(); // Update content in field in DB

if ($a1 and $a2) {
mysql_query("COMMIT");
} else {
mysql_query("ROLLBACK");
}

mohammadkiani
یک شنبه 20 بهمن 1392, 13:59 عصر
سلام دوست من



mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");

if(true)
$a1 = mysql_query(); // Delete content in field in DB

if(true)
$a2 = mysql_query(); // Update content in field in DB

if ($a1 and $a2) {
mysql_query("COMMIT");
} else {
mysql_query("ROLLBACK");
}


ممنون دوست عزیز
اگر ممکن هست خط شماره 1-2-11-13 را توضیح دهید.
تشکر

beh3000
یک شنبه 20 بهمن 1392, 15:53 عصر
اول بگو کار کرد یا نه ؟

کلا توضیحش اینه که transaction قابلیتی است که در بانک اطلاعاتی وجود داره برای اینکه یا یه کاری کلا انجام بشه یا اینکه کلا انجام نشه هیچوقت نصف کاره انجام نمیشه

تو این مثال اگه هر دو کوئری درست اجرا بشن دستور Commit به دیتابیس میفهمونه که همه چی درسته و تمام , ولی اگه یکی از اونها خطایی بده دستور Rollback صادر میشه و اون دستوراتی که اجرا شده هم به حالت قبل از اجرا برمیگرده یعنی نادیده گرفته میشه

اگه delete اجرا بشه و update خطا بده Delete هم به حالت اول برمیگرده مثل اینه که اصلا اجرا نشده . ( یا هر دو یا هیچ )

mohammadkiani
یک شنبه 20 بهمن 1392, 16:00 عصر
اول بگو کار کرد یا نه ؟

کلا توضیحش اینه که transaction قابلیتی است که در بانک اطلاعاتی وجود داره برای اینکه یا یه کاری کلا انجام بشه یا اینکه کلا انجام نشه هیچوقت نصف کاره انجام نمیشه

تو این مثال اگه هر دو کوئری درست اجرا بشن دستور Commit به دیتابیس میفهمونه که همه چی درسته و تمام , ولی اگه یکی از اونها خطایی بده دستور Rollback صادر میشه و اون دستوراتی که اجرا شده هم به حالت قبل از اجرا برمیگرده یعنی نادیده گرفته میشه

اگه delete اجرا بشه و update خطا بده Delete هم به حالت اول برمیگرده مثل اینه که اصلا اجرا نشده . ( یا هر دو یا هیچ )

تست کردم. جواب نداد.

این نکته رو هم بگم که تو هر دو کوئری یک فیلد مقداری ازش delete میشه یا update میشه.

beh3000
یک شنبه 20 بهمن 1392, 16:42 عصر
تست کردم. جواب نداد.

این نکته رو هم بگم که تو هر دو کوئری یک فیلد مقداری ازش delete میشه یا update میشه.

شما قبلا داشتین میگفتین ترتیب مهمه و اول باید delete بشه و بعد Update حالا دارین میگین یا delete یا update !!!! سوالتون رو از اول واضح مطرح کنید

خود کدتون رو هم بزارین و روش توضیح بدین

mohammadkiani
دوشنبه 21 بهمن 1392, 08:39 صبح
شما قبلا داشتین میگفتین ترتیب مهمه و اول باید delete بشه و بعد Update حالا دارین میگین یا delete یا update !!!! سوالتون رو از اول واضح مطرح کنید

خود کدتون رو هم بزارین و روش توضیح بدین

هنوز هم میگم؛ ترتیب مهم است. ابتدا delete و بعد update.
منظورم از پست قبلی این بود که عملیات delete و update هر دو روی یک فیلد انجام می شود.
وقتی هر دو شرط برقرار باشد فقط update انجام می شود و از delete که عملیات اول است عبور می کند. اما اگر یکی از شرط ها برقرار باشد چه عملیات delete چه عملیات update به درستی کار می کند.
کد من:


if($t1==true)
{
$card="Ok";
mysql_query("UPDATE certificate SET card='$card' WHERE u_id=" . $_POST['code'], $myconn);
}

if($t2==true)
{
$card="No";
mysql_query("UPDATE certificate SET card='$card' WHERE u_id=" . $_POST['code'], $myconn);
}

حالا این اصل کد نیست. من خلاصه کردم.
ولی برای این که مطمئن باشید کد صحیح هست و فقط زمان mysql_query به مشکل بر می خورم مجدد عرض می کنم که وقتی یکی از شرط های صحیح باشد عملیات به درستی انجام می شود.
ممنون

sadegh1362
دوشنبه 21 بهمن 1392, 08:57 صبح
سلام
اینکه میگید انجام نمیشه منظورتن چیه اصلا کار نمی کنه یا ترتیب انجامش درست نیست؟

mohammadkiani
دوشنبه 21 بهمن 1392, 09:04 صبح
سلام
اینکه میگید انجام نمیشه منظورتن چیه اصلا کار نمی کنه یا ترتیب انجامش درست نیست؟
ترتیب انجامش درست نیست.

sadegh1362
دوشنبه 21 بهمن 1392, 10:06 صبح
شما می تونید از query اول یک خروجی بگیرید ببینید آیا نجام شده و اگر انجام شده بود بعدی رو فعال کنید به این صورت
if($t1==true)
{
$card="Ok";
$check=mysql_query("UPDATE certificate SET card='$card' WHERE u_id=" . $_POST['code'], $myconn);
}

if($check)
{
$card="No";
mysql_query("UPDATE certificate SET card='$card' WHERE u_id=" . $_POST['code'], $myconn);
}
اگر check مقدار داشت یعنی بالایی انجام شده و اگر نه دومی هم انجام نمیشه