PyroCMS/Codeigniter 数据库问题

发布于 2024-12-01 21:16:53 字数 6838 浏览 1 评论 0原文

我可能会错过一些非常明显的东西,但我仍然有点迷失。实际的数据库交互似乎是问题所在。我的意思是,该表是在安装时创建的,但实际上发送信息似乎不起作用,因为无论我输入什么,它都会触发验证。如果我关闭字段要求,数据库将无法完全接收信息。

从控制器:

类 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;
    }
}

简而言之,该模块的目的是通过将模块生成的标签插入到网站上的相关页面来输出演出日期、位置和任何支持乐队以及其他信息。

我倾向于认为它应该非常简单,并且我错过了一些明显的东西,但谁知道呢。如果是的话,请随意对我大喊大叫,我将不胜感激。

编辑:

模型

类 Shows_m 的代码扩展了 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;    
    }
}
}

I may well be missing something quite obvious, but I'm still a bit lost. The actual database interaction seems to be the catch. I mean, the table is created on installation, but actually sending the information doesn't seem to work as it triggers the validation regardless of what I enter. If I turn off the field requirements, the database fails to receive the information entirely.

From the controller:

class Admin extends 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');
}

}

From the details.php file

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;
    }
}

The intent of the module is, in short to output the date of the show, the location and any supporting bands and other info by inserting a tag produced by the module in to the pertinent page on the site.

I'm inclined to think it should be quite simple and that I'm missing something obvious, but who knows. If I am, feel free to yell at me, I'd appreciate it.

Edit:

Code for the model

class 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;    
    }
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我家小可爱 2024-12-08 21:16:53

这可能是您在模型中的 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 符合预期——输入名称等)。

It might be your insert in the model

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

Try instead:

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

I don't think insert returns anything.

At any rate, it doesn't sound like validation is the problem. The query isn't getting to the db. If the above isn't the issue, try just echoing out the POST data; make sure it's getting to the model (make sure the HTML is as expected--input names and such).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文