#php #kohana
#php #kohana
Вопрос:
Я создал сценарий ввода. Я записываю имя и имя записи скрипта в базу данных. Но у меня ошибка — 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';
}
}
Но это не работает, потому что, когда я ввожу имя, они не помещаются в базу данных.
Ответ №1:
Возможно, потому, что было передано пустое значение 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';
}
}
Комментарии:
1. Спасибо! Но этот скрипт не работает, потому что, когда я отправляю имя, скрипт не помещает имя в базу данных.
Ответ №2:
Добавьте атрибут метода в свою форму:
<form action="" method="post">
Изменить:
if(!empty($_POST['name'])){
Для:
$result = '';
if(!empty($_POST['name'])){
И убедитесь, что:
$this->template->content = View::factory('about/about')->set('result', $result);
будет работать, когда $result
пусто.
Ответ №3:
У вас не вызывается переменная POST name
, поэтому $result
она никогда не устанавливается.
Ответ №4:
Вы забыли фактически выполнить свой запрос:
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
}
}
}
Там. Разве это не НАМНОГО чище? 🙂
Хотя он все равно может использовать проверку, но это не касается вашего первоначального вопроса, поэтому я просто оставлю его таким.
Комментарии:
1. @MikePurcell хорошо. Я только переработал код, предоставленный автором, я не хотел переписывать все его приложение .