【问题标题】:An issue being encountered on post displaying system帖子显示系统遇到的问题
【发布时间】:2021-12-20 05:31:08
【问题描述】:

所以,我有这个系统,您可以在其中发帖。因此,它的工作原理是,有一个输入字段,无论您在输入字段中键入什么,然后单击发布,它将作为输入发送到数据库并被发布。将显示该帖子。但是,在我当前的系统中,在输入字段中输入内容并单击帖子后,该条目会发送到数据库,但帖子实际上并未显示。要显示它,您需要再次刷新页面,然后它会显示该页面,并且两个条目会进入数据库。

我不希望这种情况发生。当用户在输入字段中输入文本并单击帖子时,帖子应该随时显示,您不必刷新帖子即可显示,并且应该只将一个条目发送到数据库,而不是两个。现在,我不会包括我的数据库连接和我的插入语句,但这里是显示帖子的代码:

<div class="textPost">
  <?php

  $sql = "SELECT * FROM posts";
  $result = mysqli_query($connection, $sql);
  if (mysqli_num_rows($result) > 0) {
    while ($row = mysqli_fetch_assoc($result)) {

  ?>
  <div class="textpostFormat">
    // all the displayed post content
  </div>
  <?php

  }
}

  ?>
</div>

插入语句(post.php):

<?php

session_start();

// Making Connection To The Database

$dbHost = "localhost";
$dbUser = "root";
$dbPass = "root";
$database = "feed";

$connection = mysqli_connect($dbHost, $dbUser, $dbPass, $database) or die ("Sorry, we could not connect to the database");

// Posting System

if (!empty($_POST['postContent'])) {
  $post = $_POST['postContent'];
  $firstname = $_SESSION['firstname'];
  $lastname = $_SESSION['lastname'];

  $sql = "INSERT INTO posts (firstname, lastname, body, date_posted) VALUES (?, ?, ?, NOW())";
  $stmt = mysqli_stmt_init($connection);
  // nested if statement
  if (!mysqli_stmt_prepare($stmt, $sql)) {
    echo "";
  } else {
    mysqli_stmt_bind_param($stmt, "sss", $firstname, $lastname, $post);
    mysqli_stmt_execute($stmt);
  }
} else {
  echo "";
}

?>

我应该怎么做才能解决这个问题?请帮忙。

【问题讨论】:

  • 您正在通过 AJAX/FORM 保存帖子?
  • 如何提交表格?这会导致页面刷新吗?从它的声音来看...所以我们需要查看您的实际页面代码。
  • 在你的 php 脚本的最后一行使用重定向来刷新你的页面。
  • @AliBabaAzimi 怎么样?你能解释一下代码的位置和内容吗?
  • 伙计们,我没有任何 AJAX 来防止或导致通过 AJAX 刷新页面。现在,正如@AliBabaAzimi 所建议的那样,我可以在我的 PHP 脚本的最后一行中使用重定向来自动刷新我的页面。那么,我怎么能这样做。但是,一个限制是,如果我再次刷新,同一个帖子的多个条目不会被发送到数据库吗?

标签: php


【解决方案1】:

这是我在评论中简要描述的“一个 php 脚本/自我发布”模式的大纲。

要了解的重要一点是,如果您有一个没有任何操作的表单,该页面将提交给它自己。您还需要了解不同的 HTTP 请求类型:特别是“GET”与“POST”。

最后但同样重要的是,您必须清楚 HTTP 请求/响应的工作原理。当你的页面被渲染并且它上面有一个表单时,除非你通过与页面的交互来创建某种事件,否则不会发生任何新的事情。如果您不了解 HTTP 请求的工作原理,我鼓励您了解它们,否则您将在 Web 开发中遇到困难。

<?php
// somepage.php
session_start();
// db includes etc. here.

if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['postContent']) {
   // Move all your database update code here.
   // This will only run if it posted.
}
?>
// Include your HTML header that actually starts your html
<!DOCTYPE html>
<form method="post">
  <input id="postContent" name="postContent" etc.>
</form>
<div class="textPost">
  <?php

  $sql = "SELECT * FROM posts";
  $result = mysqli_query($connection, $sql);
  if (mysqli_num_rows($result) > 0) {
    while ($row = mysqli_fetch_assoc($result)) {

  ?>
  <div class="textpostFormat">
    // all the displayed post content
  </div>
  <?php

  }
}

  ?>
</div>

【讨论】:

  • 如果他们在表单提交后更新页面,这仍然会继续添加重复项。
  • @M.Eriksson 是的。
  • 表单提交后页面会显示新更新的数据。它不会“刷新”并添加重复项。如果您使用返回按钮再次使用相同的数据重新提交表单,它不会在帖子中包含,您可以获得重复,但这是完全不同的问题。
【解决方案2】:

我认为共享您提交数据的表单代码会更好。无论如何,我猜你需要在脚本完成后重定向。在 PHP 中,您可以使用标头重定向到新页面,如下所示:

index.php

<div class="textPost">

<form method="post" action="post.php">
    <input type="text" name="firstname">
    <input type="text" name="lastname">
    <input type="text" name="postContent">
    <input type="submit">
</form>


<?php

$dbHost = "localhost";
$dbUser = "root";
$dbPass = "root";
$database = "feed";

$connection = mysqli_connect($dbHost, $dbUser, $dbPass, $database) or die("Sorry, we could not connect to the database");


$sql = "SELECT * FROM posts";
$result = mysqli_query($connection, $sql);
if (mysqli_num_rows($result) > 0) {
   while ($row = mysqli_fetch_assoc($result)) {
?>
<div class="textpostFormat">
  // all the displayed post content
</div>
<?php
    }
}

?>
</div>

post.php

<?php

session_start();

// Making Connection To The Database

$dbHost = "localhost";
$dbUser = "root";
$dbPass = "root";
$database = "feed";

$connection = mysqli_connect($dbHost, $dbUser, $dbPass, $database) or die ("Sorry, we could not connect to the database");

// Posting System

if (!empty($_POST['postContent'])) {
  $post = $_POST['postContent'];
  $firstname = $_SESSION['firstname'];
  $lastname = $_SESSION['lastname'];

  $sql = "INSERT INTO posts (firstname, lastname, body, date_posted) VALUES (?, ?, ?, NOW())";
  $stmt = mysqli_stmt_init($connection);
  // nested if statement
  if (!mysqli_stmt_prepare($stmt, $sql)) {
    echo "";
  } else {
    mysqli_stmt_bind_param($stmt, "sss", $firstname, $lastname, $post);
    mysqli_stmt_execute($stmt);
    header("Location: /");
    exit();
  }
} else {
  echo "";
}

?>

如果您需要更多指导,请告诉我。

【讨论】:

  • 好的,我应该在哪里添加这段代码?
  • 在你的sql语句成功执行之后,在mysqli_stmt_execute($stmt)之后,就在你的'else'部分。
  • 好的,我把它放在那里。没用。
  • 如果您的主页是 index.php,上面的代码可以正常工作。它对我有用,请再试一次。
  • 我在我的 post.php 中尝试了与您完全相同的方式,但没有奏效。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
相关资源
最近更新 更多