我创建了一个输入脚本。我将名称和脚本帖子名称写入数据库。但我有错误 - 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';
}
}
但这不起作用,因为当我输入名称时,它们不会放入数据库。
答案 0 :(得分:2)
可能是因为空值传递给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 :(得分:1)
将method属性添加到表单中:
<form action="" method="post">
变化:
if(!empty($_POST['name'])){
要:
$result = '';
if(!empty($_POST['name'])){
并确保:
$this->template->content = View::factory('about/about')->set('result', $result);
<{1>}为空时。
答案 2 :(得分:0)
您没有名为name
的POST变量,因此$result
永远不会被设置。
答案 3 :(得分:0)
您忘记了实际运行查询:
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
}
}
}
有。那不是 A LOT 更干净吗? :)
它仍然可以使用验证,但这不包括你原来的问题,所以我就这样离开。