Почему я получаю ошибку: неопределенная переменная?

#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 хорошо. Я только переработал код, предоставленный автором, я не хотел переписывать все его приложение .