Я создал входной скрипт. Я пишу имя и имя сценария в базу данных. Но у меня есть ошибка – 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 } } }
Там. Разве это не БОЛЬШОЙ уборщик? 🙂
Однако он все равно может использовать проверку, но это не касается вашего первоначального вопроса, поэтому я просто оставлю это таким образом.