🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۴ هادی جیبر
Reload شدن صفحه
محسن موحد حل شده توسط محسن موحد

با سلام

بعداز ارسال دیتای فرم (Submit) صفحه Refresh میشه و اگر دیتای ورودی مشکل هم داشته باشه کل فرم پاک میشه برای جلوگیری از Refresh شدن فرم زمانی که دیتا مشکل داره باید چکار کنیم. 

سلام،

برای جلوگیری از رفرش شدن صفحه بعد از ارسال فرم و پاک شدن اطلاعات وقتی خطا توی ورودی‌ها وجود داره، می‌تونی از ولیدیشن سمت کلاینت (فرانت‌اند) استفاده کنی، مثل ولیدیشن‌های جاوااسکریپت یا خود HTML5. این کار باعث میشه قبل از اینکه فرم ارسال بشه، داده‌های ورودی چک بشن و در صورت وجود مشکل، از ارسال جلوگیری کنه.

اما به هر حال، وقتی روی دکمه Submit کلیک می‌کنی، معمولاً توی تگ form یه action تعریف می‌کنی که تعیین می‌کنه اطلاعات فرم به کجا ارسال بشه. اگه action رو خالی بذاری، فرم به همون صفحه‌ای که روش هستی ارسال میشه و این اتفاقی که بهش اشاره کردی یعنی postback و رفرش شدن صفحه پیش میاد.

حالا برای اینکه فرم بعد از ارسال اطلاعات خالی نشه، می‌تونی مقدارهایی که توی اینپوت‌ها وارد می‌کنی رو، بعد از ولیدیشن سمت سرور، دوباره داخل خود اینپوت‌ها بذاری. به این صورت که وقتی فرم ارسال شد و مثلاً توی پردازش PHP خطا بود، مقدارهایی که کاربر وارد کرده رو دوباره توی همون فیلدها نشون بدی تا فرم خالی نشه.

برای مثال، اینطوری می‌تونی توی تگ اینپوت از مقدار POST استفاده کنی:

<input type="text" name="username" value="<?php echo !empty($_POST['username']) ? $_POST['username'] : ''; ?>">

این کار باعث میشه که اگه کاربر مثلاً اسمش رو وارد کرده باشه و بقیه فرم مشکل داشته باشه، بعد از ارسال فرم، همون اسم دوباره توی فیلد username نمایش داده بشه.

محسن موحد ۲۰ شهریور ۱۴۰۳، ۱۹:۳۱

سلام

این کدی ارسال کردین ایرادی که داره اینه که بعد از ارسال فرم و موفقیت آمیز بودن ارسال هموراه اطلاعات قبلی در فیلدهای ورودی باقی میمونه. 

هادی جیبر ۲۱ شهریور ۱۴۰۳، ۰۷:۳۸

عرض کردم باید ولیدیشن سمت php بذارید و فقط در صورتیکه فرم ولیدیت نشده باشه یا چیزی ارسال نشده باشه فرم نمایش داده بشه در غیر اینصورت یعنی اطلاعات ولید هستن و وارد شروط فرم نخواهد شد.

محسن موحد ۲۱ شهریور ۱۴۰۳، ۱۰:۴۳

اگه می‌خوای بعد از اینکه فرم ارسال شد و اطلاعاتش درست بود، باز هم فرم نمایش داده بشه و از مشکل رفرش و ارسال مجدد اطلاعات جلوگیری کنی، یه راه مناسب اینه بعد از اینکه اطلاعات رو چک کردی و ولید بودنشون رو تأیید کردی، کاربر رو به همون صفحه ریدایرکت کنی. این کار باعث میشه اطلاعات POST شده از بین بره و اگه کاربر صفحه رو رفرش کرد، دوباره همون اطلاعات ارسال نشه. بعد از ریدایرکت هم می‌تونی یه پیام موفقیت‌آمیز به کاربر نشون بدی که مثلاً "اطلاعات با موفقیت ثبت شد!"

برای اینکه این کار رو انجام بدی، می‌تونی از تابع header() توی PHP استفاده کنی. یه کد بعنوان مثال میارم:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // اینجا اطلاعات رو چک می‌کنیم
    $name = $_POST['name'];
    $email = $_POST['email'];
    // فرض می‌کنیم یه ولیدیشن ساده برای پر بودن این دو فیلد داریم
    if (!empty($name) && !empty($email)) {
        // اگر اطلاعات درست بود، ذخیره‌شون می‌کنیم یا هر کار دیگه‌ای انجام میدیم
        // ...
        // بعد از اینکه اطلاعات درست بود، ریدایرکت می‌کنیم به همون صفحه
        header('Location: '.$_SERVER['PHP_SELF'].'?success=true');
        exit();
    } else {
        // اگه اطلاعات مشکل داشت، یه پیغام خطا نشون میدیم
        $error = "لطفاً همه فیلدها رو پر کنید!";
    }
}
// اینجا می‌تونیم پیام موفقیت یا خطا رو نشون بدیم
if (isset($_GET['success']) && $_GET['success'] == 'true') {
    echo "<p style='color: green;'>اطلاعات با موفقیت ثبت شد!</p>";
}
if (isset($error)) {
    echo "<p style='color: red;'>{$error}</p>";
}
?>
<!-- فرم HTML -->
<form action="" method="POST">
    <label for="name">نام:</label>
    <input type="text" name="name" id="name" value="<?php echo isset($_POST['name']) ? $_POST['name'] : ''; ?>"><br>
    <label for="email">ایمیل:</label>
    <input type="email" name="email" id="email" value="<?php echo isset($_POST['email']) ? $_POST['email'] : ''; ?>"><br>
    <input type="submit" value="ارسال">
</form>

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

 

بهترین پاسخ
محسن موحد ۲۱ شهریور ۱۴۰۳، ۱۰:۵۲