【问题标题】:An extra Sql record is being added everytime每次都添加一个额外的 Sql 记录
【发布时间】:2016-10-31 15:56:56
【问题描述】:

我正在开发一个聊天网络应用程序。问题是每当加载页面时,每次将空消息插入数据库。

代码如下

          <!--   Insert MySQL datbase into HTML     -->
<?php
$connection = mysqli_connect("localhost", "root", "", "tru");
$query = "SELECT * FROM shouts ORDER BY id Desc LIMIT 8";
$shouts = mysqli_query($connection, $query);
?>



                  <!--   Insert MySQL datbase into HTML     -->
     <?php while ($row = mysqli_fetch_assoc($shouts)) : ?>
      <li> <?php echo $row['shout']; ?> <b>&nbspSent at&nbsp</b><?php echo $row['Time']; ?></li>
          <?php endwhile; ?>

    </ul>
  </div>
  <footer>
      <form action="index.php" method="post">
      <label>Shout Text: </label>
      <input type="text" name="shout" placeholder="Enter your message here">
      <input type="submit" id="submit" value="SHOUT!" >
    </form>
      <?php 
                  <!--   Insert  into MySQL datbase     -->

$link = mysqli_connect("localhost", "root", "", "tru");
$sql = "INSERT INTO shouts (name,shout) VALUES ('$_POST[name]','$_POST[shout]')";
if(mysqli_query($link, $sql)){
echo "Records added successfully.";
} else
{
  echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
}

// close connection
mysqli_close($link);
?>   
</footer>
</div>
</body>
</html>

【问题讨论】:

  • 只有当你有一个INSERT INTO... 语句时,它才会在你的数据库中插入一个新行。您的代码完全按照您编写的方式执行。有什么问题?
  • @Dekel 是对的。每次重新加载页面时,都会执行您的 php 代码。您可能想在插入之前添加某种条件
  • 条件是什么@FranckNgako

标签: php sql chat message


【解决方案1】:
<?php 

if(isset($_POST["name"])){
    $link = mysqli_connect("localhost", "root", "", "tru");
    $sql = "INSERT INTO shouts (name,shout) VALUES ('$_POST[name]','$_POST[shout]')";
    if(mysqli_query($link, $sql)){
        echo "Records added successfully.";
    } 
    else
    {
        echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
    }

    // close connection
    mysqli_close($link);
}

使用 if 语句可以解决问题。如果 POST 名称变量 isset,它只会添加一条记录。

【讨论】:

  • 我想调试你的代码 ..1) 如果 isset 行 ['name'] 当前是 ['name'),请首先给出正确的结束括号 .2) 删除 我不知道 php 将如何解释它。 Bcas 这不是我们在 php 中 commnt 的方式。
  • 该错误已按照您告诉使用 isset 的方式删除。但除此之外,我还必须删除代码的最后一行 mysqli_close($link);否则会出现错误警告:mysqli_close() 期望参数 1 为 mysqli,在第 57 行的 C:\xampp\htdocs\tru\index.php 中给出 null ...我认为不关闭 mysqli 是一个坏习惯关联。你有什么办法解决这个@Eric Liebstreich
  • 顺便感谢您提供这个逻辑@Eric Liebsreich
  • 感谢您的建议@akashraigade
【解决方案2】:

你无条件地insert 一行,所以这是意料之中的。那么,应该是什么条件呢?自然,在页面加载时,您不想 insert 大喊大叫,只能在 POST 上。所以需要测试请求是否为post:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // insert the row
}

但是即使是POST,也需要测试是否有效,所以检查name并喊:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if ((isset($_POST["name"])) && (isset($_POST["shout"])) && ($_POST["name"]) && ($_POST["shout"])) {
        //insert the row
    }
}

请注意SQL injection

【讨论】:

  • 谢谢它现在可以工作了......但为此我必须删除最后一行关闭连接的代码。该行是警告:mysqli_close() 期望参数 1 为 mysqli,在第 57 行的 C:\xampp\htdocs\tru\index.php 中给出 null
  • @HNSingh,连接、插入和断开连接应该在此答案中显示的内容中,您的第二个问题是您尝试关闭未打开的连接。这发生在您在浏览器中加载页面时,if 条件为 false 并且 $link 未初始化。如果答案有帮助,您可以考虑点击复选标记接受它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
  • 1970-01-01
相关资源
最近更新 更多