【问题标题】:why is my update query creating new row?为什么我的更新查询会创建新行?
【发布时间】:2011-07-23 06:41:46
【问题描述】:

我正在使用 codeigniter 并尝试执行 UPDATE 查询,但它会像 INSERT 查询一样不断创建新行。我很困惑,在网上搜索并没有给我带来太多收益。 (我有点n00b)。任何帮助将不胜感激。

这是表格:

<form action="<?=base_url();?>blog/new_post" method="post" name="write_new">
    <input type="hidden" name="user" value="<?=$user?>">
    <label>Title:</label><br>
    <input type="text" name="title" value="<?php if(isset($query->title)) { echo $query->title; }?>" size="50"><br>
    <label>Date:</label><br>
    <input type="text" name="date" size="46" value="<?php if(isset($query->date)) { echo $query->date; }?>" /> 
    <script language="JavaScript"> 
    new tcal ({
        // javascript calender thingy
        // form name
        'formname': 'write_new',
        // input name
        'controlname': 'date'
    });
    </script> <br><br>
    <label>Article:</label><br>
    <textarea name="content" style="width:100%;height:300px;"><?php if(isset($query->article)) { echo $query->article; }?></textarea><br>
    <select name="category">
        <option value="news">Dreamsy News</option>
        <option value="web">From the Interwebs</option>
    </select>
    <input type="submit"/>
</form>
<div class="clearboth"></div>

这是模型:

function edit_post($title, $date, $author, $article, $category, $id)
    {
        $this->load->helper('form'); //loads the CI form helper
        $this->load->library('form_validation'); //loads the form validation class
        $this->form_validation->set_rules('title', 'title', 'required|min_length[3]|max_length[40]|xss_clean'); 
        $this->form_validation->set_rules('date', 'date', 'required|min_length[5]|max_length[15]|xss_clean'); 
        $this->form_validation->set_rules('category', 'category', 'required|xss_clean'); 
        $this->form_validation->set_rules('content', 'article', 'required|xss_clean'); 
        $this->form_validation->set_rules('user', 'you are not logged in', 'required'); 

        if ($this->form_validation->run() == FALSE) //If the form does not validate
        {       
            $this->load->vars(array('title' => 'Error'));
            $this->template->write_view('content', 'error/new_post_fail');
            $this->template->render();
        }
        else
        {

            $article = htmlentities($article, ENT_QUOTES);          

            /*$data = array(
               'title' => $title,
               'date' => $date,
               'author' => $author,
               'article' => $article,
               'category' => $category
            );*/

            //$this->db->where('id', $id);
            //$this->db->update('blog', $data);

            $query = 'UPDATE blog SET title = '.$title.' date = '.$date.', author = '.$author.', article = '.$article.', category = '.$category;

            $this->db->query($query);

            redirect(base_url().'blog');
        }

这是控制器:

public function write()
{
    $id = $this->uri->segment(3);
    $query = 'SELECT * FROM blog WHERE id = '.$id;
    $query = $this->db->query($query);
    $query = $query->row();
    $title = $query->title;
    $user = $this->session->userdata('user_id');
    if(isset($id)){ $title = 'Edit: '.$title; } else { $title = 'Write new post'; }

    $vars['title'] = $title;
    $vars['page'] = 'blog';
    $vars['user'] = $user;
    $vars['id'] = $id;
    $vars['query'] = $query;

    $this->load->helper('form'); //loads the CI form helper
    $this->load->library('form_validation'); //loads the form validation class
    $this->load->vars($vars); 
    $this->template->write_view('content', 'blog/write');
    $this->template->render();
}

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:
    <form action="<?=base_url();?>blog/new_post" method="post" name="write_new">
    

    你必须修改action 属性来调用blog 控制器的edit 方法。否则,将调用 new_post 方法,据我所知,它只是插入 POST 数据。

    【讨论】:

    • 这就是问题所在。如果是 write new 或 edit old post 页面,我忘了添加 if/else(取决于是否有第三个 uri 段)。非常感谢您的帮助!
    【解决方案2】:

    您是否设置了一些路线,因为我没有在您的上述控制器中看到相关功能,该功能通过您的表单中的操作标签/属性进行引用。如果您不包含该功能,则很难确定错误的来源。

    我的一些亮点,我注意到您将表单验证、模板内容甚至重定向功能放在模型中,而不是将它们放在您的控制器中。

    【讨论】:

      【解决方案3】:

      我认为您的 UPDATE 查询中没有 WHERE 条件,这可能是您的问题之一..

      确保只针对您的问题执行那部分代码。

      【讨论】:

      • 如果缺少 WHERE 条件,更新应该适用于所有记录,不是吗?
      猜你喜欢
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 2014-03-21
      • 2012-10-16
      • 2016-08-12
      • 1970-01-01
      相关资源
      最近更新 更多