PDA

View Full Version : مشکل رفرش و ارسال مجدد اطلاعات



xoogle.ir
سه شنبه 04 اسفند 1388, 20:45 عصر
یک فرم برای تماس درست کردم و نوشتم اگر دکمه submit زده شد اطلاعات گرفته شده رو در دیتابیس ذخیره کنه اما این روش یه باگ داره و اونم اینه که بعد از فرستادن اطلاعات اگر کاربر صفحه رو رفرش کنه همون اطلاعاتی که پر کرده بود دوباره ارسال میشه.
شما چه جوری این مشکل رو برطرف میکنید ؟
یه راه به ذهن خودم رسیده اونم اینه که action فرم رو بذارم روی یک صفحه دیگه غیر از خودش و وقتی که اطلاعات رو save کرد با دستور header برگرده به صفحه فرم ! این کارم درسته ؟؟ مشکل دیگه ای به وجود نمیاره ؟
اگر بخام از این راه استفاده کنم چه جوری باید پیغام "پیام شما ارسال شد" رو در صفحه فرم نمایش بدم ؟
ببخشید سوالهای مبتدیانه میپرسم :لبخند:

yasgig
سه شنبه 04 اسفند 1388, 22:28 عصر
وقتی اطلاعاتت ارسال شد صفحه رو به یه صفحه با موضوع اینکه پیغام شما ارسال شد ریدایرکت کن و اگه اطلاعات ارسال نشد صفحه رو به یه صفحه با موزیع اینکه پیغام ارسال نشد ریدایرکت کن.

xoogle.ir
سه شنبه 04 اسفند 1388, 23:22 عصر
وقتی اطلاعاتت ارسال شد صفحه رو به یه صفحه با موضوع اینکه پیغام شما ارسال شد ریدایرکت کن و اگه اطلاعات ارسال نشد صفحه رو به یه صفحه با موزیع اینکه پیغام ارسال نشد ریدایرکت کن.
ممنونم دوست عزیز ولی استاد ما گیر داده که این کار حرفه ای نیست!
میگه که بعد از ارسال پیام صفحه دوباره باید برگرده به صفحه contact و یه پیغام نمایش بده که پیام ارسال شد یا نشد!

yasgig
چهارشنبه 05 اسفند 1388, 09:06 صبح
یه سری به تاپیک زیر بزن:
http://barnamenevis.org/forum/showthread.php?t=204922

Reza1607
چهارشنبه 05 اسفند 1388, 11:39 صبح
شما یک متغییر رو داخل session بریزید و در صفحه فرمتون اون رو چک کنید اگه برابر یک مقدار خاص بود پیغام مربوط به اون رو چاپ کنه

امید امرایی
چهارشنبه 05 اسفند 1388, 11:52 صبح
راه دیگه هم اینه که از QueryString استفاده کنید

مثالی از صفحه تعیین اعتبار :


if($sent)
header("Location: ".$_SERVER['HTTP_REFERER']."?msg=sent");
else
header("Location: ".$_SERVER['HTTP_REFERER']."?msg=notsent");

xoogle.ir
چهارشنبه 05 اسفند 1388, 19:07 عصر
خیلی ممنون پیشنهاد خوبی بود!
مشکل رفرش صفحه و پیغام حل شد. اما الان 2 تا مشکل کوچولوی دیگه وجود داره که البته اهمیتشون فقط از این بابته که کار بدون ایراد باشه.
1- برای اینکه کاربر نتونه در صفحه contact.php خودش querystring بده و پیغام رو ببینه من یه if به این صفحه اضافه کردم این جوری :

if($_SERVER['HTTP_REFERER']=='save_contact.php'){
switch($msg){
case 'sent':
echo "<span style=\"color:green;\"><b>پیام شما با موفقیت دریافت شد.</b></span>";
break;
case 'notsent':
echo "<span style=\"color:red;\"><b>پیام شما دریافت نشد لطفا بعدا تلاش فرمایید.</b></span>";
break;
case 'guide':
echo "<span style=\"color:#576ca9;\"><b>لطفا پس ار پر کردن فرم، روی ارسال کلیک نمایید.</b></span>";
break;
}
}
اما الان وقتی کاربر از صفحه save_contact.php هم برمیگرده querystring میاد اما پیغام رو بهش نشون نمیده! چه کار باید انجام بدم؟
2- اگر کاربر یک بار پیغام بفرسته لینکش میشه این: contact.php?msg=sent و اگر دوباره پیغام بفرسته لینکش میشه contact.php?msg=sent?msg=sent یعنی querystring 2 تا میشه که باز هم پیغام رو نشون نمیده

از کمکتون ممنون

xoogle.ir
پنج شنبه 06 اسفند 1388, 11:29 صبح
کسی ایراد مشکل شماره یک که نوشتم راه حلی نداره ؟؟
ساختار if رو چه جوری باید بنویسم که switch اجرا بشه ؟؟
مشکل شماره 2 رو خودم تونستم حل کنم.

Reza1607
پنج شنبه 06 اسفند 1388, 11:50 صبح
مگه نباید از
$_GET['msg'] نباید استفاده کنی؟

xoogle.ir
پنج شنبه 06 اسفند 1388, 15:16 عصر
اون کار رو بالاتر انجام دادم با این تفاوت که ریختمش توی متغیر $msg

$msg=$_GET['msg']

امید امرایی
شنبه 08 اسفند 1388, 10:34 صبح
وقتی از تابع header استفاده میکنید HTTP_REFERER ارسال نمی شه

در مورد مشکل اوتون بنده اصل مشکل شما رو دقیقا درک نمی کنم.
به نظر میاد موضوع بی اهمیتیه و چه اشکالی داره اگه کاربری از سر بیکاری بیاد همچنین کاری رو انجام بده ؟

اما در مورد مشکا دوم شما می تونید توی صفحه save_contact.php به این شکل عمل کنید.


$ref_url = explode('?', $_SERVER['HTTP_REFERER']);
header("Location: ".$ref_url[0]."?msg=sent");

Reza1607
شنبه 08 اسفند 1388, 11:40 صبح
دوست عزیز horap30
من که می گه از session استفاده کنی بهتر کم دردسره
اینم کد :

if(mysql_query("query")) $_SESSION['state']='ok'];
else $_SESSION['state']='no';
header('Location :url');

--------------صفحه بررسی اجرا دستور -----------------------------------------

if(isset($_SESSION['state'])){
switch($_SESSION['state']){
case 'ok':
echo "عملیات با موفقیت اجرا شد";
break;
case 'no':
echo "در اجرای عملیات اشکالی به وجود آمده است لطفا مجددا سعی کنید";
break;
}
}

xoogle.ir
شنبه 08 اسفند 1388, 14:38 عصر
ازتون ممنونم خصوصا kassit عزیز.
مشکلم حل شد مرسی

Reza1607 عزیز ، استادمون گفته از session استفاده نکنید ولی فکر میکنم این راه یه مشکل داره اونم اینه که اگه کاربر بره صفحات دیگه رو ببینه و دوباره برگرده به صفحه contact دوباره همون پیغام رو میبینه منم که روی این مسائل حساسم :لبخند:

Reza1607
شنبه 08 اسفند 1388, 15:00 عصر
خواهش می کنم
اگه امکانش هست کد کامل شده رو اینجا بذارید تا بقیه دوستان هم ازش استفاده کنند


Reza1607 عزیز ، استادمون گفته از session استفاده نکنید

من از نظر راهنمایی گفتم:لبخندساده:


ولی فکر میکنم این راه یه مشکل داره اونم اینه که اگه کاربر بره صفحات دیگه رو ببینه و دوباره برگرده به صفحه contact دوباره همون پیغام رو میبینه منم که روی این مسائل حساسم :لبخند:

بله شما درست میگید اشکال کار اینجاست که بعد از دستور switch باید session رو unset کرد که من این دستور رو یادم رفت بنویسم

unset($_SESSION['state']

xoogle.ir
سه شنبه 11 اسفند 1388, 00:59 صبح
در نهایت با همون session نوشتم.
صفحه بررسی اطلاعات پست شده قسمت مقداردهی به session :

$result=mysql_query($query) or die('query Failed!'.mysql_error());
if($result){
$_SESSION['status']='sent';
}else{
$_SESSION['status']='notsent';
}
header("Location: ".$_SERVER['HTTP_REFERER']);
صفحه فرم قسمت چاپ پیغام:

if(isset($_SESSION['status'])){
switch($_SESSION['status']){
case 'sent':
echo "<span style=\"color:green;\"><b>پیام شما با موفقیت دریافت شد.</b></span>";
break;
case 'notsent':
echo "<span style=\"color:red;\"><b>پیام شما دریافت نشد لطفا بعدا تلاش فرمایید.</b></span>";
break;
case 'guide':
echo "<span style=\"color:#576ca9;\"><b>لطفا پس ار پر کردن فرم، روی ارسال کلیک نمایید.</b></span>";
break;
}
unset($_SESSION['status']);
}