تالار گفتمان nCIS.ir

نسخه‌ی کامل: نمایش ندادن پیغام موفقیت آمیز با Refresh (حل شد)
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام دوستان میخوام با refresh  شدن صفحه پیغام  "اطلاعات شما با موفقیت امیز ثبت شد" نیاد  فقط در صورت کلیک رو دکمه ثبت این پیغام بیاد که میاد و درست عمل میکنه.
<?php
require_once '../main.php';
if(isset($_POST["send"])){
    $userid = $_SESSION['user_id'];
    $step = $_POST["step"];
    $branch = $_POST['branch'];
    $codebranch = $_POST['codebranch'];
    $time = time();
    $db = Db::getInstance();
    $db->insert("INSERT INTO `Interface_form`(`user_id`,`BranchName`,`codebranch`, `date`) VALUES ('$userid' ,'$branch','$codebranch', '$time')");
    $formid = $db->last();
    for ($i = 1; $i <= $step; $i++) {
        if($_POST['group'.$i] == "on"){
            $number = $_POST['number'.$i];
            $moshakasat =$_POST['moshakasat'.$i];
            $tozihat = $_POST['tozihat'.$i];
            $onvan = $_POST['onvan'.$i];
            $records = $db->insert("INSERT INTO `form`(`form_id` , `onvan_id`, `num`, `moshakasat`, `description`) VALUES ('$formid' , '$onvan' , '$number' , '$moshakasat' , '$tozihat')");                                              
        }
    }
    $_SESSION['success_message'] = 'اطلاعات شما با موفقیت ثبت شد.';
    header('location:index.php');
    exit();
}else{
    header('location:index.php');
    exit();
}
?>
سلام. اگه این صفحه، همون index.php هست، مشکل اینه که با رفرش شدن دوباره اطلاعات Post میشه وعملیات دوباره انجام میشه. بهتره یک توکن تصادفی توی فرم بگذارین که اون هم باید ارسال بشه و توی سشن هم مقدارش رو ثبت کنین. اینطوری اگه صفحه رفرش بشه، چون توکن فرق کرده حتماً باید فرم دوباره سابمیت بشه و رفرش باعث میشه از کار بیفته. به این مثال دقت کنید:
<?php
    session_start();
    if (isset($_POST['send'], $_SESSION['token']) && $_POST['token'] == $_SESSION['token']) {
        // process form here
    }
    $_SESSION['token'] = sha1(time() + rand(10000, 99999));
?>
<form action="" method="post">
    <input name="token" type="hidden" value="<?= $_SESSION['token'] ?>"/>
    ...
</form>

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

اگه صفحه‌ی پردازش فرم شما هم index.php نیست، به احتمال زیاد تابع header کار نمیکنه و هشدار Headers already sent دارین. بهتره همیشه ریدایرکت رو اینطوری انجام بدین:
<?php
header('location: index.php');
exit('<meta http-equiv="refresh" content="0;url=index.php"/>');
?>

اینطوری اگه header کار نکنه، تگ متا کار ریدایرکت رو انجام میده و دستور exit هم تضمین میکنه که بقیه‌ی کد اجرا نشه.
ممنونم استاد شهرکی از پاسختون. خیلی کامل و مفید بود.
متشکر