PDA

View Full Version : سوال: اجرا کوئری های چند خطی در PHP



pejman_view
جمعه 18 آذر 1390, 13:27 عصر
سلام

با توجه به اینکه در سایت php.net نوشته شده که از چند کوئری همزمان پشتیبانی نمی کند:
mysql_query() sends a unique query (multiple queries are not supported) to the currently active database

به غیر از استفاده از mysqli_query می خواهم از mysql_query استفاده کنم چون تمام کوئری ها نزدیک به 50 هزار خط با mysql نوشته شده است، می خواهم ببینم راهی هست تراکنش ها با موتور innodb یا کوئری های چند خطی در mysql_query اجرا کرد؟

idocsidocs
جمعه 18 آذر 1390, 22:10 عصر
با توجه به اینکه در سایت php.net نوشته شده که از چند کوئری همزمان پشتیبانی نمی کند:
با mysqli_query فقط می تونید یه کوئری اجرا کنید. برای اجرای چندین کوئری باید از توابع مالتیپل کوئری استفاده کنید. من تا حالا این کار رو نکردم ولی توابعش توی پی اچ پی هست و کار شما رو راه می ندازه.

pejman_view
جمعه 18 آذر 1390, 22:42 عصر
سلام،
بله حرف شما صحیح است، و حتی تابع آن هم mysqli_multi_query است که می شود چندتا کوئری هم اجرا کرد اما مشکل من اینه برنامه تا اینجا نزدیک به 50 هزار کوئری برایش نوشته شده که همه با mysql هستند نه mysqli بخاطر همین یک راهی می خواهم که بدون تغییر دادن این 50 هزار کوئری من کارم را ادامه بدم.

با تشکر

idocsidocs
شنبه 19 آذر 1390, 12:52 عصر
50 هزار کوئری برایش نوشته شده
کوئری ها که سینتکسشون با هم تفاوتی نداره. می تونید همه کوئری ها رو با هم اجرا کنید.

pejman_view
شنبه 19 آذر 1390, 14:14 عصر
کوئری ها که سینتکسشون با هم تفاوتی نداره. می تونید همه کوئری ها رو با هم اجرا کنید.
سلام

من کاری به سینتکس SQL آن ندارم، اگر بخواهم کارم را از mysql به mysqli و یا pdo تغییر بدهم نیاز است به 50 هزار mysql_query رو تغییر بدهم، که بالتبع mysql_fetch_array، real escape string و ... هم باید اصلاح شود، باید راه منطقی دیگری وجود داشته باشد.

چون اول خواستم اینکار کنم خیلی ارور گرفتم یک روز هم روش کار کردم تمامی نداشت بیخیالش شدم.

در کل ممنون از کمکتان

MMSHFE
شنبه 19 آذر 1390, 15:09 عصر
میشه بپرسم مشکل اجرای کوئری های شما بصورت تک تک چی هست؟ اگه میخواین برای اجرای تک تک اونها دستور mysql_query و عملیات Escape و... رو تکرار نکنید، میتونید کل کوئری ها رو توی یک فایل بگذارین (هر کوئری توی یک سطر) و بعد، با AJAX فایل مربوطه رو سطر به سطر بخونید و کوئری خونده شده رو Escape و اجرا کنید. علت استفاده از AJAX هم اینه که با Script Timeout مواجه نشین.
موفق باشید.

pejman_view
شنبه 19 آذر 1390, 15:20 عصر
سلام

نگاه کنید 50 هزار کوئری دارم که هر کدام کار متفاوتی انجام می دن و هر کدوم داخل یک متد متفاوت قرار دارند.

بگذارید با یک مثال توضیح بدم:
فرض کنید من خواستم 1 تراکنش مالی انجام بدهم
از یوزر آی دی 200 میلیون تومان کم کنم
به یوزر آی دی دیگری 200 میلیون تومان اضافه کنم.
و در آخر هم یک ریپورت به یک جدول دیگر اضافه می شود.
تا اینجاش مشکلی پیش نمیاد دو تا کوئری هستند که بخوبی کار می کنند.
حالا فرض کن 200 میلیون اول کم شد سرور برقش رفت ، سرور کرش کرد یا هر اتفاقی افتاد کوئری دوم اجرا نشد. دیگه پیدا کردن این پوله کار حضرت فیل می شه، تریگر هم تا حدودی برای ریپورت می تونه به کارمون بیاد اما کاملاً به کارمون نمیاد ممکنه هم بگید چرا از موتور innodb استفاده نمی کنید، والله می خوام استفاده کنم اما چند کوئری همزمان نمی شه انجام داد.

با آرزوی موفقیت.

MMSHFE
شنبه 19 آذر 1390, 16:56 عصر
با سلام، نظرتون در این مورد چیه؟


mysql_query('SET AUTOCOMMIT=0');
mysql_query('START TRANSACTION');
// Place all your queries which are dependent to each other here, using mysql_query
mysql_query('COMMIT');
mysql_query('SET AUTOCOMMIT=1');

توضیح: کوئریهای خودتون رو که به هم وابسته هستن، در محل توضیحات قرار بدین. اینطوری همه دستورات با هم اجرا خواهند شد. تا جایی که بررسی کردم، اگه هرکدوم اجرا نشه، کل تغییرات ROLLBACK میشه. البته باید از InnoDB استفاده کنید. اتفاقاً در MyISAM امکان اجرای همزمان چند کوئری وجود نداره. موفق باشید.

pejman_view
شنبه 19 آذر 1390, 19:32 عصر
سلام

به نظرم این راه حل خوبیه.

خیلی ممنون