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
内であれば、下記コードはどこに書いても構いません)
<?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)']
が記載されていなければ、この工程は無視して構いません)
$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するような設定を書きます。
//省略
//データの取り出し
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
を指定する事で、更新したいデータをデータベースから検索する作業と更新した内容をデータベースに保存する作業を行っています。
//省略
//保存データの取得をする
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
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が表示されます。
<html>
<head>
<title>Success</title>
</head>
<body>
<h3>編集完了したぜ!!</h3>
<p><?php echo anchor('news', '押すんだ!!'); ?></p>
</body>
</html>
この記事を初期投稿した際の筆者の技術ではセキュリティー面に関するところまで考えてできないので、スキルが向上した際、保守性も考えた更新機能をUPします!
最後に
以上で、「codeIgniterのUpdate機能[初心者向け]」の説明を終わりたいと思います。codeIgniterに関しては、まだまだ勉強中の為、間違っている点が多々あるかと思います。もし問題点、修正点がございましたら、ご指摘頂けると幸いです。
最後までご覧いただき、ありがとうございました。