Codeigniter 3.1.0 Active Record Update查询错误也不更新数据库

时间:2016-10-17 16:57:19

标签: php mysql forms codeigniter activerecord

尽管我已尽最大努力遵循有关标准CRUD更新程序的CI 3.1.0文档,但我无法使用输入编辑表单的信息更新目标数据库元素。目前,这是确定我的更新流程的代码(完整地);

编辑表格(edit.php - 查看文件)

<div id="container">

    <h1>Edit Post: <?php echo $post[0]['title']; ?></h1>

    <?php if($msg = $this->session->flashdata("message")): ?>
    <p class="success">
      <?php echo $msg; ?>
    </p>
    <?php endif; ?>

    <form action="<?php echo base_url('submit/update'); ?>" method="POST">
    <p>
    <label for="title">Title edit:</label>
    <input type="text" name="post[title]" id="title" value="<?php echo $post[0]['title'];?>"/>
    </p>

    <p>
    <label for="article_text">Content edit:</label>
    <textarea name="post[article]" id="article" rows="5" cols="40"><?php echo $post[0]['article_text']; ?></textarea>
    </p>

    <p>
    <label for="category">Category edit:</label>
    <SELECT name="post[category]" id="category" value="<?php echo $post[0]['category'];?>">
            <OPTION>CODING</OPTION> 
            <OPTION>DOWNLOADS</OPTION>
            <OPTION>HUMOR</OPTION> 
            <OPTION>IMAGES</OPTION>
            <OPTION>INFO</OPTION>
            <OPTION>MMO</OPTION>
            <OPTION>MULTIMEDIA</OPTION> 
            <OPTION>RANDOM</OPTION>
            <OPTION>REVIEWS</OPTION>
            <OPTION>TUTORIALS</OPTION> 
    </SELECT>
    </p>

    <p>
    <input type="hidden" name="post[article_id]"  id="article_id" value="<?php echo $post[0]['article_id'];?>" />
    <input class="btn btn-info btn-block" type="submit" value="Edit article" name="submit">
    </p>
      </form>
      </div>

如果有人想知道为什么我不只是将$article_id追加到form action, 这是因为,由于某种原因,它会使我要更新的元素无效。我在提交控制器$this->output->enable_profiler(TRUE);中打包parent::__construct();,以确保将正确的数据提取到编辑页面,定位正确的$article_id进行编辑。这是任何尝试更新之前的表格;

CRUD Edit Form 提交控制器更新功能(submit.php)

function update()
    {
         $this->load->model('article_model');
         $article_id = $this->input->post('article_id')
         $this->Article->updateData($article_id);                       
    }

文章模型更新功能

//UPDATE DATA FROM TINYMCE INTO DB TABLE
function updateData($article_id)
{       
    $title = $this->input->post('title');
    $article = $this->input->post('article_text');
    $category = $this->input->post('category');

    $data = array(
        'title'=> $title,
        'article_text'=>$article,
        'category'=>$category
    );
    $this->db->set('date', 'NOW()', FALSE);
    $this->db->where('article_id', $this->input->post('article_id'));
    $this->db->update('articles', $data);
    redirect('submit/manage', 'refresh');
    exit;
} 

我以前曾尝试使用$this->db->replace,但这会导致将NULL插入到这些目标元素的数据库中。我已经尝试了所有我可以通过CI 3文档和SO回答库存启用。我的WAMP解决方案错误日志和CI应用程序日志都没有给我任何骨头。关于这个问题的想法很新......

更新1

感谢评论中提到的@DFriend,我能够收到一条错误消息,告诉我更新过程需要set方法。当我在这里寻找@ SO时,我看到了另一种符号;

$this->db->set('title', $title);
$this->db->set('article_text', $article);
$this->db->set('category', $category);
$this->db->where('article_id', $article_id);
$this->db->update('articles');

但是,唉,没有快乐,因为我得到了与上次编码尝试相同的结果,在那里我被回避到CRUD文章列表中,看不到变化。要成为一个漫长的夜晚......

DAYBREAK

有时整晚都在圈子里闲逛(不是......),通过迷宫般的记录,真的试图找出其变幻莫测的东西。我带走的少数掘金之一是$this->output->enable_profiler(TRUE);。直觉上,我在redirect()函数的末尾删除了updateData()调用,并且看到了......

CI 3 Profiler output info

因此确认 postdata,但某些内容只导致这些目标元素的NULL条目。这比以前更好的情况。如果Profiler也可以为我找到NULL采购(大声笑!),那将是很好的,但是再次,那是我的工作......

2 个答案:

答案 0 :(得分:1)

在黑暗中完全射门,因为所有其他基地似乎都被覆盖了。

建议修订

//UPDATE DATA FROM TINYMCE INTO DB TABLE
function updateData($article_id)
{       
    $title = $this->input->post('title');
    $article = $this->input->post('article_text');
    $category = $this->input->post('category');

    $data = array(
        'title'=> $title,
        'article_text'=>$article,
        'category'=>$category,
        'date'=> date("Y-m-d H:i:s") //same data as NOW() only via PHP
    );
    //Here's the shot in the dark - set() is somehow screwing things up
    //$this->db->set('date', 'NOW()', FALSE);
    $this->db->where('article_id', $article_id); //you passed  $article_id into the function so use it
    $this->db->update('articles', $data);
    redirect('submit/manage', 'refresh');
    //redirect ends with a call to exit so the next line would never execute anyway
    //exit;
} 

答案 1 :(得分:0)

HAAAAAAAAAAAAAAAAAAAAAAAA .... Nailed it!

有些东西让我感到震惊,比较了submitedit页面的提交表单。由于我一直在为自己的用法定制教程,我忽略了更改表单元素以反映db列居民;

name="post[title]" != name="title"
name="post[article]" != name="article_text" 
name="post[category]" != name="category" 

只有这三个元素填充了我,并阻止表单中的postdata插入数据库。现在,我的世界里充满了欢乐......这是之前的初始文章管理员;

Before Editing Article Manager View

现在,在应用我的代码编辑后......

After View in Article Manager

@DFriend,我会对你的答案进行评价,因为我认为它对我来说非常有帮助(以及那些发人深省的评论)对我来说将会对其他人有用。这个答案将来会被搜索出来。对于那些可能正在努力解决这个问题的人来说,这是我最后的概述;

编辑表格(edit.php - 查看文件)

<div id="container">

<h1>Edit Post: <?php echo $post[0]['title']; ?></h1>

<?php if($msg = $this->session->flashdata("message")): ?>
<p class="success">
  <?php echo $msg; ?>
</p>
<?php endif; ?>

<form action="<?php echo base_url('submit/update'); ?>" method="POST">
<p>
<label for="title">Title edit:</label>
<input type="text" name="title" id="title" value="<?php echo $post[0]['title'];?>"/>
</p>

<p>
<label for="article_text">Content edit:</label>
<textarea name="article_text" id="article_text" rows="5" cols="40"><?php echo $post[0]['article_text']; ?></textarea>
</p>

<p>
<label for="category">Category edit:</label>
<SELECT name="category" id="category" value="<?php echo $post[0]['category'];?>">
        <OPTION>CODING</OPTION> 
        <OPTION>DOWNLOADS</OPTION>
        <OPTION>HUMOR</OPTION> 
        <OPTION>IMAGES</OPTION>
        <OPTION>INFO</OPTION>
        <OPTION>MMO</OPTION>
        <OPTION>MULTIMEDIA</OPTION> 
        <OPTION>RANDOM</OPTION>
        <OPTION>REVIEWS</OPTION>
        <OPTION>TUTORIALS</OPTION> 
</SELECT>
</p>

<p>
<input type="hidden" name="article_id"  id="article_id" value="<?php echo $post[0]['article_id'];?>" />
<input class="btn btn-info btn-block" type="submit" value="Edit article" name="submit">
</p>
  </form>
  </div>

提交控制器更新功能(submit.php)

    function update()
    {
            $this->load->model('article_model');
            $article_id = $this->input->post('article_id');             
            $this->Article->updateData($article_id);                    
    }

文章模型更新功能

function updateData($article_id)
{       
   $title = $this->input->post('title');
   $article = $this->input->post('article_text');
   $category = $this->input->post('category');

   $data = array(
      'title'=> $title,
      'article_text'=>$article,
      'category'=>$category,
      'date'=> date('Y-m-d H:i:s')
   );
    $this->db->set('title', $title);
    $this->db->set('article_text', $article);
    $this->db->set('category', $category);
    $this->db->where('article_id', $article_id);
    $this->db->update('articles', $data);
    redirect('submit/manage', 'refresh');
    exit;
 }
钉在这里的兴奋已经消除了对睡眠的需求(哈哈!)。让我们看看桑德曼在我脑后的桌子上抓住我的距离。 @DFriend,再次感谢您的眼睛和那些灵巧的评论。没有你的帮助就无法到达这里......

捆绑松散的结尾......

同样为了这篇文章的任何绊脚石的利益:必须克隆文章模型edit函数,以便我可以将其指向delete.php页面(本身是{{1}的克隆使用submit.php form action base_url('submit/trash')毫不费力地为我取出垃圾,重定向到文章管理器减去已删除的文章....最后一点(给我一个功能性应用程序,给我引导);

删除表格(delete.php - 查看页面)

<div id="container">
<h1>Delete Post: <?php echo $post[0]['title']; ?></h1>

<form action="<?php echo base_url('submit/trash'); ?>" method="POST">
<p>
    <label for="title">Title</label>
    <input size="25" type="text" name="title" id="title" value="<?php echo $post[0]['title'];?>" readonly />
</p>
<p>
    <label for="article_text">Content</label>
    <textarea readonly name="article_text" id="article_text" rows="12" cols="120"><?php echo $post[0]['article_text']; ?></textarea>
</p>
<p>
    <label for="category">Category</label>
    <SELECT disabled name="category" id="category" value="">
            <OPTION><?php echo $post[0]['category'];?></OPTION> 
               </SELECT>
</p>
<p>
    <input type="hidden" name="article_id"  id="article_id" value="<?php echo $post[0]['article_id'];?>" />
        <input class="btn btn-info btn-block" type="submit" value="Delete article" name="submit">
</p>
</form>
</div>

提交控制器删除功能(submit.php)

function delete() //so we can show delete.php view page
{
        $this->load->model('article_model');

        $article_id = $this->uri->segment(3);
        $post = $this->Article->getArticle($article_id);
        if(!$post)
        {
            redirect('submit/manage', 'refresh');
            exit;
        }
         $data['post'] = $post;           
         $this->load->view('delete',$data);
    }

删除表单&#34;操作&#34;功能

    function trash()
    {
            $this->load->model('article_model');
            $article_id = $this->input->post('article_id');             
            $this->Article->deleteData($article_id);                    
    }

文章模型删除功能

function deleteData($article_id)
    {
       $this->db->where('article_id', $article_id);
       $this->db->delete('articles');
       redirect('submit/manage', 'refresh');
       exit;           
    }

我真的希望这篇文章可以帮助将来的某个人。它肯定对我有帮助(哈哈!)......