【问题标题】:Alert/success message is shown after reload page重新加载页面后显示警报/成功消息
【发布时间】:2020-10-08 05:34:24
【问题描述】:

我在 php 中创建了一个用于文件上传的表单,但是当添加文件并刷新页面时,用户仍然可以看到之前操作的结果。我只创建了一个简单的表单,如下所示:

<form method="POST" action="add-photo.php" enctype="multipart/form-data">
    <div class="form-group">
        <label for="form-control-file">Dodawanie zdjęcia</label>
        <input type="file" name="file" class="form-control-file" id="form-control-file" required>
    </div>
    <button class="btn btn-lg btn-primary" name="submit" type="submit">Dodaj zdjęcie</button>
</form>

提交表单时,我使用 php 代码:

if (isset($_POST['submit'])) {
$photo = new Photo();
$photo->setFile($_FILES['file']['tmp_name']);
$photo->setFileName($_FILES['file']['name']);

if ($photo->hasCorrectFileExtension() && $photo->hasCorrectSize()){
    $photo->uploadPhoto();
}
header('add-photo.php');
}

我创建了名为 Photo 的类,我有函数 hasCorrectFileExtension()hasCorrectSize() 在上传前检查文件。

public function hasCorrectFileExtension()
    {
        if (in_array(pathinfo($this->fileName, PATHINFO_EXTENSION), $this->extensions)) {
            return true;
        } else {
            $_SESSION["errors"] = "Niepoprawne rozszerzenie przesyłanego pliku!";
            return false;
        }
    }

public function hasCorrectSize(){
        if (filesize($this->path . $this->fileName) < 100000000)
            return true;
        else
            $_SESSION["errors"] = "Zbyt duży rozmiar przesyłanego pliku!";
            return false;
    }

public function uploadPhoto()
    {
        move_uploaded_file($this->file, $this->path . $this->fileName);
        $_SESSION["success"] = "Plik został przesłany!";
    }

在 HTML 代码中,我创建了 PHP 脚本来打印警报或成功消息。

<?php
        if(isset($_SESSION["errors"])){
            echo '<div class="alert alert-danger" role="alert">';
            echo $_SESSION["errors"];
            echo '</div>';
            unset($_SESSION["errors"]);
        }
        else if (isset($_SESSION["success"])){
            echo '<div class="alert alert-success" role="alert">';
            echo 'Zdjęcie zostało wysłane!';
            echo '</div>';
            unset($_SESSION["success"]);
        }
        ?>

在表单提交上传后总结工作正常并且警报/成功消息正确显示但是当我刷新页面后我仍然看到警报/成功消息尽管我使用了unset($_SESSION["errors")/unset($_SESSION["success"])

【问题讨论】:

  • header('add-photo.php'); 不正确 - 我认为您应该尝试 header('Location: add-photo.php');
  • 我试过了,但现在我什至在刷新页面之前都没有看到警报/成功消息

标签: php


【解决方案1】:

抱歉,无论如何,您没有尽快回复您的上一条消息 - 我重新创建了您的 Photo 类的近似值,以组合一个工作演示来说明文件上传后消息的显示。在随后的页面重新加载时,该消息不再可用,并且文件不会再次上传。

<?php

    session_start();

    if( $_SERVER['REQUEST_METHOD']=='POST' && !empty( $_FILES['file'] ) ){



        class Photo{
            /*********************************/
            /* approximation of actual Class */
            /*********************************/
            public function __construct(){
                $this->path=__DIR__ . '/images/';
                $this->extensions=['jpg','png','pjpeg','gif','webp'];
            }
            public function setFile($tmp){
                $this->file=$tmp;
            }
            public function setFileName($name){
                $this->fileName=$name;
            }
            public function hasCorrectFileExtension(){
                if( !in_array( pathinfo( $this->fileName, PATHINFO_EXTENSION), $this->extensions ) ) {
                    $_SESSION["errors"] = "Niepoprawne rozszerzenie przesyłanego pliku!";
                    return false;
                }
                return true;
            }
            public function hasCorrectSize(){
                if( filesize( $this->path . $this->fileName ) >= 100000000 ){
                    $_SESSION["errors"] = "Zbyt duży rozmiar przesyłanego pliku!";
                    return false;
                }
                return true;
            }           
            public function uploadPhoto(){
                move_uploaded_file($this->file, $this->path . $this->fileName);
                $_SESSION["success"] = "Plik został przesłany!";
            }
        }





        $photo = new Photo();
        $photo->setFile( $_FILES['file']['tmp_name'] );
        $photo->setFileName( $_FILES['file']['name'] );


        /*
            The various SESSION variables should be set by the
            following public methods.
        */
        if ( $photo->hasCorrectFileExtension() && $photo->hasCorrectSize() ){
            $photo->uploadPhoto();
        }



        # redirect to the same page to prevent accidental form re-submissions
        exit( header( sprintf( 'Location: %s', $_SERVER['SCRIPT_NAME'] ) ) );
    }
?>
<!DOCTYPE html />
<html>
    <head>
        <!-- head contents not shown -->
    </head>
    <body>

        <!-- HTML modified for clarity only -->
        <form method='POST' enctype='multipart/form-data'>
            <div>
                <label>Dodawanie zdjęcia
                    <input type='file' name='file' required />
                </label>
            </div>
            <button type='submit'>Dodaj zdjęcie</button>
        </form>


        <?php

            $svar='errors';
            if( !empty( $_SESSION[ $svar ] ) ){
                printf('
                    <div class="alert alert-danger" role="alert">%s</div>',
                    $_SESSION[ $svar ]
                );
                unset( $_SESSION[ $svar ] );
            }


            $svar='success';
            if( !empty( $_SESSION[ $svar ] ) ){
                printf('
                    <div class="alert alert-success" role="alert">%s</div>',
                    $_SESSION[ $svar ]
                );
                unset( $_SESSION[ $svar ] );
            }
        ?>
    </body>
</html>

【讨论】:

    【解决方案2】:

    使用

    session_unset()
    

    就在 PHP 关闭之前

    <?php
        if(isset($_SESSION["errors"])){
            echo '<div class="alert alert-danger" role="alert">';
            echo $_SESSION["errors"];
            echo '</div>';
        }
        else if (isset($_SESSION["success"])){
            echo '<div class="alert alert-success" role="alert">';
            echo 'Zdjęcie zostało wysłane!';
            echo '</div>';
        }
    session_unset();
        ?>
    

    或者如果您需要重置整个会话变量,只需调用

    session_destroy ();
    

    【讨论】:

    • 该函数从会话中删除所有变量,因此当我使用它时用户将被注销。
    • 好的,试试 unset($_SESSION["errors"]);并且未设置($_SESSION["success"]);就在 php 关闭之前。
    • 同样如此。也许这不起作用,因为当我尝试刷新页面时,我收到了再次确认提交表单的警报?
    • 将页面重定向到主页或仪表板
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多