PDA

View Full Version : حرفه ای: مشکل عجیب در mysql .. کارها به ترتیب انجام نمیشند !



generalhak
سه شنبه 27 خرداد 1393, 19:46 عصر
سلام
من توی یه تابع اومدم یه چیزی به دیتابیس با توابع mysql اینتسرت کردم و اون تابع رو در برنامه اصلی به کار بردم و بعد از اون میام میگردم که اگر چیزی مثل اون و یکی های قبلیش نبود جدیده رو وارد کنه ... بعد حالا وقتی برنامه اصلی رو اجرا میکنم 2 بار یه چیز رو وارد میکنه یعنی الان انگار برنامه صبر نمیکنه کامل اینسرت بشه که در دیتابیس این یه شرط اساسی هست یعنی کارهای اون به ترتیب باید باشه ولی نیست چون وقتی یه زمان کمی رو مثلا نیم ثانیه sleep میدم بعد میگردم حالا دیگه مشکل حل میشه !! ... !!! ..!! چرا اینطوریه ؟ .. چرا برنامه صبر نمیکه کامل وارد بشه و رد میشه !!؟

Veteran
سه شنبه 27 خرداد 1393, 20:18 عصر
کد رو قرار بدید

cpuram
سه شنبه 27 خرداد 1393, 20:19 عصر
وقتی توی کدت مشکل داری باید با کد حرف بزنی نه همشو فارسی بنویسی.
کدتو بزار لطفا.

generalhak
سه شنبه 27 خرداد 1393, 20:40 عصر
فکر نمیکردم مشکل از کد باشه .. حالا ببینید : کد زیر اون تابعی هست ارسال به دیتابیس داخلش هست ...


function db_insert($db_name,$names,$values,$debug=null)
{
$arrays = explode(',', $values) ;
$new_values = '';
foreach($arrays as $array)
{
$array = "'".$array."'";
$new_values .= ",$array";
}
$val = substr($new_values,1,strlen($new_values)-1);

if( mysql_query("INSERT INTO $db_name ($names) VALUES($val)") ) return true ;
elseif(isset($debug)) die(mysql_error());
else return false;
}

کد زیر هم تابعی هست که باهاش میگردم :



function db_search($db_name, $col_name ,$search , $selects="*")
{
if(is_string($search))
$search = "'".$search."'";
$select = mysql_query("SELECT $selects FROM $db_name WHERE $col_name = $search LIMIT 1 ") ;
return mysql_fetch_array($select);
}


کد زیر هم متعلق به صفحه اصلی برنامه هست که اجرا میشه :




for($i=1; $i< count($post_links); $i++)
{
if(! db_search('mylink', 'post_link' ,$post_links[$i]) )
{
db_insert('mylink','post_link',$post_links[$i]);
//usleep(500000); با این خط درست میشه یعنی صبر میکنه تا اینسرت بشه بعد دوباره میگرده
}
}

generalhak
سه شنبه 27 خرداد 1393, 21:01 عصر
اینو اگر میتونید برای من چک کنید »:
با php با درستورات mysql یه چیزی در دیتابیس اینتسرت کنید و بعد بلافاصله دنبالش بگردید ببینید هست یا نه ... برای من اینطوری میاره که نیست !! یعنی یه چیزی که همین قبلش اینسرت میکنم بعد که میگردم میگه نیست ... اما اگر یه زمان خاب بهش بدم مثلا نیم ثانیه usleep بدم میگه هست !! یعنی هنوز دستور اینسرت اوکی نشده میاد برنامه رو و دستورات بعدی mysql رو اجرا میکنه که عملا باید همچین چیزی توی پایگاه داده غیر ممکن باشه !

cpuram
سه شنبه 27 خرداد 1393, 22:43 عصر
خوب شما اول ارتباط با پایگاه داده رو قطع کن موقع جستجو دوباره وصل شو.

generalhak
چهارشنبه 28 خرداد 1393, 10:43 صبح
خوب شما اول ارتباط با پایگاه داده رو قطع کن موقع جستجو دوباره وصل شو.
بسیار کار عجیبی هست اینی که میگید !! برای شما موردی که در بالا گفتم چطوری میشه ؟

cpuram
چهارشنبه 28 خرداد 1393, 12:04 عصر
بسیار کار عجیبی هست اینی که میگید !! برای شما موردی که در بالا گفتم چطوری میشه ؟
فرصت نشد تست کنم.
درستش هم همینه کار عجیبی نیست وقتی شما ارتباط رو قطع نکنید از همون ارتباط استفاده میکنه و ممکنه دیتای جدید رو نشون نده.

سوداگر
چهارشنبه 28 خرداد 1393, 13:08 عصر
mysql_query() (http://ir1.php.net/manual/en/function.mysql-query.php)sends a unique query کار mysql_query فقط ارسال query به موتور mysql هست، اگر اشکالی در ارسال query پیش بیاد false برمیگردونه. خیلی ها فکر میکنن این متد تا اجرا شدن کامل query صبر میکنه ولی اینطور نیست (مثل نامه رسونه نه گیرنده نامه!) پس این وقفه ای که باید بوجود بیاد به خاطر زمانیه که موتور mysql صرف اجرا کردن queryها میکنه ربطی به PHP نداره. چرا فیلدی که میخواهید تکراری نباشه رو unique نمیذارید؟!

generalhak
پنج شنبه 29 خرداد 1393, 01:03 صبح
فرصت نشد تست کنم.
درستش هم همینه کار عجیبی نیست وقتی شما ارتباط رو قطع نکنید از همون ارتباط استفاده میکنه و ممکنه دیتای جدید رو نشون نده.
ارتباط و قطع و وصلی بالا میره اینطوری و درست نیست !

generalhak
پنج شنبه 29 خرداد 1393, 01:06 صبح
کار mysql_query فقط ارسال query به موتور mysql هست، اگر اشکالی در ارسال query پیش بیاد false برمیگردونه.
خیلی ها فکر میکنن این متد تا اجرا شدن کامل query صبر میکنه ولی اینطور نیست (مثل نامه رسونه نه اداره پست!)
پس این وقفه ای که باید بوجود بیاد به خاطر زمانیه که موتور mysql صرف اجرا کردن queryها میکنه ربطی به PHP نداره.
چرا فیلدی که میخواهید تکراری نباشه رو unique نمیذارید؟!
اونم یه راهش هست ولی خوب بعضی وقتها مشکلاتی داره مثلا برای بعضی چیزهایی که وارد میشه مشکلی نباشه ولی واسه بعضی چیزها نباید باشه ! دارم کلی میگم .. و همینطور مثلا شاید یک unique دیگه ای باشه ... در اینصورت باید هر دو یکی باشند تا خطا بده برنامه ...
حالا دستوری چیزی نیست که کاملا صبر کنه بعد کار رو انجام بده ... ؟ مثلا به جاش از mysqli استفاده کنم یا ....

generalhak
پنج شنبه 29 خرداد 1393, 01:10 صبح
الان که نگاه کردم دیدم مثل اینکه برای mysqli نوشتن اجرا دستور و برای mysql نوشتن ارسال دستور ... !!
حالا باید با mysqli هم تست کنم ... احتمالا با اون اوکی میشه

سوداگر
پنج شنبه 29 خرداد 1393, 01:28 صبح
نه اونم همین کار رو میکنه...
متدی که کوئری رو کامل اجرا (execute نه perform :چشمک:) میکنه mysqli_real_query هست نه mysqli_query....

generalhak
پنج شنبه 29 خرداد 1393, 15:23 عصر
نه اونم همین کار رو میکنه...
متدی که کوئری رو کامل اجرا (execute نه perform :چشمک:) میکنه mysqli_real_query هست نه mysqli_query....
آها راست میگی !!
ممنون اینو تست میکنم پس .. !