CakePHP2系サンプルコード：スコア登録アプリを作成

仕事で久しぶりにCakePHPを使うことになったので、DBの読み書きがある簡単なスコア登録アプリを作ってみました。

スコア登録アプリとは、
・名前と点数を入力して登録できる。
・登録したスコアを一覧表示できる。
というものです。

# 環境
CentOS7
MariaDB 5.5.60
PHP 7.2.9
CakePHP 2.10.11

サーバーIP：192.168.56.101
ドキュメントルート：/var/www/html/
CakePHPのファイル：/var/www/html/cakephp/

※ WindowsのVirtualBoxを使用。
※ 環境構築の手順は省略します。
※ 前提としてCakePHPの初期設定は終わっているものとします。

# データベースの準備
スコア登録アプリで使うデータベースを作成します。

```bash
# MySQLにログイン
$ mysql -u root
```

```SQL
-- DB作成
CREATE DATABASE cakedb;
USE cakedb;

-- テーブル作成
CREATE TABLE scores (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name TEXT,
  score INT
);

-- ユーザー作成
-- ユーザー名：cake_user パスワード:cake_20180903
CREATE USER 'cake_user'@'localhost' IDENTIFIED BY 'cake_20180903';

-- 権限付与
GRANT ALL ON cakedb.* TO cake_user;
```

# CakePHPのデータベース設定

デフォルトの設定ファイルをコピーします。

```bash
cp /var/www/html/cakephp/Config/database.php.default /var/www/html/cakephp/Config/database.php
```

database.phpの接続先を編集します。

```php:app/Config/database.php
        public $default = array(
                'datasource' => 'Database/Mysql',
                'persistent' => false,
                'host' => 'localhost',
                'login' => 'cake_user',
                'password' => 'cake_20180903',
                'database' => 'cakedb',
                'prefix' => '',
                'encoding' => 'utf8',
        );
```

# スコア入力画面
スコア入力画面のコントローラーです。

```php:app/Controller/InputController.php
<?php
App::uses('AppController', 'Controller');

class InputController extends AppController
{
    public function index()
    {
    }
}
?>
```

ビューを作成します。

```html:app/View/Input/index.ctp
スコアを登録
<form action="/cakephp/insert" method="POST">
名前：
<input type="text" name="name">
点数：
<input type="text" name="score">
<input type="submit" value="登録">
</form>
```

URLにアクセスします。
`http://192.168.56.101/cakephp/input/`
![cake_4.png](https://qiita-image-store.s3.amazonaws.com/0/278715/e3e182a9-270f-8560-eb18-edc15196034d.png)


入力画面が表示されるので、名前と点数を入力して登録します。

# スコア登録完了画面
スコア登録完了画面のコントローラーです。

```php:app/Controller/InsertContr
<?php
App::uses('AppController', 'Controller');

class InsertController extends AppController
{
    public function index()
    {
        // formのデータを取得
        $name = $this->request->data('name');
        $score = $this->request->data('score');

        // パラメータがなければ入力画面にリダイレクト
        if (empty($name) || empty($score)) {
            $this->redirect('../input');
        }

        // モデルをロード
        $this->loadModel('Scores');

        // scoresテーブルに保存
        $this->Scores->save(array('name' => $name, 'score' => $score));
    }
}
?>
```

ビューを作成します。

```html:app/View/Insert/index.ctp
スコアを登録しました。
```

ページが表示されます。
![cake_2.png](https://qiita-image-store.s3.amazonaws.com/0/278715/5db841f7-b038-53b0-6275-6fc7885b562f.png)

# スコア一覧画面
スコア一覧画面のコントローラーです。

```php:app/Controller/ListController.php
<?php
App::uses('AppController', 'Controller');

class ListController extends AppController
{
    public function index()
    {
        $this->loadModel('Scores');
        
        // scoresのデータを全て取得
        $result = $this->Scores->find('all');
        
        // ビューにセット
        $this->set('result', $result);
    }
}
?>
```

ビューを作成します。

```php:app/View/List/index.ctp
<?php foreach ($result as $data) { ?>
<?php echo $data['Scores']['name']; ?>さん:<?php echo $data['Scores']['score']; ?>点<br />
<?php } ?>
```

URLにアクセスします。
`http://192.168.56.101/cakephp/list/`
![cake_5.png](https://qiita-image-store.s3.amazonaws.com/0/278715/8eed490c-d517-cedf-66f3-1c3c935e0451.png)


登録したスコアが表示されました。

以上で終わりです。