在页面呈现期间发生一次插入

时间:2016-03-02 23:27:24

标签: php html mysql sql mysqli

我目前正在研究一个在发生任何事情之前进行基本输入的代码。这样它就可以在db中插入一些内容,这样我就可以提取该ID并插入该ID。这将创建一个自动保存类型的插入。

我在页面中有一些渲染调用,以确保正确提交信息,并发现自己在渲染和输入方面存在问题,因为渲染将导致插件被调用两次,而不是重定向页面。知道我怎么能让这个插入调用一次,并使代码按预期运行?

    /*
        NEW RECORD
    */
    // if the 'id' variable is not set in the URL, we must be creating a new record
    else
    {

                // insert null into database to create the save point
                if ($stmt = $mysqli->prepare("INSERT INTO test_table (name, email, notes) VALUES ('x', 'x', 'x')"))
                {
                    $stmt->execute();
                    $stmt->close();
                }
                // show an error if the query has an error
                else
                {
                    echo "ERROR: Could not prepare Auto-Save SQL statement.";
                }

                // gets id of null insert to update upon.
                $as_id = $mysqli->insert_id;
                printf ($as_id);

        // if the form's submit button is clicked, we need to process the form
        if (isset($_POST['submit']))
        {
            // get the form data
            $name = htmlentities($_POST['name'], ENT_QUOTES);
            $email = htmlentities($_POST['email'], ENT_QUOTES);
            $notes = htmlentities($_POST['notes'], ENT_QUOTES);

            // check that name, email are not empty.
            if ($name == '' || $email == '')
            {
                // if they are empty, show an error message and display the form
                $error = 'ERROR: Please fill in all required fields!';
                renderForm($name, $email, $notes, $error);
            }
            else
            {
                // insert the new record into the database
                if ($stmt = $mysqli->prepare("UPDATE test_table SET name=?, email=?, notes=? WHERE id=?"))
                {
                    $stmt->bind_param("ssss", $name, $email, $notes, $as_id);
                    $stmt->execute();
                    $stmt->close();
                }
                // show an error if the query has an error
                else
                {
                    echo "ERROR: Could not prepare SQL statement.";
                }

                // redirect the user
                header("Location: view.php");
            }           
        }
        // if the form hasn't been submitted yet, show the form
        else
        {
            renderForm();
        }
    }

    // close the mysqli connection
    $mysqli->close();
?>

1 个答案:

答案 0 :(得分:0)

请参阅标题()的PHP手册页,此处:http://php.net/manual/en/function.header.php

  

请记住,在任何实际输出之前必须调用header()   通过普通HTML标记,文件中的空行或PHP发送。

另外,实际上只有在所有验证都通过后才会发生插入。在你的脚本中,没有理由在此之前发生这种情况,除非你最终打算将$ as_id传递给renderForm() - 例如,允许外围表单在填充核心记录之前保存关系数据,但是这样是一个糟糕的模式。

正如您的代码所代表的那样,您的插入在呈现表单之前发生,并且在表单提交之后再次发生。每次用户验证失败并重新提交表单时都会再次出现。

那就是说,你可以通过交换它来得到你需要的结果:

printf ($as_id);

有这样的事情:

header('Location: view.php?id='.$as_id);

虽然,实现这样做,你永远不会碰到if(isset($_POST['submit'])) - 我假设你的代码块在你的“新记录”条件之外重复,可能是在“编辑记录”条件下或类似。

理想情况下,您希望完全放弃这种方法,支持使用RESTful路由的MVC风格的架构......