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

1行後にまったく同じデータを正しく使用しているのに、ここではオブジェクトとしての$ 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');
}

また、他のテーブルに保存するには、usernameではなくuserIdを使用する必要があります。私が知る限り、インデックスは数値IDでより適切に機能し、テーブル内の全体的なデータは少なくなります。userId 342をブログテーブルに保存すると、ユーザー名bobsyouruncle3421を保存するよりも少ないスペースで済みます。

ちなみに、これは質問の一部ではないことはわかっていますが、実際にデータベースから削除することには欠点があります。少なくとも、長期的にはインデックス作成を台無しにし、クエリの速度を低下させることです。はるかに優れた解決策は、削除する可能性のあるテーブルにステータス列またはアクティブ列を追加し、アクティブの場合は1、削除の場合は0の値を指定することです。次に、アイテムを実際に削除する代わりに、アクティブな列を0に変更します。アイテムを表示するときに、アクティブ=1のチェックを表示クエリに追加します。

これには2つの目的があります。まず、インデックスを台無しにしないでください。レコードが変更されただけで削除されることはないため、インデックスはそのまま残ります。次に、ほぼ重要なのは、削除するつもりのないものを誤って削除する可能性がないことです。実際に削除されることはありません。したがって、いつでも何でも「削除を取り消す」ことができます。

于 2012-12-13T02:38:46.390 に答える
0

最も簡単な方法は、ユーザー名を変数に割り当ててから、SQL ステートメントを使用することです。

Delete from tbl where colname='$username'

それが私がする方法です、他の人は別の方法を持っているかもしれません。だから、違うものを使う人に敬意を表します

于 2012-12-12T23:57:36.967 に答える