Help us understand the problem. What is going on with this article?

[PHP]codeIgniterのUpdate機能[初心者向け]

codeIgniterの公式ドキュメントには、チュートリアルが掲載されていますが、「投稿機能」、「参照機能」の作り方しか記載されていません。WEBアプロケーションを作成する際、CRUD(クラッド)操作が基本となりますが、codeIgniterの公式チュートリアルでは、Delete機能(消去機能)とUpdata機能(更新機能)の作り方が記載されていません。また、codeIgniterと言うフレームワークは、技術的な記事が少なく、多くのユーザーが公式ドキュメントを見て様々な機能を作成していると思います。ただ、codeIgniterの初心者が公式ドキュメントを参考にしてDeliteとUpdate等の機能を作成するのは、かなりハードルが高いと感じました。(筆者も凄く苦労しました。)

今回は、codeIgniterの初心者である筆者が、備忘録も兼ねてUpdate機能の作成方法をご説明します!

※公式チュートリアルのアプリが作成できている前提で話しを進めます

deletek機能の実装方法は下記から閲覧できます
[PHP]codeIgniterのupdate機能[初心者向け]

アプリ制作の各Version

codeIgniter version : 3.1.※
PHP version : 7.※.※
(詳細なバージョンは教えられない為、隠しておきます)

更新ボタンの設定

最初に更新ボタンをメインページ(index.php)に記入します。idを指定して上げないと更新ができない為、idは必ず入力して下さい。
foreach内であれば、下記コードはどこに書いても構いません)

application/views/index.php
<?php foreach ($news as $news_item): ?>
//省略
 <a href="<?php echo site_url('news/edit/'.$news_item['id']); ?>">更新</a>
//省略
<?php endforeach;

ルーティングの設定

次はルーティングです。チュートリアル通りやられている方は、$route['news/update'] = 'news/update';routes.phpに記入して下さい。'news/update'を記入して上げないとUpdate機能とviewが反応しない為、必ず記入してください。

理由は、['(:any)']を使用すると右辺に指定した場所に必ずページ遷移する設定になってしまう為、Updateのfunction関連が読み込まず、update機能が動かなくなります。その為、News.phpコントローラで何かactionを付け加えたい時は、$route['news/(:any)'] = 'news/view/$1';より上にページ遷移先の機能名を記入して下さい。

(チュートリアルでは、['(:any)']が使用されていますが、実際の開発では、ほぼ使用されることがないそうなので、routes.php['(:any)']が記載されていなければ、この工程は無視して構いません)

application/config/routes.php
$route['news/create'] = 'news/create';
$route['news/update'] = 'news/update';
//下記コードより上に付け加える
$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';

コントローラーの設定

最初にupdate機能を付け加える為、コントローラーのNews.php内に、public function edit($id)public function edit_finish()を記入します。Update機能では、functionを2つ使用しています。では、二つのfunctionの役割について簡単に説明します。
public function edit:データベースから指定したidのデータを抽出し、viewの投稿記入欄にデータを反映させる。
public function edit_finish()で記入項目の変更をおこなった後、submitが押されたらデーターベースに更新内容をUpdateするような設定を書きます。

application/controllers/News.php
    //省略
    //データの取り出し
    public function edit($id){
      $date = $this->news_model->get_news($id);
      $this->load->view('news/edit',$date);
    }

    //更新内容の保存
    public function edit_finish(){
      //「$date = $_POST;」は、submitした際、更新するデータを全て読み込んでいる
      $date = $_POST;
      $this->news_model->edit($date);
      $this->load->view('news/edit_finish');
    }
    //省略

モデルの設定

モデルにUpdateをする為のコードを記入します。
ここでは、idを指定する事で、更新したいデータをデータベースから検索する作業と更新した内容をデータベースに保存する作業を行っています。

application/controllers/News.php
    //省略
    //保存データの取得をする
    public function set_news(){
        $this->load->helper('url');
        // URL ヘルパーの url_title() メソッドを使い、スペースを - に、大文字を小文字に置換する。
        // input ライブラリの post() メソッドを使い、データを取得する。
        $data = array(
            'name' => $this->input->post('name'),
            'title' => $this->input->post('title'),
            'text' => $this->input->post('text')
        );
        return $this->db->insert('news', $data);
    }

    //変更データをデーターベースに保存する
    public function edit($date) {
        $this->db->where('id', $date['id']);
        $this->db->update('news', $date);
    }
    //省略

Viewの設定

最後にviewを書いて終了です。ただ、application/views/news/edit.phpに関しては、valueを使用して更新するデータを取得しているで、ここ重要なポイントです。

application/views/news/edit.php
<?php
echo validation_errors();
?>

<?php
echo form_open('news/edit_finish');
?>

<form>
    //hiddenフィールドでidの入力は出来ないようにしつつ、idの登録を自動で行う設定にした。
    <input type="hidden" name="id" value=<?php echo $id; ?> ><br />

    //データベースのデータを取り出す為、valueにphp echo $name;//を記載してデータベースの内容を表示させる状態を作る
    <label for="name">名前</label>
    <input type="text" name="name" value=<?php echo $name; ?> ><br />

    <label for="title">記事タイトル</label>
    <input type="text" name="title" value=<?= $title; ?> ><br />

    <label for="text">本文</label>
    <textarea name="text" ><?= $text; ?></textarea><br />

    <input class="btn btn-primary active" type="submit" value="送信" ><br />

</form>

</html>

下記は、edit_finish.phpの画面です。更新が完了したら下記のviewが表示されます。

application/views/news/edit_finish.php
<html>
<head>
    <title>Success</title>
</head>

<body>

<h3>編集完了したぜ!!</h3>
<p><?php echo anchor('news', '押すんだ!!'); ?></p>

</body>
</html>

この記事を初期投稿した際の筆者の技術ではセキュリティー面に関するところまで考えてできないので、スキルが向上した際、保守性も考えた更新機能をUPします!

最後に

以上で、「codeIgniterのUpdate機能[初心者向け]」の説明を終わりたいと思います。codeIgniterに関しては、まだまだ勉強中の為、間違っている点が多々あるかと思います。もし問題点、修正点がございましたら、ご指摘頂けると幸いです。

最後までご覧いただき、ありがとうございました。

kengo922
ペン回しを競技として行っている未経験エンジニア! (動画はURLから見れます)
https://www.youtube.com/watch?v=0CqFEDzDkIA&t
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away