CodeIgniter与set_value的奇怪行为

时间:2012-03-07 15:25:59

标签: php codeigniter frameworks

我在PHP V5.2.17上遇到了以下问题,在我的其他服务器上(PHP 5.2.6和PHP / 5.3.10)问题不存在!

我有一个简单的控制器:

function test() 
{
  $data = array('test' => NULL);
  $this->form_validation->set_rules('test', '', 'trim|xss_clean|required');
  if ($this->form_validation->run()) {
    $data['test'] = $this->form_validation->set_value('test');
  }
  $data['result'] = array('valuebydatabase' => 'lorem');
  $this->load->view('test', $data);
} 

一个简单的观点:

<?=form_open(current_url());?>
<?php
// For debugging
echo $test;
?>

<input type="text" name="test" id="test" value="<?=set_value('test', $result['valuebydatabase']);?>">

<input type="submit" name="sbm" value="Submit" />

<?=form_close();?> 

在运行PHP 5.2.17的服务器上,输入值总是“lorem”,虽然我发布了另一个值,但在其他服务器上我得到了正确的值...

我认为PHP正在使用新对象,而不是使用现有对象。 我现在在两台服务器上解决问题并找到问题的根源:

在form_helper.php中,服务器尝试获取新实例: $ CI =&amp; get_instance(); - &GT;别名:CI_Controller :: get_instance()

在一台服务器上,我们在此对象中设置了规则,而在其他服务器上没有!

所以我们现在在核心文件中:

/**
 * CodeIgniter Application Controller Class
 *
 * This class object is the super class that every library in
 * CodeIgniter will be assigned to.
 *
 * @package  CodeIgniter
 * @subpackage Libraries
 * @category Libraries
 * @author  ExpressionEngine Dev Team
 * @link  http://codeigniter.com/user_guide/general/controllers.html
 */
class CI_Controller {

 private static $instance;

 /**
  * Constructor
  */
 public function __construct()
 {
  self::$instance =& $this;

  // Assign all the class objects that were instantiated by the
  // bootstrap file (CodeIgniter.php) to local class variables
  // so that CI can run as one big super object.
  foreach (is_loaded() as $var => $class)
  {
   $this->$var =& load_class($class);
  }

  $this->load =& load_class('Loader', 'core');

  $this->load->initialize();

  log_message('debug', "Controller Class Initialized");
 }

 public static function &get;_instance()
 {
  return self::$instance;
 }
}
// END Controller class

/* End of file Controller.php */
/* Location: ./system/core/Controller.php */  

但是我不知道为什么一个PHP版本给了我返回self :: $ instance; 正确的对象而另一个是一个新对象?

2 个答案:

答案 0 :(得分:1)

你为什么使用

$this->form_validation->set_value('test');

设置$ data ['test']值?你为什么不用它:

$data['test'] = $this->input->post('test');

你甚至不需要这样做。 set_value的整个点是在表单验证失败或输入已存在值时自动设置输入值。实际上,您甚至不需要控制器中的上述行。如果表单验证失败,只需在视图中放置set_value即可加载访问者的输入值。 Check out他们的文件。

答案 1 :(得分:0)

这是更正。

$data['test'] = set_value('test');

您可以在控制器,模型和视图中使用set_value()

请改用此脚本

function test() 
{
   $data = array('test' => NULL);
  $this->form_validation->set_rules('test', '', 'trim|xss_clean|required');
  if ($this->form_validation->run()) {
    $data['test'] = set_value('test');
  }
  $data['result'] = array('valuebydatabase' => 'lorem');
  $this->load->view('test', $data);
 }