PDA

View Full Version : چرا در بعضی صفحات php دستور mysql بیشتر از یک بار اجرا میشه؟



ghasemweb
دوشنبه 01 اردیبهشت 1393, 13:23 عصر
سلام.
نمیدونم این مشکل مربوط به php هست یا mysql واسه همین اینجا مطرح کردم.
مشکل این هست که من داخل پروژه اومدم تبدیل صفحه html به pdf رو گذاشتم و در ازاش باید از شارژ مالی کاربر مقداری کسر بشه مثلا 500 اما به جای کسر 500 میاد 1500 یا 1000 از شارژ کاربر کسر میکنه ! اولش فکر کردم اون تابع بیشتر از یکبار فراخوانی میشه اما بعدش که از سیشن استفاده کردم تا جلوی فراخوانی شدن بیشتر از یک بار رو بگیرم بازم دیدم مشکل سرجاشه.
به نظرم مشکل از خود mysql باشه که یه کوئری رو بیشتر از یک بار اجرا میکنه. شما همچین مشکلی تا حالا داشتید؟ لطفا راه حل بدید و جای اساسی پروژه به مشکل خورده.

cpuram
دوشنبه 01 اردیبهشت 1393, 14:49 عصر
شما که کاربر دائمی برنامه نویس هستید چرا سوال رو ناقص میپرسید؟ بدون دیدن کد که نمیشه داداش من.

SlowCode
دوشنبه 01 اردیبهشت 1393, 23:47 عصر
به احتمال زیاد شما از Ajax استفاده کردین. به همین دلیل چندین درخواست فرستاده میشه(گاهی اوقات).
محاله مشکلی تو mysql باشه! اگر هم باشه مشکل از کوئری شماست!

ghasemweb
سه شنبه 02 اردیبهشت 1393, 10:35 صبح
به لحاظ سنگینی پروژه نمیدونم کدوم بخش از سورس رو بذارم اینجا اما توضیحی که دارم اینه که تو این صفحه php یه کلاس mpdf اینکلود شده و یه کلاس mysql. نه با ایجکس اجرا نمیشه و به صورت فرم post ارسال میشه.

کد مربوط به کسر شدن شارژ که مشکل چندبار اجرا شدن داره.

$sqlcmd="UPDATE users set `charge`=$charge where `uid`=$uid ";$db->sql_query($sqlcmd);


کارهایی که من کردم تا جلوی تکرار اجرا گرفته بشه:


if (isset($_SESSION["charge_kasr_shod"]) && $_SESSION["charge_kasr_shod"]=="ok"){
$sqlcmd="UPDATE users set `charge`=$charge where `uid`=$uid ";$db->sql_query($sqlcmd);
$_SESSION["charge_kasr_shod"]="ok";}


اما باز همین مشکل بود پی نتیجه میگیریم که مشکل از سمت php نیست که این خط کد چند بار اجرا میشه.مشکل باید سمت mysql باشه درسته؟

حالا باز من یه کار دیگه کردم اومدم یه فیلد به تیبل اضافه کردم به اسم charge_kasr_shod بعدش کد زیر رو نوشتم.



$sqlcmd="UPDATE users set `charge`=$charge ,charge_kasr_shod=1 where `uid`=$uid and charge_kasr_shod=0";
$db->sql_query($sqlcmd);

با این کار مشکل حل شده اما خب احساس میکنم اصولی نباشه. این مشکل دقیقا واسه بخش آمار سایت هم دارم که مثلا با ورود هر کاربر میخوام یک واحد به عدد بازدید روز اضافه بشه یک دفعه میدیدم چند واحد اضافه شده!!!!!

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

omidabedi
سه شنبه 02 اردیبهشت 1393, 12:02 عصر
شاید کاربر صفحه رو رفرش میکنه و مرورگر پیغامی مبنی بر ارسال دوباره ی درخواست میده و اگر کاربر اوکی کرد باز درخواست ارسال میشه
این حالت زمانی رخ میده که یک درخواست رو تو همون صفحه اجرا کنید و باز کاربر رو به همون صفحه برگردونی

cpuram
سه شنبه 02 اردیبهشت 1393, 12:43 عصر
بعد از این که کسر شد از header() برای انتقال استفاده می‌کنید؟اگه کد کسر وجه داخل یک صفحه جداگانه باشه و بعد از اتمام کار به با header() انتقال بدید شاید حل بشه.

ghasemweb
سه شنبه 02 اردیبهشت 1393, 13:14 عصر
بعد از این که کسر شد از header() برای انتقال استفاده می‌کنید؟اگه کد کسر وجه داخل یک صفحه جداگانه باشه و بعد از اتمام کار به با header() انتقال بدید شاید حل بشه.

آره من مجبور شدم همین کارو کنم یعنی دو بخش مجزا یکی کارش کسر شارژه بعدش که کسر شد با هدر میفرستم یه تابع دیگه اجرا بشه و فقط کارش تولید pdf هستش.
من هدفم این بود ببینم ریشه این مشکل کجاست؟؟؟ ضعف mysql هست یا چی؟

***BiDaK***
سه شنبه 02 اردیبهشت 1393, 13:49 عصر
این شرط که اشتباس

if (!isset($_SESSION["charge_kasr_shod"]) && $_SESSION["charge_kasr_shod"]=="ok"){
برای اجرای کوئری update از چه شرطی استفاده کردین؟

ghasemweb
سه شنبه 02 اردیبهشت 1393, 15:53 عصر
این شرط که اشتباس

if (!isset($_SESSION["charge_kasr_shod"]) && $_SESSION["charge_kasr_shod"]=="ok"){
برای اجرای کوئری update از چه شرطی استفاده کردین؟

اشتباه تایپی شده اون علامت نقیض قبل از تابع isset نباید باشه. سومین پست رو بررسی بفرمایید کدها رو گذاشتم

cpuram
سه شنبه 02 اردیبهشت 1393, 18:40 عصر
نه mysql که برای کارای کوچیک ما ضعف نداره.
مطمئن هستی کاربر رفرش نمیکرد؟ یا صفحه رفرش نداره؟
بعد از انجام کار متغییرهاتو unset کن ببین چی میشه .

ghasemweb
سه شنبه 02 اردیبهشت 1393, 19:24 عصر
نه mysql که برای کارای کوچیک ما ضعف نداره.
مطمئن هستی کاربر رفرش نمیکرد؟ یا صفحه رفرش نداره؟
بعد از انجام کار متغییرهاتو unset کن ببین چی میشه .

خب وقتی سیشن مقدار میگیره موقع تغییر دیگه بعدش اگر رفرش بشه هم سیشن سرجاشه پس عملا نباید اون خط با رفرش اجرا بشه ! اما اجرا میشه پس رفرش تاثیری نخواهد داشت گرچه رفرش نمیشه اصن از سمت کاربر یا حتی خود سیستم