Почему я получаю ошибку: неопределенная переменная? - PullRequest
0 голосов
/ 07 октября 2011

Я создал входной скрипт. Я пишу имя и имя сценария в базу данных. Но у меня ошибка - 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 ]

2 голосов
/ 07 октября 2011

Возможно, потому что пустое значение было передано 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 голос
/ 07 октября 2011

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

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

Измените:

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

На:

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

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

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

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

0 голосов
/ 09 октября 2011

Вы забыли запустить запрос:

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 чище? :)

Хотя он все еще может использовать Валидацию, но это не относится к вашему первоначальному вопросу, поэтому я просто оставлю это так.

0 голосов
/ 07 октября 2011

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

...