每次刷新表单时都会添加额外的记录


Extra records are being added everytime the form is refreshed

我用来通过php将产品信息插入mysql的代码是这样的。

<?php include 'dbconnect.php'; ?>
<head>
</head>
<body>
    <form method="post" action="<?php echo $_SERVER["PHP_SELF"]?>">
    <input type="text" name="product_name"/>
    <input type="text" name="product_price" />
        <select name="product_cat">
        <?php
        $results = $connect->query("SELECT * FROM categories ORDER BY cat_name");
            while($row = $results->fetch_array()) {
            extract($row);
            echo "<option value='"."{$cat_id}"."'>"."{$cat_name}"."</option>";
            }  
        $results->free();
        ?>
        </select>
    <input type="submit" name="submit" value="Submit">
    </form>
    <?php   
    if($_POST){
    $sql = "INSERT INTO products (prd_name, prd_price) VALUES(?,?)";
    if($stmt = $connect->prepare($sql) )
        {
            $productname = $_POST['product_name'];
            $productprice = $_POST['product_price'];
            $categoryid = $_POST['product_cat'];
            $stmt->bind_param("si", $productname, $productprice);
        if($stmt->execute())
            {
                $lastid = $stmt->insert_id;
                $productsku = "PR".$productlastid;
                $insert_row = $connect->query("INSERT INTO categoryproducts (CategoryId, productId) VALUES ($categoryid, $lastid)");
                $insert_row = $connect->query("UPDATE products SET productSku = '".$productsku."' WHERE productId =".$productlastid."");
                echo "Created";
                $stmt->close();
            }else{
                    die("Unable to create category.");
                }
                }else{
                die("Unable to prepare statement.");
            }
                $connect->close();
            }
        ?>    
</body>
</html>

代码运行良好,正如我所希望的那样,但每次保存记录并刷新表单后,都会在表categoryproducts中创建一个额外的记录。我的最佳猜测是,在语句执行之后,问题就在这里

if($stmt->execute())
        {
            $lastid = $stmt->insert_id;
            $productsku = "PR".$productlastid;
            $insert_row = $connect->query("INSERT INTO categoryproducts (CategoryId, productId) VALUES ($categoryid, $lastid)");
            $insert_row = $connect->query("UPDATE products SET productSku = '".$productsku."' WHERE productId =".$productlastid."");
            echo "Created";
            $stmt->close();
        }else{
                die("Unable to create category.");
            }
            }else{
            die("Unable to prepare statement.");
        }
            $connect->close();
        }

我想我需要在提交表格后关闭某个地方的连接。有人能帮忙吗?

不要使用if($_POST){,而是使用带有标题的if(isset($_POST['submit'])){重定向到同一页或您选择的另一页。

即:并使用ob_start();,这将防止获得
Cannot modify header information - headers already sent by...

<?php 
ob_start();
?>
<?php include 'dbconnect.php'; ?>
// ... 
<?php 
if(isset($_POST['submit'])){
    $sql = "INSERT INTO products (prd_name, prd_price) VALUES(?,?)";
    if($stmt = $connect->prepare($sql) )
        {
            $productname = $_POST['product_name'];
            $productprice = $_POST['product_price'];
            $categoryid = $_POST['product_cat'];
            $stmt->bind_param("si", $productname, $productprice);
        if($stmt->execute())
            {
                $lastid = $stmt->insert_id;
                $productsku = "PR".$productlastid;
                $insert_row = $connect->query("INSERT INTO categoryproducts (CategoryId, productId) VALUES ($categoryid, $lastid)");
                $insert_row = $connect->query("UPDATE products SET productSku = '".$productsku."' WHERE productId =".$productlastid."");
                // echo "Created";
                $stmt->close();
                header("Location: this_page.php");
                exit;
            }else{
                    die("Unable to create category.");
                }
                }else{
                die("Unable to prepare statement.");
            }
                $connect->close();
            } // brace for if(isset($_POST['submit']))
?>

您还可以考虑使用Ajax,或者使用两个不同的文件,一个用于表单,另一个用于带有头重定向的PHP/SQL。