PHP Codeigniter:将动态表单数据传递到视图,而不必在验证错误时从数据库中重新提取

PHP Codeigniter:将动态表单数据传递到视图,而不必在验证错误时从数据库中重新提取,php,mysql,codeigniter,caching,Php,Mysql,Codeigniter,Caching,我正在使用PHP Codeigniter制作一个基本的注册页面 在注册页面上,我要求用户从类别选择中进行选择(通过html元素)。这些类别存储在MySQL数据库的列表中 我当前的方法是,当用户调用函数加载页面时,从数据库中获取该列表,然后将其显示给他们。但是,如果用户输入的数据不正确,并且页面必须重新加载验证错误,则保存列表中数据的变量似乎已清除,并且我必须在重新显示页面之前从数据库中重新提取列表数据 我相信文档中有一些关于如何将这个变量设置为永久可用的内容,但是再次查看时,我没有找到它 有人能

我正在使用PHP Codeigniter制作一个基本的注册页面

在注册页面上,我要求用户从类别选择中进行选择(通过
html元素)。这些类别存储在MySQL数据库的列表中

我当前的方法是,当用户调用函数加载页面时,从数据库中获取该列表,然后将其显示给他们。但是,如果用户输入的数据不正确,并且页面必须重新加载验证错误,则保存列表中数据的变量似乎已清除,并且我必须在重新显示页面之前从数据库中重新提取列表数据

我相信文档中有一些关于如何将这个变量设置为永久可用的内容,但是再次查看时,我没有找到它

有人能给我指一下正确的方向吗?在我看来,每次都需要重新提取这些数据是很愚蠢的(我知道人们不会经常输入错误的信息,但在一些情况下这会派上用场)


注意:这不是关于记住用户选择的问题。

例如,您只需要将其设置为默认值

<input type="text" name="username" value="<?php isset($_POST['username']) echo $username;?>" />

此示例用于使用ci表单帮助器的选择下拉列表
(我正在修改另一个表单,希望它都是正确的)

代码行是:

  form_dropdown('category',$categoryarray,set_value('category',$defaultcategory),$dropclass).form_error('category');
形式错误(“类别”);最后用于显示验证错误消息 即使有一个默认值——如果表单未通过表单中另一个字段的验证——这也会“记住”用户选择的内容

编辑

好的,有好消息也有坏消息。 坏消息-如果类别来自数据库,那么您需要再次获取它们。 好消息-CI会记住用户从下拉列表中选择的类别

如果在模型中创建category数组,那么坏消息其实没什么大不了的。然后,只需向验证中添加一行代码

// In the Model 

    function makedropdown() {

// get your category list 
$cats = $this->getAllCategories() ;

$categoryarray = array();

   // make the array 
 foreach ( $cats->result() as $row ) {

 $categoryarray[$row->category] =  $row->category ; }

return $categoryarray ;

}
有人填写了表单,我们运行验证,验证失败。在控制器中:

if ( $this->form_validation->run($formrules) == FALSE ) {

// get the categoryarray
$data['categoryarray'] = $this->categorymodel->makedropdown() ; 

// load form again
$this->load->view( 'myform', $data ); }
因此,即使我们再次从db获取类别以动态填充选择列表,CI仍然会记住用户第一次创建表单时的选择

那么下拉列表的默认类别呢?如果它不会改变,那么可以将其设置为配置。如果类别值来自数据库并且可以更改,则可以在模型中创建默认类别

编辑2

天哪,我总是这样做,所以为什么我没有想到这一点。所以,是的,这是另一个原因,使一个具体的方法来显示您的看法

 function _showCategoryForm(){

 // get the categoryarray
$data['categoryarray'] = $this->categorymodel->makedropdown() ; 

// anything else thats needed for the view 

// load form view
$this->load->view( 'myform', $data ); }
现在,我们没有任何重复的代码,如果需要的话,可以使用错误消息自定义验证失败

// since i'm grinding on this - the validation should happen in a model 
// and that method returns true or false
if ( $this->somemodel->validateCategoryForm() == FALSE ) {

// custom obnoxious error message 
$this->formerrormessage = "What part of required is eluding you?" ;

$this->_showCategoryForm() ;  }

这要好得多,因为如果表单的需求发生更改,那么更改只会发生在一个地方。我还添加了一个下划线,以提醒我们所有人私有方法是一种很好的做法。表单验证应该在一个由控制器调用的模型中单独进行

那么
$this->fuzzyfuzzy
会保持它的状态吗,即使在调用控制器的构造函数之后?这就是我所调用的模型,您询问的是$categoryarray-我认为如果存在验证错误,ci将重新填充select下拉列表,但是-请尝试并让我们知道。我认为这就是ci文档的不足之处。很少有人提到使用它们的函数时会发生什么。我已经实现了您所说的,但是似乎每次调用构造函数都会创建一个新的构造函数实例。我在构造函数中放了一些代码来表示这一点,并在用户通过URI从浏览器调用的每个方法调用后打印出来。这意味着每次都会调用
$This->load->model(fuzzyfuzzy)
。当然,构造函数肯定会再次被调用。如果您需要在继续之前检查凭证,这实际上是一件非常非常好的事情。但是表单验证将采用与表单初始显示完全不同的方法。我只是不确定下拉值是否会保留。现在你让我好奇,所以如果你不发布,我会自己测试它。好的,我的实现和你上面的一样。用户重新加载页面后,您设置的任何模型状态都会重置,因此下拉列表值将不会保留(因此,是的,您需要在调用验证方法后重新获取列表)。我不认为有办法解决这个问题,除非像你说的那样将这些值设置为配置。
// since i'm grinding on this - the validation should happen in a model 
// and that method returns true or false
if ( $this->somemodel->validateCategoryForm() == FALSE ) {

// custom obnoxious error message 
$this->formerrormessage = "What part of required is eluding you?" ;

$this->_showCategoryForm() ;  }