Проблема с базой данных PyroCMS / Codeigniter - PullRequest
2 голосов
/ 30 августа 2011

Я вполне могу упустить что-то совершенно очевидное, но я все еще немного растерялся. Фактическое взаимодействие с базой данных, кажется, подвох. Я имею в виду, что таблица создается при установке, но на самом деле отправка информации, похоже, не работает, поскольку она запускает проверку независимо от того, что я ввожу. Если я отключу требования поля, база данных не сможет получить информацию полностью.

с контроллера:

класс Admin расширяет Admin_Controller {

private $show_validation_rules = array(
    array(
        'field' => 'date',
        'label' => 'Date',
        'rules' => 'trim|max_length[100]|required'
    ),
    array(
        'field' => 'location',
        'label' => 'Location',
        'rules' => 'trim|max_length[300]'
    ),
    array(
        'field' => 'support',
        'label' => 'Support',
        'rules' => 'trim|required'
    )

);

public function __construct()
{
    parent::__construct();

    $this->load->model('shows_m');
    $this->load->library('form_validation');
    $this->lang->load('shows');
    $this->load->helper('html');

    $this->template->set_partial('shortcuts', 'admin/partials/shortcuts');
}

public function index()
{
    $view_data = array();
    $view_data['shows'] = $this->shows_m->get_all();
    $this->template->build('admin/index', $view_data);
}

public function create()
{

    $shows = $this->shows_m->get_all();

    $this->form_validation->set_rules($this->show_validation_rules);

    if ( $this->form_validation->run() )
    {
        if ($this->shows_m->insert_show($this->input->post()))
        {
            $this->session->set_flashdata('success', lang('shows.create_success'));
            redirect('admin/shows/index');
        } else {
            $this->session->set_flashdata('error', lang('shows.create_error'));
            redirect('admin/shows/create');
        }
    }

    foreach($this->show_validation_rules as $rule)
    {
        $shows[$rule['field']] = $this->input->post($rule['field']);
    }
    $view_data = array(
            'shows' => $shows
        );
    $this->template->build('admin/create', $view_data);
}

public function edit($id)
{
    $this->form_validation->set_rules($this->show_validation_rules);

    $show = $this->shows_m->get($id);

    if ( empty($show) )
    {
        $this->session->set_flashdata('error', lang('shows.exists_error'));
        redirect('admin/shows');
    }

    if ( $this->form_validation->run() )
    {

        if ( $this->shows_m->update_entry($id, $this->input->post()) === TRUE )
        {
            if ( isset($this->input->post()['delete']) )
            {
                $this->session->set_flashdata('success', lang('shows.delete_success'));
                redirect('admin/shows/');
            }
            else
            {
                $this->session->set_flashdata('success', lang('shows.update_success'));
                redirect('admin/shows/edit/' . $id);
            }
        } else {
            if ( isset($this->input->post()['delete']) )
            {
                $this->session->set_flashdata('error', lang('shows.delete_error'));
                redirect('admin/shows/edit/' . $id);
            }
            else
            {
                $this->session->set_flashdata('error', lang('shows.update_error'));
                redirect('admin/shows/edit/' . $id);
            }
        }
    }

    foreach($this->show_validation_rules as $rule)
    {
        if ($this->input->post($rule['field']))
        {   
            $show[$rule['field']] = $this->input->post($rule['field']);
        }
    }
    $view_data = array(
            'shows' => $show
        );
    $this->template->build('admin/edit', $view_data);
}

public function delete($id = NULL)
{
    $id_array = array();

    if ( $this->input->post() )
    {
        $id_array = $this->input->post()['action_to'];
    }
    else
    {
        if ( $id !== NULL )
        {
            $id_array[0] = $id;
        }
    }

    if ( empty($id_array) )
    {
        $this->session->set_flashdata('error', lang('shows.id_error'));
        redirect('admin/shows');
    }

    foreach ( $id_array as $id)
    {

        $show = $this->shows_m->get($id);

        if ( !empty($show) )
        {

            if ( $this->shows_m->delete($id) == FALSE )
            {
                $this->session->set_flashdata('error', lang('shows.delete_error'));
                redirect('admin/shows');
            }
        }
    }

    $this->session->set_flashdata('success', lang('shows.delete_success'));
    redirect('admin/shows');
}

}

Из файла details.php

public function install()
{
    $this->dbforge->drop_table('shows');
    $shows = "
        CREATE TABLE ".$this->db->dbprefix('shows')." (
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `date` varchar(100) NOT NULL,
          `location` varchar(300) NOT NULL,
          `support` text,
          PRIMARY KEY (`id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    ";

    if($this->db->query($shows))
    {
        return TRUE;
    }
}

Целью модуля является, вкратце, вывести дату шоу, местоположение и любые вспомогательные полосы и другую информацию, вставив тег, созданный модулем, на соответствующую страницу сайта.

Я склонен думать, что это должно быть довольно просто, и что я упускаю что-то очевидное, но кто знает. Если да, не стесняйтесь кричать на меня, я был бы признателен.

Edit:

код для модели

класс Shows_m extends MY_Model {

public function get_all($limit = NULL)
{
    $this->db->order_by("id", "desc");
    if (isset($limit)){ $this->db->limit($limit); }
    $results = $this->db->get('shows');
    $result = $results->result_array();
    return $result;
}


public function get($id)
{
    $results = $this->db->get_where('shows', array('id' => $id));
    $result = $results->row_array();
    return $result;
}


public function insert_show($input)
{

    $to_insert = array(
        'date' => $input['date'],
        'location' => $input['location'],
        'support' => $input['support']
    );


    if ($this->db->insert('shows',$to_insert))
    {
        return TRUE;
    } else {
        return FALSE;
    }
}


public function update_entry($id, $input)
{
    $new_data = array(
        'date' => $input['date'],
        'location' => $input['location'],
        'support' => $input['support']
    );

    if (isset ($input['delete']) )
    {
        if($this->delete($id))
        {
            return TRUE;
        } else {
            return FALSE;
        }
    } else {

        $this->db->where('id', $id);
        if ($this->db->update('shows', $new_data))
        {
            return TRUE;    
        } else {
            return FALSE;    
        }
    }
}


public function delete($id)
{
    if ($this->db->delete('shows', array('id' => $id)))
    {
        return TRUE;    
    } else {
        return FALSE;    
    }
}
}

1 Ответ

0 голосов
/ 02 сентября 2011

Это может быть ваш insert в модели

if ($this->db->insert('shows',$to_insert))
    {
        return TRUE;
    } else {
        return FALSE;
    }

Попробуйте вместо этого:

$this->db->insert('shows',$to_insert);
$query_result = $this->db->insert_id();
if($query_result){
    return TRUE;
}else{
    return FALSE;
}

Я не думаю, что insert возвращает что-либо.

В любом случае, это не похоже на проблему с проверкой.Запрос не попадает в БД.Если вышеупомянутое не проблема, попробуйте просто echo извлекать данные POST;убедитесь, что он попадает в модель (убедитесь, что HTML соответствует ожидаемому - вводимые имена и тому подобное).

...