【问题标题】:Table content keeps adding when refreshing PHP page刷新PHP页面时表格内容不断增加
【发布时间】:2013-11-06 05:51:25
【问题描述】:

我在使用 PHP 向数据库添加内容时遇到问题。每次我刷新页面时,它都会再次添加完全相同的值。我怎样才能让它停止这样做?我不知道为什么会这样。

我希望它一次将值添加到数据库中并将它们存储在那里。创建表并添加值后,将在页面上使用它们。用户将能够添加更多值。

它还会添加用户在刷新时输入的任何内容。

有问题的部分是

$db_query = 'INSERT INTO `cars`' .
    ' (`id`, `make`, `model`, `year`, `color`, `engine`)' .
    ' VALUES' .
    ' (NULL, \'Citroen\', \'Saxo\', \'1997\', \'White\', 1.1),' .
    ' (NULL, \'Citroen\', \'C3\', \'2012\', \'Blue\', 1.4),' .
    ' (NULL, \'Volkswagen\', \'Golf\', \'2010\', \'Blue\', 1.8),' .
    ' (NULL, \'Ford\', \'Mondeo\', \'2009\', \'Black\', 1.6),' .
    ' (NULL, \'Renault\', \'Clio\', \'2010\', \'Silver\', 1.2);';
$result = mysqli_query($conn, $db_query);

完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Task 7</title>
</head>
<body>
<?php


# Connection to the database start
$host = 'localhost';
$user = 'root'; # Your username
$password = 'vertrigo'; # Your password
$databaseName = 'db2'; # Your database

$conn = mysqli_connect($host, $user, $password, $databaseName);

if (mysqli_connect_errno($conn)) {
    echo 'Failed to connect to MySQL: ' . mysqli_connect_error();
} else {
    echo 'have connection<br>';
}
# Connection to the database end (output messages created)


# Creating the table with rows start
$db_query = 'CREATE TABLE IF NOT EXISTS `cars` (' .
    '`id` int(11) NOT NULL AUTO_INCREMENT,' .
    '`make` varchar(50) NOT NULL,' .
    '`model` varchar(50) NOT NULL,' .
    '`year` varchar(4) NOT NULL,' .
    '`color` varchar(50) NOT NULL,' .
    '`engine` decimal(2,1) NOT NULL,' .
    'PRIMARY KEY (`id`));';
$result = mysqli_query($conn, $db_query);
# Creating table with rows end


# Putting information in each column start
$db_query = 'INSERT INTO `cars`' .
    ' (`id`, `make`, `model`, `year`, `color`, `engine`)' .
    ' VALUES' .
    ' (NULL, \'Citroen\', \'Saxo\', \'1997\', \'White\', 1.1),' .
    ' (NULL, \'Citroen\', \'C3\', \'2012\', \'Blue\', 1.4),' .
    ' (NULL, \'Volkswagen\', \'Golf\', \'2010\', \'Blue\', 1.8),' .
    ' (NULL, \'Ford\', \'Mondeo\', \'2009\', \'Black\', 1.6),' .
    ' (NULL, \'Renault\', \'Clio\', \'2010\', \'Silver\', 1.2);';
$result = mysqli_query($conn, $db_query);
# Putting information at each end


# Add cars START
@$cars = $_POST['cars'];
if (isset($cars)) {
    $db_query = "INSERT INTO cars (make, model, year, color, engine) VALUES ('" . $cars['0'] . "','" . $cars['1'] . "','" . $cars['2'] . "','" . $cars['3'] . "','" . $cars['4'] . "')";
    mysqli_query($conn, $db_query);
} else {
    echo 'Cars array does not exists and obtained from FORM.';
}
# Add cars END


# Select the cars table if the right output the headers start
$db_query = "SELECT * FROM cars WHERE id <> 0 ORDER BY year ASC";

if ($result = mysqli_query($conn, $db_query)) {
    echo  "    <table border='1'>";
    echo  "        <tr><td>Make</td><td>Year</td><td>model</td><td>color</td><td>engine</td></tr>";
    # Select cars table if the right output the headers end

    # while start, output the content of the column.
    while ($row = mysqli_fetch_assoc($result)) {
    ?>
        <tr>
            <td><?php echo $row['make']; ?></td>
            <td><?php echo $row['year']; ?></td>
            <td><?php echo $row['model']; ?></td>
            <td><?php echo $row['color']; ?></td>
            <td><?php echo $row['engine']; ?></td>
        </tr>
    <?php
    }
    # End while

    echo "</table>";
}
?>
    <form action="index.php" method="post" name="zatupok">
        <fieldset>
            <legend>MY CARS</legend>
            <label>Make</label>
            <input type="text" name="cars[]">
            <label>Model</label>
            <input type="text" name="cars[]">
            <label>Year</label>
            <input type="text" name="cars[]">
            <label>Color</label>
            <input type="text" name="cars[]">
            <label>Engine</label>
            <input type="text" name="cars[]">
            <input type="submit">
        </fieldset>
    </form>
</body>
</html>

【问题讨论】:

  • 我想你的答案在这里stackoverflow.com/questions/5166178/…
  • 好像是这样。我确实很难找到确切的放置位置。我是 PHP 的新手,正在做自己的研究。你能帮我看看把它放在哪里吗?我上传了我的整个代码。
  • 好吧。背后的故事真的很长很毛骨悚然。我正在进行自学,并在请求创建 PHP 的地方创建一个 SQL 表,然后可以执行简单的语句,如 EDIT UPDATE DELETE 等。它也必须在类中而不是在一个文件中。这只是我第一次尝试在 PHP 中创建连接。此链接将使您对正在发生的事情有更多了解。希望能有所帮助。是的,我不知道如何在它工作后将其转移到课程中。 stackoverflow.com/questions/19588347/…
  • 以同样的方式继续,不要介意刷新页面,因为这就是 HTTP 请求的工作原理。

标签: php sql database page-refresh


【解决方案1】:

为什么在每次访问页面时都添加示例值

每次访问该页面时都会执行您的 PHP 代码。它生成页面(动态写入其中的一部分,只复制&lt;?php … ?&gt; 之外的所有内容),并且页面是脚本的输出。 Apache 或您使用的任何服务器软件,只需获取 HTTP 请求,执行您的脚本,获取其输出并以 HTTP 响应的形式将其发送到客户端。

如果您的INSERT 查询是无条件执行的(按原样执行),那么您每次访问该页面时也会执行该查询。这就是为什么要一遍又一遍地添加这些值。

如何停止添加样本值

您可能想检查cars 表是否已创建并仅在创建时执行插入查询:

# Creating the table with rows start
# CHANGED: Notice that IF NOT EXISTS is not used anymore!
#          Fails if the table already exists, not touching its original contents.
$db_query = 'CREATE TABLE `cars` (' .
    '`id` int(11) NOT NULL AUTO_INCREMENT,' .
    '`make` varchar(50) NOT NULL,' .
    '`model` varchar(50) NOT NULL,' .
    '`year` varchar(4) NOT NULL,' .
    '`color` varchar(50) NOT NULL,' .
    '`engine` decimal(2,1) NOT NULL,' .
    'PRIMARY KEY (`id`));';
$result = mysqli_query($conn, $db_query);
# Creating the table with rows end


# Putting information in each column start
$db_query = 'INSERT INTO `cars`' .
    ' (`id`, `make`, `model`, `year`, `color`, `engine`)' .
    ' VALUES' .
    ' (NULL, \'Citroen\', \'Saxo\', \'1997\', \'White\', 1.1),' .
    ' (NULL, \'Citroen\', \'C3\', \'2012\', \'Blue\', 1.4),' .
    ' (NULL, \'Volkswagen\', \'Golf\', \'2010\', \'Blue\', 1.8),' .
    ' (NULL, \'Ford\', \'Mondeo\', \'2009\', \'Black\', 1.6),' .
    ' (NULL, \'Renault\', \'Clio\', \'2010\', \'Silver\', 1.2);';
# CHANGED: Executing the query only if previous query (`CREATE TABLE …`) succeeded.
if ($result) {
    $result = mysqli_query($conn, $db_query);
}
# Putting information at each end

POST 问题后刷新

我们在调试过程中遇到的另一个问题是 POST 表单提交后刷新。浏览器会自动再次提交原始表单内容,这是标准行为。它导致将提交的值再次插入数据库,现在将它们存储在两个甚至更多副本中。

不过,这是可以避免的。参见例如Stop browsers asking to resend form data on refresh。接受的答案建议使用 POST-redirect-GET 模式,这就是我将在您的情况下使用的模式。当googling post data resent stackoverflow 时,您可以获得更多关于该主题的信息。

【讨论】:

  • @user2919681 你需要做的是将你的表单和你的数据库代码分开设置。另外,如果您想按原样运行代码,那么我建议您在开头和数据库凭据下添加一个if(isset($_POST['submit'])),然后将您的提交按钮命名为&lt;input type="submit" name="submit"&gt; 这样它只会在以下情况下执行提交按钮被按下;这就是你的答案。
  • @Fred-ii- 可能 user2919681 只是想确保桌子在那里。该脚本应在手动删除时设置表并用示例数据填充它。 CREATE TABLE 在创建 MySQL 中已经存在的表时会产生错误,因此不会覆盖任何数据。 IF NOT EXISTS 只是抑制了错误,然后无法检测到表是否已经创建。
  • @Palec 我怀疑向数据库添加值的意图是一次性。我明白你在说什么,但是 OP 的设置没有任何意义,应该使用条件来代替。使用if(isset($_POST['submit'])) 是原始问题的部分解决方案。
猜你喜欢
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 2011-02-23
相关资源
最近更新 更多