Почему я получаю ошибку: неопределенная переменная?

Я создал входной скрипт. Я пишу имя и имя сценария в базу данных. Но у меня есть ошибка – ErrorException [ Notice ]: Undefined variable: result .

Есть мой контроллер:

 class Controller_About extends Controller_Template{ public function action_index() { if(!empty($_POST['name'])){ $name = Model::factory('index')->insert_names($_POST['name']);; $result= $name; } $this->template->site_name = Kohana::$config->load('common')->get('site_name'); $this->template->site_description = Kohana::$config->load('common')->get('site_description'); $this->template->page_title = 'About'; $this->template->content = View::factory('about/about')->set('result', $result); $this->template->styles[] = 'index/index'; } } 

Есть мое мнение:

 <form action=""> <input type="text" name="name" /> </form> 

И моя модель:

 Class Model_Index Extends Model { public static function insert_names($name){ $query = DB::query(DATABASE::INSERT, 'INSERT INTO names (name) VALUES (:name)')->parameters(array(':name' => $name)); } } 

В чем проблема?

Редактировать # 1

Я редактировал контроллер:

 class Controller_About extends Controller_Template{ public function action_index() {$result = ''; if(!empty($_POST['name'])){ $name = Model::factory('index')->insert_names($_POST['name']);; $result= $name; } $this->template->site_name = Kohana::$config->load('common')->get('site_name'); $this->template->site_description = Kohana::$config->load('common')->get('site_description'); $this->template->page_title = 'About'; $this->template->content = View::factory('about/about')->set('result', $result); $this->template->styles[] = 'index/index'; } } 

Но это не работает, потому что когда я вводю имя, они не помещаются в базу данных.

Возможно, потому, что пустое значение было передано в name и переменная не инициализируется, если ее не пустая. Но он используется в следующей строке, за пределами if

 $this->template->content = View::factory('about/about')->set('result', $result); 

Инициализировать $result вне if() :

 $result = ""; if(!empty($_POST['name'])){ $name = Model::factory('index')->insert_names($_POST['name']);; $result= $name; } 

Или переместите весь блок, который следует за if(){} внутри него.

 public function action_index() { if(!empty($_POST['name'])){ $name = Model::factory('index')->insert_names($_POST['name']);; $result= $name; // move this inside the if() $this->template->site_name = Kohana::$config->load('common')->get('site_name'); $this->template->site_description = Kohana::$config->load('common')->get('site_description'); $this->template->page_title = 'About'; $this->template->content = View::factory('about/about')->set('result', $result); $this->template->styles[] = 'index/index'; } } 

Добавьте атрибут метода в форму:

 <form action="" method="post"> 

Изменить:

 if(!empty($_POST['name'])){ 

Для того, чтобы:

 $result = ''; if(!empty($_POST['name'])){ 

И убедитесь, что:

 $this->template->content = View::factory('about/about')->set('result', $result); 

будет работать, когда $result пуст.

У вас нет переменной POST под name , поэтому $result никогда не будет установлен.

Вы забыли выполнить свой запрос:

 public static function insert_names($name) { $query = DB::query(DATABASE::INSERT, 'INSERT INTO names (name) VALUES (:name)')->parameters(array(':name' => $name))->execute(); } 

Однако было бы лучше использовать конструктор запросов Kohana:

 public static function insert_names($name) { $query = DB::insert('names', array('name'))->values(array($name))->execute(); } 

или , исходя из вашего кода, я могу судить, что вы новичок, вы можете использовать ORM и упростить его еще дальше, сделав это прямо в контроллере:

 if(!empty($_POST['name'])) { $result = ORM::Factory('index')->set(array('name' => $_POST['name']))->save(); } 

Однако проблема все равно будет существовать, потому что ваш метод insert_names ничего не возвращает, поэтому вы будете устанавливать переменную результата вашего шаблона как FALSE.

Я считаю, что вы хотели бы выглядеть так:

 public static function insert_names($name) { if(DB::insert('names', array('name'))->values(array($name))->execute()) { return $name; } } 

(с ORM не нужно было бы создавать этот метод в первую очередь)

Я вижу еще одну ошибку в вашем контроллере – я полагаю, вы не привыкли к ошибкам E_NOTICE. Вместо того, чтобы устанавливать $ result как пустую строку, было бы лучше просто немного реорганизовать ваш код:

 if(!empty($_POST['name'])) { $this->template->content = View::factory('about/about'); if($name = Model::factory('index')->insert_names($_POST['name'])) { $this->template->content->set('result', $_POST['name']); } else { // some kind of error message } } 

Может быть хорошей идеей сгруппировать все эти переменные из шаблона в одну приятную семью:

 class Controller_About extends Controller_Template{ public function action_index() { $config = Kohana::$config->load('common'); $this->template->set(array( 'site_name' => $config->get('site_name'), 'site_description' => $config->get('site_description'), 'page_title' => 'About', 'styles' => 'index/index' )); $this->template->content = View::factory('about/about'); if($name = Model::factory('index')->insert_names($_POST['name'])) { $this->template->content->set('result', $_POST['name']); } else { // some kind of error message } } } 

Там. Разве это не БОЛЬШОЙ уборщик? 🙂

Однако он все равно может использовать проверку, но это не касается вашего первоначального вопроса, поэтому я просто оставлю это таким образом.