每次刷新时 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();?>"/>
希望对您有所帮助。
我认为防止刷新的最佳方法如下:
- 用户提交表单
将所有POST数据放入一个SESSION变量
$_SESSION['post_data'] = $_POST;
取消设置 $_POST 数据
未设置($_POST);
重定向到 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。我删除了页面,现在一切正常!!!
这是一个愚蠢的错误,但我想把它留在这里以防它对其他人有帮助。
我知道这个问题已被问过数千次,但我找不到适合我的情况的解决方案。我尝试仅在按下提交按钮并且 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();?>"/>
希望对您有所帮助。
我认为防止刷新的最佳方法如下:
- 用户提交表单
将所有POST数据放入一个SESSION变量
$_SESSION['post_data'] = $_POST;
取消设置 $_POST 数据
未设置($_POST);
重定向到 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。我删除了页面,现在一切正常!!!
这是一个愚蠢的错误,但我想把它留在这里以防它对其他人有帮助。