这里有zombat与代码示例解决方案的一些阐述。
我通常将表单发布到同一个控制器/方法。然后我让$ this-> form_validation-> run()处理所有肮脏的工作。如果$ _POST数据存在,验证器会检查规则。如果它通过,我将它们重定向到一个成功页面,否则会在重新填写的表单中显示验证错误。
class Contact extends CI_Controller {
function __construct() {
parent::__construct();
}
function index() {
/*
the foreach() line makes each field visible
to form_validation so we can reliably
repopulate (using set_value, set_checkbox,
etc) fields that have no validation rules
example: since 'phone' has no rules, we would
not be able to repopulate that field if
validation failed
*/
foreach ($_POST as $key => $value) $this->form_validation->set_rules($key, '', '');
$this->form_validation->set_rules('first_name', 'First Name', 'required|min_length[2]');
$this->form_validation->set_rules('last_name', 'Last Name', 'required|min_length[2]');
$this->form_validation->set_rules('email', 'Email Address', 'required|strtolower|valid_email');
if ($this->form_validation->run() == FALSE) {
$this->load->view('contact_form');
} else {
/*
save form data, email it, etc
then redirect the user so they
cannot re-submit the same data
*/
redirect('contact/success');
}
}
function success() {
$this->load->view('contact_success');
}
}
示例HTML应用程序/视图/ contact_form.php
<form method="post" action="<?php echo current_url(); ?>">
<table>
<tr>
<td>First Name</td>
<td><?php echo form_input('first_name', set_value('first_name')); ?>
<?php echo form_error('first_name'); ?></td>
</tr>
<tr>
<td>Last Name</td>
<td><?php echo form_input('last_name', set_value('last_name')); ?>
<?php echo form_error('last_name'); ?></td>
</tr>
<tr>
<td>Email Address</td>
<td><?php echo form_input('email', set_value('email')); ?>
<?php echo form_error('email'); ?></td>
</tr>
<tr>
<td>Phone Number</td>
<td><?php echo form_input('phone', set_value('phone')); ?>
<?php echo form_error('phone'); ?></td>
</tr>
<tr>
<td> </td>
<td><button type="submit">Send Message</button></td>
</tr>
</table>
</form>
我绝对没有对CSFR或XSS忧虑做这种方式。
注意:与任何公开访问的表单一样,总会有垃圾提交(从机器人和试图招揽业务的真人)。如果您遇到很多问题,请相应地对您的验证规则进行微调。
你知道,这可能会发生在*所有*你的形式。查看动作属性的价值并不神奇。 CI在这里没有什么不同,例如'/ submit.cgi'。 – Boldewyn 2009-12-23 09:33:04