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


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

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

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

deletek機能の実装方法は下記から閲覧できます
**[[PHP]codeIgniterのupdate機能[初心者向け]](https://qiita.com/kengo922/items/f280148dcb23bcf43a87)**


# アプリ制作の各Version
codeIgniter version : 3.1.※
PHP version : 7.※.※
(詳細なバージョンは教えられない為、隠しておきます)


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

```php: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)']`が記載されていなければ、この工程は無視して構いません）

``` php: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を２つ使用しています。では、二つのfunctionの役割について簡単に説明します。
`public function edit`：データベースから指定したidのデータを抽出し、viewの投稿記入欄にデータを反映させる。
`public function edit_finish()`で記入項目の変更をおこなった後、submitが押されたらデーターベースに更新内容をUpdateするような設定を書きます。

```php: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`を指定する事で、更新したいデータをデータベースから検索する作業と更新した内容をデータベースに保存する作業を行っています。


```php: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`を使用して更新するデータを取得しているで、ここ重要なポイントです。

```php: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が表示されます。

``` php: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に関しては、まだまだ勉強中の為、間違っている点が多々あるかと思います。もし問題点、修正点がございましたら、ご指摘頂けると幸いです。

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