CodeIgniter странное поведение с set_value - PullRequest
0 голосов
/ 07 марта 2012

Я столкнулся со следующей проблемой в PHP версии 5.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 = & get_instance ();-> Псевдоним для: 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 дает мне return self :: $ instance; нужный объект, а другая новый объект?

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Почему вы используете

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

, чтобы установить значение $ data ['test']?Почему бы вам просто не использовать:

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

Вам даже не нужно это делать.Смысл set_value в том, чтобы автоматически устанавливать входное значение, когда проверка формы не удалась или когда значение уже существует для ввода.На самом деле, вам даже не нужны вышеуказанные строки в вашем контроллере.Простое размещение set_value в вашем представлении загрузит входное значение вашего посетителя, если проверка формы не удалась. Проверьте их документацию.

0 голосов
/ 22 августа 2014

Вот исправление.

$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);
 } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...