我目前正在研究一个在发生任何事情之前进行基本输入的代码。这样它就可以在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();
?>
答案 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风格的架构......