PDA

View Full Version : سوال: همزمانی 2 query !! گیج شدم!!



memoli
جمعه 25 اردیبهشت 1388, 21:26 عصر
1جدول اعضا دارم وقتی می خام عضوی بهش اضافه کنم اول select میکنم که کسی دیگه اون id را نداشته باشه اگه query select چیزی برنگردوند عضو جدید را insert میکنم!
حالا اگه همزمان دو نفر بخواهند با یک id یکسان عضو شوند چی میشه؟(تراکنش می خایم؟؟)

یه سوال دیگه ؟!
شرط انجام insert اینه که وقتی از جدول اعضا select کردم که آیا چنین id وجود دارد ، Query مربوط به این select چیزی برنگردونه یعنی مثلا اگه mysql_num_rows($result ) == 0 بود insert کن.


$query= "select id from member where id='$nam'";
$result=mysql_query($query,$db);
$num=mysql_num_rows($result);

if($num==0)
{
echo "<br>"."insert enable."<br>";
//$query2 = insert .....
$result2=mysql_query($query2,$db);
if( !$result2)echo "not insert."<br>";
}
else
{
echo "<br>"."id is not unique";
// echo $num;
}


حالا مشکل این جاس که اگه id تکراری نباشه پس از انجام insert از بلوک if ، بلوک else را هم اجرا می کنه و در واقع فقط پیام های بلوک else را چاپ می کند و دلیلش هم اینه که چک کردم مقدار $num را 1 کرده!!!

گیج شدم! یعنی ابتدا شرط برقرا شده insert کرده سپس شرط یعنی همان مقدار $num (با اضافه شدن رکورد به جدول) فرق کرده شده 1 و در نتیجه بلوک else اجرا شده؟!!!!!!!!!!!!!

امیـرحسین
جمعه 25 اردیبهشت 1388, 22:38 عصر
حالا اگه همزمان دو نفر بخواهند با یک id یکسان عضو شوند چی میشه؟(تراکنش می خایم؟؟)
توی کامپیوتر هیچ دو عملی همزمان اتفاق نمی افتند. یعنی تداخلی وجود نداره! ولی این موضوع به واحد زمانی محیط اجرا هم بستگی داره. این اتفاق خیلی خیلی خیلی .... نادره!
روش مرسومش اینه که همه درخواستها رو بگیرید مثلا هر کی درخواست ساخت اکانت میده، اطلاعاتش توی یک فایل لیست شه و بعد، تعداد درخواستهای موجود توی فایل دونه دونه INSERT بشه یعنی اگر دو کاربر همزمان درخواست بدن، PHP نوبتی اجرا می کنه و دو درخواست در فایل ذخیره می کنه.
روش استانداردتری هم هست، اکستنژن های mysqli و PDO و ... این کار رو (با روش مشابه) بصورت خودکار انجام میدن!


مشکل دوم یکم عجیبه! این رو تست کنید:

$query= "select id from member where id='$nam'";
$result=mysql_query($query,$db);
$num=mysql_num_rows($result);

if($num==0)
{
echo "<br>insert enable.<br>";
//$query2 = insert .....
$result2 = mysql_query($query2,$db);
echo ( (! $result2) ? "not insert." : "Inserted." ) . "<br />";
}
else
{
echo "<br>"."id is not unique";
// echo $num;
}


درضمن توابع escape رو که فراموش نمی کنید؟!

memoli
شنبه 26 اردیبهشت 1388, 01:50 صبح
اول تشکر از نظرتون!

نه!جواب نداد! حالا یه چیز جالب اینک اگه
$result2 = mysql_query($query2,$db);
را از بلوک if حذف کنم ! همه چیز درست میشه یعنی منطقی میشه! یعنی وقتی هیچ id را پیدا نکنه $num (تعداد رکورد بازیابی شده ) هم صفر شده و پیغام های مربوط به بلوک if را چاپ می کنه! و هنگامی که id تکراری باشه $num (تعداد رکورد بازیابی شده ) هم مخالف 0 شده و پیغام های مربوط به بلوک else را چاپ می کنه!
وقتی کد بالا را حذف نکنیم به هیج وجه در هیچ حالتی پیغام های مربوط به بلوک if را چاپ نمی کنه! در حالی که داده ها را به جدول اضافه میکنه!!(یعنی دستور insert اجرا میشه ولی سایر دستورات آن بلوک نه!! )

برا همینه که دارم گیج می زنم!(شاید یه اشکال کوچولو باشه ولی نمی دونم)

منظورتون از توابع escape چی بود؟

مشکل اولو با بحث تراکنش ها نمیشه حل کرد؟!


mysql_query("begin",$db);
// query ha!
mysql_query("comit",$db);or mysql_query("rollback",$db);

__ziXet__
شنبه 26 اردیبهشت 1388, 08:49 صبح
1جدول اعضا دارم وقتی می خام عضوی بهش اضافه کنم اول select میکنم که کسی دیگه اون id را نداشته باشه اگه query select چیزی برنگردوند عضو جدید را insert میکنم!
حالا اگه همزمان دو نفر بخواهند با یک id یکسان عضو شوند چی میشه؟(تراکنش می خایم؟؟)

یه سوال دیگه ؟!
شرط انجام insert اینه که وقتی از جدول اعضا select کردم که آیا چنین id وجود دارد ، Query مربوط به این select چیزی برنگردونه یعنی مثلا اگه mysql_num_rows($result ) == 0 بود insert کن.


$query= "select id from member where id='$nam'";
$result=mysql_query($query,$db);
$num=mysql_num_rows($result);

if($num==0)
{
echo "<br>"."insert enable."<br>";
//$query2 = insert .....
$result2=mysql_query($query2,$db);
if( !$result2)echo "not insert."<br>";
}
else
{
echo "<br>"."id is not unique";
// echo $num;
}


حالا مشکل این جاس که اگه id تکراری نباشه پس از انجام insert از بلوک if ، بلوک else را هم اجرا می کنه و در واقع فقط پیام های بلوک else را چاپ می کند و دلیلش هم اینه که چک کردم مقدار $num را 1 کرده!!!

گیج شدم! یعنی ابتدا شرط برقرا شده insert کرده سپس شرط یعنی همان مقدار $num (با اضافه شدن رکورد به جدول) فرق کرده شده 1 و در نتیجه بلوک else اجرا شده؟!!!!!!!!!!!!!
شما مگه فیلد id رو auto_increment تعریف نکردی؟
اگه این کارو کرده باشی مطمئن باش هیچ مشکلی پیش نمیاد

zoghal
شنبه 26 اردیبهشت 1388, 09:34 صبح
تو مای اسکیوال زمانی که از موتور myisam استفاده میکنید، این موتور از تراکنشن ها را ساپورت نمی کند

memoli
شنبه 26 اردیبهشت 1388, 16:23 عصر
اول تشکر!


شما مگه فیلد id رو auto_increment تعریف نکردی؟

منظورم همان نام کاربری بود که کاربر خودش وارد کرده و البته باید یکتا باشه!


تو مای اسکیوال زمانی که از موتور myisam استفاده میکنید، این موتور از تراکنشن ها را ساپورت نمی کند

تو تعریف جداول از innodb استفاده کردم حالا یعنی نیازی به دستورات ترانزکشن نیس؟!!!!!!


مشکل همچنان باقی است!
کمک!

memoli
شنبه 26 اردیبهشت 1388, 16:27 عصر
میدونم میشه کلا از یه insert استفاده کرد و چون id کلید است اجازه ورود تکراری نمی ده ولی چرا این کد که ظاهرا منطقش سادس جواب نمی ده! نکنه باید ترانزکشن استفاده کرد یا منطق مشکل داره!

narsic
یک شنبه 27 اردیبهشت 1388, 15:49 عصر
با سلام
دوست عزیز امکان بروز تداخل در دو درخواست بسیار کم هستش چون مدت زمان اجرای کد و انجام دستورات بسیار کوتاه هستش و امکان ارسال هم زمان دو در خواست با شرایط همسان بسیار نادر هستش تنها در صورتی که سایت شما بر روی میلی ثانیه درخواست داشته باشه که باز هم در این شرایط امکان همسانی اطلاعات چند درخواست با هم هم بسیار کم است .
و برای مشکل کدتون من کد بالا رو تست کردم دستورات بلوک شرطتون به درستی انجام میشود اگه باز هم مشکلتون حل نشده کد صفحه رو کامل قرار بدید (اینجا کسی قصد سودجویی از کد دیگران رو نداره ) .

درضمن توابع escape رو که فراموش نمی کنید؟!
این توابع مشکل امنیتی دارند .
موفق باشید

memoli
سه شنبه 29 اردیبهشت 1388, 00:31 صبح
رای مشکل کدتون من کد بالا رو تست کردم دستورات بلوک شرطتون به درستی انجام میشود اگه باز هم مشکلتون حل نشده کد صفحه رو کامل قرار بدید (اینجا کسی قصد سودجویی از کد دیگران رو نداره ) .

سلام دوست عزیز
اول تشکر
من یه تاپیک دیگه زدم و کل برنامه را گذاشتم توش . چون احساس کردم تو این تاپیک یه کمی کلی گویی کردم وچند مشکل را با هم مطرح کردم یه کم گیج کننده شده !!

کمک کمک! insert میکنه ولی میگه نکردم!!

memoli
سه شنبه 29 اردیبهشت 1388, 00:42 صبح
کمک کمک! insert میکنه ولی میگه نکردم!! (http://barnamenevis.org/forum/showthread.php?t=159975) ‏

memoli
سه شنبه 29 اردیبهشت 1388, 00:45 صبح
دوست عزیز امکان بروز تداخل در دو درخواست بسیار کم هستش چون مدت زمان اجرای کد و انجام دستورات بسیار کوتاه هستش و امکان ارسال هم زمان دو در خواست با شرایط همسان بسیار نادر هستش تنها در صورتی که سایت شما بر روی میلی ثانیه درخواست داشته باشه که باز هم در این شرایط امکان همسانی اطلاعات چند درخواست با هم هم بسیار کم است .حالا شاید این بحث بیشتر مربوط به mysql باشه! ولی احساس میشه که زیاد از مفاهیمی مثه ترانزکشن استفاده نمیشه!!(رااستی mysql تریگر و اینا را ساپورت میکنه؟ ____ ببخشید یه کم دور از موضوع شدیم!)

zoghal
سه شنبه 29 اردیبهشت 1388, 11:25 صبح
اگر میخواهید چند دستور اسکیوال رو با هم اجرا کنید، می تونید از اکستنش mysqli استفاده کنید