-1

我想在仅由当前配置文件的所有者输入的博客下方有一个删除按钮,我已经尝试实现 deleteMyBlog 功能,但到目前为止没有任何乐趣。最好的方法是什么?

这是我的看法。我知道我需要一些删除按钮,但我不确定如何适应我当前的 foreach 循环:

  <?foreach($blogs AS $viewData):
  $delete = $viewData['id'];
 {
$id = $viewData->id;
$title = $viewData->title;
$body = $viewData->body;
$username = $viewData->username;
$date = $viewData->date;

?>

   <b> <?=$title?></b>
    <p><?=$body?></p>

      <p>posted by:<?=$username?></p>
      <p>date: <?=$date?></p>
   <?=anchor("blog/deleteMyBlog/$delete", 'delete')?>
<hr>

<?
}
?> 

我的模型:

class Blogmodel extends CI_Model
{
  public function __construct()
   {
    parent::__construct();
    } 

   function deleteMyBlog($id)
   {

    $this->db->where(array('id' => $id));
    $this->db->delete('blogs');

}

public function get_last_ten_entries()
{
    $query = $this->db->get('blogs', 10);
    return $query->result();

   }
public function insert_entry()
{
    $this->title = $this->input->post('title');
    $this->body = $this->input->post('text');
    $this->username = $this->session->userdata('username'); 
    $this->date = date("Y-m-d");

    $this->db->insert('blogs', $this);

   }
  }

控制器:

 class Blog extends CI_Controller {

public function _construct()
{
    parent::__construct();
    $this->load->model('Blogmodel','Blog'); 
    $this->load->model("profiles");

}


function deleteMyBlog($id) {

    $this->blogs->deleteBlog($id);

    redirect('blog');

}



public function index()
{

    $username = $this->session->userdata('username'); 

    $viewData['username'] = $username;

    $this->load->model('Blogmodel');


    if($this->input->post('act') =='create_post')
    {
        $this->Blogmodel->insert_entry();

    }


    $viewData['blogs'] = $this->Blogmodel->get_last_ten_entries();

    $this->load->view('shared/header');  
    $this->load->view('blog/blogtitle', $viewData);
    $this->load->view('shared/nav');
    $this->load->helper('form');// Load the form helper.

    // Lets set the stuff that will be getting pushed forward...
    $data = array();
    $data['form_open']=form_open();
    $data['form_title'] = form_input(array('name' => 'title'));
    $data['form_text'] = form_textarea(array('name' => 'text'));
    $data['form_hidden'] = form_hidden('act','create_post');
    $data['form_submit'] = form_submit('submit','Make Post');

    $this->load->view('blog/blogview');
    $this->load->view('blog/post', $data);



       $this->load->view('shared/footer');
    }


  }

再次感谢各位

4

2 回答 2

0

由于这一点,您会收到错误消息:

<?foreach($blogs AS $viewData):
   $delete = $viewData['id'];

应该是这样的:

$delete = $viewData->id;

您稍后正确地使用了完全相同的数据,为什么您要尝试使用 $viewData ,它是这里的一个对象作为数组,但在 2 行之后是一个对象。除此之外,您在那里所做的其他事情应该可以正常工作,但在实践中这是相当危险的。如果我访问您的站点并在该博客消失的末尾键入带有 blogId 的控制器函数的 url,那么您在任何时候都没有检查是否应该允许用户删除该博客。默默无闻!=安全。这意味着仅仅因为您认为人们不会找到链接并不意味着他们不会。

我个人将登录用户的 userId 保存到会话中,并将会话保存到数据库中。然后,当我对用户记录进行任何操作时,我会检查以确保进行更改的用户有权进行更改。

所以你的删除功能是这样的:

function deleteMyBlog($id)
{
    $this->db->where('username',$this->session->userdata('username');
    $this->db->where('id',$id);
    $this->db->delete('blogs');
}

此外,您应该使用 userId 而不是用户名来保存到其他表,据我所知,索引在数字 ID 上效果更好,而且表中的整体数据较少。将 userId 342 保存到您的 blogs 表比保存用户名 bobsyouruncle3421 占用的空间更少。

作为记录,我知道这不是问题的一部分,但实际上从数据库中删除东西有缺点。从长远来看,其中最重要的是搞砸了索引并减慢了查询速度。更好的解决方案是将状态或活动列添加到您可能要从中删除的任何表中,并为它们赋予值 1 表示活动和 0 表示已删除。然后,不是实际删除项目,而是将其活动列更改为 0。显示项目时,您将检查活动 = 1 添加到显示查询。

这有两个目的,首先你不要弄乱索引,记录永远不会被删除,只是被修改所以索引保持不变。其次,几乎重要的是,您永远不可能意外删除您不想删除的内容,它永远不会真正消失。因此,您可以随时“取消删除”任何内容。

于 2012-12-13T02:38:46.390 回答
0

最简单的方法是将用户名分配给变量,然后使用 SQL 语句。

Delete from tbl where colname='$username'

这就是我会做的方式,其他人可能有不同的方法。所以所有尊重那些会使用不同的东西的人

于 2012-12-12T23:57:36.967 回答