我知道这个问题已被问过几千次,但我无法找到解决方案。我只是在按下提交按钮且没有任何字段为空时尝试建立与数据库的连接。但是每次刷新后都会出现空白行。此外,如果我不再次提交表单,则每次刷新后内容都会重复。似乎$ _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>
答案 0 :(得分:0)
可能你可以使用这个小黑客,
<form action="" method='POST'
onsubmit="this.submit(); this.reset(); return false;">
答案 1 :(得分:0)
您可以使用会话密钥进行检查。
首先,您需要创建一个随机会话密钥并将其存储在会话变量中。还将此值作为表单中的隐藏元素提供。 在插入过程中,您可以检查隐藏元素中的值是否与会话密钥相同,然后插入。否则通过错误消息。成功插入后,再次重置会话密钥。
将其放在php start
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();?>"/>
希望它有所帮助。
答案 2 :(得分:0)
我认为防止刷新的最佳方法如下:
将所有POST数据放入SESSION变量
$ _ SESSION ['post_data'] = $ _POST;
取消设置$ _POST数据
未设置($ _ POST);
重定向到相同/新页面并检查SESSION ['post_data']是否已安装$ _POST
if(isset($ _ SESSION ['post_data'])&amp;&amp; is_array($ _ SESSION ['post_data'])&amp;&amp; count($ _ SESSION ['post_data'])&gt; 0){ // ...做你的查询 未设置($ _ SESSION [ 'post_data']); //重定向 标题(“位置:......”);
}
这样您的用户就无法刷新并重新发布表单。当他们使用上一个按钮时,表单将为空,$ _POST将不会被填充。
答案 3 :(得分:0)
在成功保存数据库中的数据后,您需要的是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. ";
}
当然,您也可以重定向到另一个页面和/或添加一些内容来显示消息(使用会话或通过GET参数)。
答案 4 :(得分:0)
谢谢大家的意见。我终于解决了这个问题,实际上是两个问题。
首先,我使用了user3535945会话建议,以防止在发送表单后每次刷新时行重复。
但是空白的行一直出现,直到我发现我在一个页面中建立了另一个数据库连接,该页面在我的wordpress层次结构中从属于这个,并且正在向mysql发送空白表单数据。我删除了页面,现在一切正常!
这是一个愚蠢的错误,但我想留在这里,以防它帮助其他人。