为什么我会收到错误:未定义的变量?

时间:2011-10-07 16:50:36

标签: 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';
    }
}

但这不起作用,因为当我输入名称时,它们不会放入数据库。

4 个答案:

答案 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 更干净吗? :)

它仍然可以使用验证,但这不包括你原来的问题,所以我就这样离开。