每次刷新时 HTML 表格中的空白字段

Blank fields in HTML form every time I refresh

我知道这个问题已被问过数千次,但我找不到适合我的情况的解决方案。我尝试仅在按下提交按钮并且 none 字段为空白时才与数据库建立连接。但每次刷新后空白行不断出现。而且,如果我不再次提交表单,每次刷新后内容重复的行。如果我不 'renew' 通过表单提交,$_POST 似乎会通过刷新来保持数据。

这是我的代码。我真的非常感谢任何帮助。

<?php
$nombre = $titulo = $texto = $fecha = "";
$mensajeEnvio = $mensajeError = ""; 

if ( $_SERVER['REQUEST_METHOD'] == 'POST'){
    if ((isset($_POST["submit-comentario"])) && (!empty($_POST["nombre"])) && (!empty($_POST["titulo"])) && (!empty($_POST["texto"]))){

        $nombre=$_POST['nombre'];
        $titulo=$_POST['titulo'];
        $fecha=$_POST['fecha'];
        $texto=$_POST['texto'];

        // Create connection
        $conn = mysqli_connect($servername, $username, $password, $dbname);
        // Check connection
        if (!$conn) {
            die("Connection failed: " . mysqli_connect_error());
        } else {
            $sql = "INSERT INTO foro (usuario_comentario, titulo_comentario, fecha_comentario, texto_comentario) VALUES ('$usuario', '$titulo', '$fecha', '$texto')";
        }

        if (mysqli_query($conn, $sql)) {
            $mensajeEnvio= "Tu comentario se ha enviado correctamente. ¡Gracias por participar!";
        } else {
            $mensajeError= "Ha habido un problema. Por favor, vuelve a publicar tu comentario. ";   
        }

        mysqli_close($conn);
    }
} else {
    $mensajeError= "Por favor, rellena todos los campos y vuelve a publicar."; 
}

这是表格,紧跟在 php 代码之后。

<form method="POST" action="<?php echo htmlspecialchars($_SERVER['REQUEST_URI']);?>" id="formulario-foro">
    <input name="nombre" type="text" id="usuario" placeholder="Nombre" /><br>
    <textarea name="titulo" style="width: 100%; height: 23px"id="titulo" placeholder="Título" /></textarea><br>
    <textarea name="texto" style="width: 100%; height: 150px" placeholder=" Tu comentario..." id="texto" /></textarea><br>
    <input type="hidden" name="fecha" id="fecha" value="<?php echo $mysqldate?>"/>
    <input type="submit" name="submit-comentario" value="Publicar">  
    <div class="mensaje-envio"><?php echo $mensajeEnvio; ?></div> 
    <div class="mensaje-error"><?php echo $mensajeError; ?></div> 
</form>

也许你可以使用这个小技巧,

      <form action="" method='POST'  
onsubmit="this.submit(); this.reset(); return false;">

您可以使用会话密钥进行检查。

为此,您首先需要创建一个随机会话密钥并将其存储在会话变量中。还将此值作为表单中的隐藏元素提供。 插入时可以检查隐藏元素中的值是否与会话密钥相同,然后插入。否则通过错误消息。成功插入后再次重置会话密钥。

将其放在 php 开头

session_start();function get_session_key(){$randomId=microtime(true).uniqid(); $_SESSION['unique_id']=$randomId; return $randomId; }

然后将您的 if 条件更改为

if ((isset($_POST["submit-comentario"])) && (!empty($_POST["nombre"])) && (!empty($_POST["titulo"])) && (!empty($_POST["texto"]))&&$_SESSION['unique_id']==$_POST['unique_id']){

插入后添加以下行。

if (mysqli_query($conn, $sql)) { //Reset the seeion key $_SESSION['unique_id'] = "";

然后在您的表单中添加以下行

<input type="hidden" name="unique_id" value="<?php echo get_session_key();?>"/>

希望对您有所帮助。

我认为防止刷新的最佳方法如下:

  1. 用户提交表单
  2. 将所有POST数据放入一个SESSION变量

    $_SESSION['post_data'] = $_POST;

  3. 取消设置 $_POST 数据

    未设置($_POST);

  4. 重定向到 same/new 页面并检查 $_POST

    的 SESSION['post_data']

    if (isset($_SESSION['post_data']) && is_array($_SESSION['post_data']) && count($ _SESSION['post_data'])>0) { // ... 做你的查询 取消设置($_SESSION['post_data']); // 重定向 header("Location: ....");

    }

这样您的用户将无法刷新和 re-post 表单。当他们使用上一个按钮时,表单将是空的,$_POST 将不会被填充。

在您成功将数据保存到数据库后,您需要的是 POST-to-GET 重定向。这样,如果用户刷新页面,他刷新的是 GET 请求,而不是用于存储信息的 POST。

if (mysqli_query($conn, $sql)) {
    // Success!
    header('Location: ' . $_SERVER['REQUEST_URI']);
    // Prevent further processing
    return;
} else {
    $mensajeError= "Ha habido un problema. Por favor, vuelve a publicar tu comentario. ";   
}

当然你也可以重定向到另一个页面and/or添加一些东西来显示消息(使用会话,或通过 GET 参数)。

谢谢大家的想法。我终于解决了这个问题,其实是两个问题。

首先,我使用 user3535945 会话建议来防止在发送表单后每次刷新时重复行。

但是空白行不断出现,直到我发现我正在我的 wordpress 层次结构中从属于这个页面的页面中建立另一个数据库连接,并将空白表单数据发送到 mysql。我删除了页面,现在一切正常!!!

这是一个愚蠢的错误,但我想把它留在这里以防它对其他人有帮助。