我正在尝试创建一个多步骤表单,用户将在page1.php上填写表单,并通过提交可以转到page2.php到下一个'表单'。什么是最简单的方法?
这是我的代码:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
?>
<form id="pdf" method="post">
New project name:<input type="text" name="pr_name" placeholder="new project name..."><br/>
New project end date:<input id="datepicker" type="text" name="pr_end" placeholder="yyyy-mm-dd..."><br/>
<textarea class="ckeditor" name="pagecontent" id="pagecontent"></textarea>
<?php
if ($_POST["pr_name"]!="")
{
// data collection
$prname = $_POST["pr_name"];
$prend = $_POST["pr_end"];
$prmenu = "pdf";
$prcontent = $_POST["pagecontent"];
//SQL INSERT with error checking for test
$stmt = $pdo->prepare("INSERT INTO projects (prname, enddate, sel, content) VALUES(?,?,?,?)");
if (!$stmt) echo "\nPDO::errorInfo():\n";
$stmt->execute(array($prname,$prend, $prmenu, $prcontent));
}
// somehow I need to check this
if (data inserted ok) {
header("Location: pr-pdf2.php");
}
}
$sbmt_caption = "continue ->";
?>
<input id="submitButton" name="submit_name" type="submit" value="<?php echo $sbmt_caption?>"/>
</form>
我已经更改了Marc的建议,但我不知道如何检查SQL INSERT是否正常。 可以给别人一些暗示吗?
提前致谢
安德拉什
解决方案因为我无法回答我的问题(超时:):
这是我的最终代码,可能有点简单,但它可以工作,有可能在以后检查和升级。感谢大家特别是Marc。
<form id="pdf" method="post" action="pr-pdf1.php">
New project name:<input type="text" name="pr_name" placeholder="new project name..."><br/>
Email subject:<input type="text" name="pr_subject" placeholder="must be filled..."><br/>
New project end date:<input id="datepicker" type="text" name="pr_end" placeholder="yyyy-mm-dd..."><br/>
<textarea class="ckeditor" name="pagecontent" id="pagecontent"></textarea>
<?php
include_once "ckeditor/ckeditor.php";
$CKEditor = new CKEditor();
$CKEditor->basePath = 'ckeditor/';
// Set global configuration (will be used by all instances of CKEditor).
$CKEditor->config['width'] = 600;
// Change default textarea attributes
$CKEditor->textareaAttributes = array(“cols” => 80, “rows” => 10);
$CKEditor->replace("pagecontent");
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
// data collection
$prname = $_POST["pr_name"];
$prsubject = $_POST["pr_subject"];
$prend = $_POST["pr_end"];
$prmenu = "pdf";
$prcontent = $_POST["pagecontent"];
//SQL INSERT with error checking for test
$stmt = $pdo->prepare("INSERT INTO projects (prname, subject, enddate, sel, content) VALUES(?,?,?,?,?)");
// error checking
if (!$stmt) echo "\nPDO::errorInfo():\n";
// SQL command check...
if ($stmt->execute(array($prname, $prsubject, $prend, $prmenu, $prcontent))){
header("Location: pr-pdf2.php");
}
else{
echo"Try again because of the SQL INSERT failing...";
};
}
$sbmt_caption = "continue ->";
?>
<input id="submitButton" name="submit_name" type="submit" value="<?php echo $sbmt_caption?>"/>
</form>
答案 0 :(得分:1)
使用您要转到的网址添加属性action
。在这种情况下,它将是
<form id="pdf" method="post" action="page2.php">
答案 1 :(得分:1)
您应该将操作保留在同一个脚本中,因此仍然会执行POST操作,然后在处理完成后使用header("Location: page2.php");
重定向。
答案 2 :(得分:0)
你可能最好将php代码与表单分开。将php代码放在名为submit.php的文件中,将表单操作设置为等于submit.php,然后将行header('Location: whateverurl.com');
添加到您的代码中。
答案 3 :(得分:0)
将已发布的字段保存在隐藏的输入字段中,但每次用户提交表单的另一个步骤时都不要忘记验证它们,因为用户可能会更改源代码中的隐藏输入。
<input type="hidden" name"some_name" value="submitted_value"/>
答案 4 :(得分:0)
这样的基本结构可以做到:
form1.php:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
... process form data here ...
if (form data ok) {
... insert into database ...
}
if (data inserted ok) {
header("Location: form2.php");
}
}
?>
... display page #1 form here ...
然后为每个后续页面提供相同的基本结构。始终将表单提交回它来自的页面,如果一切正常,则重定向到下一页。
答案 5 :(得分:0)
最简单的方法是通过赋予表单属性action =“page2.php”将其发布到form2.php。但那里存在风险。这意味着form2必须解析form1的已发布数据。此外,如果数据错误(验证)必须显示form1而不是form2。这将使您的代码变得复杂并在两种形式之间创建依赖关系。
所以更好的解决方案(也很简单)就是实现post-redirect-get模式。
您发布到form1,验证所有数据并存储它。如果数据正常,则重定向到form2。如果数据错误,您只需再次显示form1。
重定向由标题:
完成// Officially you'll need a full url in this header, but relative paths
// are accepted by all browsers.
header('Location: form2.php');
答案 6 :(得分:0)
在步骤之间跳转时,有几种方法可以处理提交的数据。 你会发现/反对将数据写入会话,数据库,以及在每一步之后是否......的原因。
我做了以下方法: 表单总是包含一整套输入元素,但在第1页上,步骤2元素被隐藏......以及其他方式。
我用这种方式构建了一个6步向导。一个大模板,一些用于验证输入的JS / Ajax,用于保存当前步骤ID和PHP决定的其他隐藏输入,显示或隐藏哪些字段。
我认为合适:只要输入完好无损,数据就可以轻松保存。如果用户在步骤1之后中止,则不进行垃圾处理。
答案 7 :(得分:0)
我会将它全部存储在会话数组(或子数组)
中一个非常粗略的例子,我将所有表单名称保存到数组中(当然稍后要检查):
<?
foreach($_POST as $k => $v){
$session['register'][$k]=$v;}
?>