PDA

View Full Version : سوال: فرم ورود اطلاعات و رفرش صفحه



mehdi2004171
شنبه 04 دی 1389, 19:43 عصر
من یک فرم ورود اطلاعات با html طراحی کرده و دستورات insert کردن این اطلاعات به پایگاه mysql با php را نیز نوشته ام
که همه چیز با موفقیت انجام می شود ولی فقط دو سوال باقی می ماند

1- اگر کاربر دکمه F5 را فشار و صفحه دوباره refresh شود دوباره این اطلاعات وارد پایگاه داده می شود

2- بعضی از فیلدهای این اطلاعات قرار است در جدولی نمایش داده شود اما مشکل اینجاست که اگر کاربر دکمه enter
فشار داده شود در نمایش این دکمه اعمال نمی شود یعنی تمام خط ها پشت سر هم نمایش داده می شود؟

با تشکر!

mohsen6500
شنبه 04 دی 1389, 19:57 عصر
سلام دوست عزیز
برای اینکه مطمئن بشی فیلد پر شده اونو چک کن
حالا این چک کردن هم با جاوا اسکریپت میشه که قبل از ارسال چک میشه و هم PHP که بعد از ارسال چک میشه
با PHP رو توضیح کوتاهی میدم با جاوا اسکریپت اگر خواستی هم بعدا برات میذارم
برای این کار فقط لازمه که اونو با تابع زیر چک کنی!


if(!isset($_POST['نام فیلد']))
{
echo 'فیلد مورد نظر پرنشده لطفا بازگشته و فیلد را پرنمایید';
return false;
}

موفق باشی
یا علی

AbiriAmir
شنبه 04 دی 1389, 20:00 عصر
جوابی که برای مورد اول به ذهنم میرسه استفاده از captcha هست

اما مورد دوم رو خودتون بخونید ببینید متوجه میشید؟

UnnamE
یک شنبه 05 دی 1389, 00:00 صبح
با گرفتن آي پي واسه فهمدين آخرين فعاليت كاربر هم ميتونيد واسه مورد اول فكري بكني
هرچند امير هم روش درستي گفت
در مورد دوم واسه تعيين اعتبار كارهاي زيادي ميشه انجام داد
بهترين كار نوشتن يك كلاس validator هست كه همه كارهاي اعم از تععين اعتبار ورودي و تعداد كاراكتر هاي ورودي رو در بر بگيره
البته ميتوني اطلاعات رو قبل از ارسال هم با جاوا اسكريپت و jQuery چك كني كه كار ساده اي هم هست
يه گوگل كوچولو هانجلم بده مقاله فت و فراوون ريخته واسه چك كردن وروودي با jQuery!!!

eshpilen
یک شنبه 05 دی 1389, 08:46 صبح
اگر کاربر دکمه F5 را فشار و صفحه دوباره refresh شود دوباره این اطلاعات وارد پایگاه داده می شودبرای جلوگیری از این کار باید یک رشتهء تصادفی بصورت یک input از نوع hidden در فرم خود قرار دهید و این رشته پس از سابمیت شدن فرم در دیتابیس یا جای دیگری حفظ شود (بعضی افراد از سشن استفاده میکنند)، سپس چنانچه ارسال POST دیگری داشتید که رشتهء تصادفی موجود در آن قبلا در در دیتابیس شما ثبت شده بود متوجه میشوید که محتوای این فرم قبلا ارسال شده است. البته این راه ممکن است نیاز به تکمیل بیشتری داشته باشد. ضمنا روشهای جلوگیری از کش شدن صفحه را فراموش نکنید تا هر موقع که کاربری صفحهء فرم شما را باز میکند، صفحه از سرور بارگذاری مجدد شود تا رشتهء تصادفی جدیدی تولید شود.

mehdi2004171
یک شنبه 05 دی 1389, 13:12 عصر
برای جلوگیری از این کار باید یک رشتهء تصادفی بصورت یک input از نوع hidden در فرم خود قرار دهید و این رشته پس از سابمیت شدن فرم در دیتابیس یا جای دیگری حفظ شود (بعضی افراد از سشن استفاده میکنند)، سپس چنانچه ارسال POST دیگری داشتید که رشتهء تصادفی موجود در آن قبلا در در دیتابیس شما ثبت شده بود متوجه میشوید که محتوای این فرم قبلا ارسال شده است. البته این راه ممکن است نیاز به تکمیل بیشتری داشته باشد. ضمنا روشهای جلوگیری از کش شدن صفحه را فراموش نکنید تا هر موقع که کاربری صفحهء فرم شما را باز میکند، صفحه از سرور بارگذاری مجدد شود تا رشتهء تصادفی جدیدی تولید شود.

با تشکر از همه دوستان که به این سوال پاسخ دادند اما شما بهتر درد من را متوجه شدید
می شود روشهایی را که گفتید با کد نویسی تکمیل کنید
مانند یک رشته از نوع hidden و روش جلوگیری از کش شدن صفحه

با تشکر

lady64
یک شنبه 21 خرداد 1391, 07:51 صبح
برای جلوگیری از این کار باید یک رشتهء تصادفی بصورت یک input از نوع hidden در فرم خود قرار دهید و این رشته پس از سابمیت شدن فرم در دیتابیس یا جای دیگری حفظ شود (بعضی افراد از سشن استفاده میکنند)، سپس چنانچه ارسال POST دیگری داشتید که رشتهء تصادفی موجود در آن قبلا در در دیتابیس شما ثبت شده بود متوجه میشوید که محتوای این فرم قبلا ارسال شده است. البته این راه ممکن است نیاز به تکمیل بیشتری داشته باشد. ضمنا روشهای جلوگیری از کش شدن صفحه را فراموش نکنید تا هر موقع که کاربری صفحهء فرم شما را باز میکند، صفحه از سرور بارگذاری مجدد شود تا رشتهء تصادفی جدیدی تولید شود.
میخوام از این روش استفاده کنم . چون من هم فرم ورود اطلاعات زیاد دارم و نمیخوام این اتفاق بیفته . اینطور متوجه شدم که یک مقداری بعد از insert شدن در همون table ذخیره میکنیم . بعد بادستور select چک میکنیم که این مقدار ست ست شده یا نه ؟ اگر کسی رفرش رو زد و ست شده بود پس insert‌ دوم انجام نمیشه .
1.میشه ابتدای هر صفحه که فرم ورود اطلاعات داریم ، یک ثابت تعریف کنیم و هنگام insert اون هم در همون رکورد جاری ذخیره بشه ؟
2.فرمودید تکمیل بیشتر میخواد ، میشه بفرمائید چه کارهای دیگه ای لازمه ؟
3. جلوگیری از کش صفحه رو هم سرچ کردم . چیزی یافت نشد. این رو هم ممنون میشم توضیح بدید.

Reza1607
یک شنبه 21 خرداد 1391, 10:42 صبح
برای مورد اول(ایجاد یک رشته تصادفی)
قبل از نمایش فرم شما یک رشته تصادفی ایجاد می کنید این رشته تصادفی رو یکبار در سشن و یک بار در فرم کاربر ذخیره می کنید به کد زیر دقت کنید


<?php
session_start();
if(isset($_POST['name'],$_SESSION['token']) && $_SESSION['token']==$_POST['token'])
{
//another code
}
$_SESSION['token']=uniq(time());
?>
<form action='' method='post'>
Name : <input type='text' name='fname' value='' /><br />
<input type='submit' value='Send' />
<input type='hidden' name='token' value='<?php echo $_SESSION['token'] ?>' />
</form>

خوب تو این کد شما اول از همه سشن رو استارت کردین بعدش هم چک کردین که آیا اطلاعات ارسال شده و سشن توکن( توکن همون رشته تصادفی هستش) ایجاد شده یا خیر؟ و این که مقدار ارسال شده توسط فیلد token با مقداری که داخل سشن ذخیره کردیم برابر هست یا نه؟
اگر این شرط برقرار بود یعنی فرم ارسال شده و کارهایی رو که می خواین رو تو این قسمت قرار می دین
و اگر هم ارسال نشده بود خط بعد از شرط اجرا میشه و در این خط با استفاده از تایع uniq یک رشته منحصر به قرد تولید و در سشن ذخیره می شه بعد از این کار هم فرم رو به کار نشون می دیم با این تفاوت که یک فیلد دیگه از نوع hidden ایجاد کردیم و اسمش رو token گذاشتیم و مقدار اون مساوی مقدار داخل سشن قرار دادیم

برای مشکل دوم هم در موقع نمایش از تابع nl2br استفاده کنید به این صورت


echo nl2br($field_name);