（覚書）コードイグナイタについて

# CodeIgniter 1週間速習ガイド

## 🚀 1日目：基礎理解（必須）

### MVCパターンを理解する
```
Model（モデル）    → データベース操作
View（ビュー）     → 画面表示（HTML）
Controller（コントローラー） → 処理の制御
```

### ファイル構造を覚える
```
application/
├── controllers/     ← メイン処理を書く
├── models/         ← DB操作を書く
├── views/          ← HTML画面を書く
├── config/         ← 設定ファイル
└── libraries/      ← 追加機能
```

### URL理解（重要！）
```
http://example.com/index.php/controller/method/parameter
                              ↓        ↓      ↓
                           クラス名   メソッド名  引数
```

## 🔧 2日目：基本操作習得

### コントローラーの基本
```php
class Welcome extends CI_Controller {
    
    public function index() {
        // メインページ
        $this->load->view('welcome_message');
    }
    
    public function hello($name = 'World') {
        // パラメータ付きページ
        $data['name'] = $name;
        $this->load->view('hello', $data);
    }
}
```

### ビューにデータを渡す
```php
// コントローラー側
$data = [
    'title' => 'ページタイトル',
    'message' => 'こんにちは'
];
$this->load->view('my_view', $data);

// ビュー側（my_view.php）
<h1><?= $title ?></h1>
<p><?= $message ?></p>
```

### よく使うヘルパー（必須）
```php
// 必ず最初に読み込む
$this->load->helper(['url', 'form', 'html']);

// URL生成
echo site_url('controller/method');  // http://example.com/index.php/controller/method
echo base_url('assets/style.css');   // http://example.com/assets/style.css

// フォーム作成
echo form_open('controller/submit');
echo form_input('name', 'デフォルト値');
echo form_close();
```

## 💾 3日目：データベース操作

### データベース設定
```php
// config/database.php
$db['default'] = array(
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'test_db',
    'dbdriver' => 'mysqli'  // MySQLの場合
);
```

### 基本的なDB操作
```php
// データ取得
$query = $this->db->get('users');           // SELECT * FROM users
$users = $query->result_array();

// 条件付き取得
$query = $this->db->where('id', 1)->get('users');
$user = $query->row_array();

// データ挿入
$data = ['name' => '田中', 'email' => 'test@example.com'];
$this->db->insert('users', $data);

// データ更新
$this->db->where('id', 1);
$this->db->update('users', ['name' => '佐藤']);

// データ削除
$this->db->where('id', 1);
$this->db->delete('users');
```

### モデルの作成
```php
// models/User_model.php
class User_model extends CI_Model {
    
    public function get_all_users() {
        return $this->db->get('users')->result_array();
    }
    
    public function insert_user($data) {
        return $this->db->insert('users', $data);
    }
}

// コントローラーで使用
$this->load->model('User_model');
$users = $this->User_model->get_all_users();
```

## 📝 4日目：フォーム処理

### フォームバリデーション（重要！）
```php
// ライブラリ読み込み
$this->load->library('form_validation');

// ルール設定
$this->form_validation->set_rules('name', '名前', 'required|max_length[50]');
$this->form_validation->set_rules('email', 'メール', 'required|valid_email');

// 実行
if ($this->form_validation->run()) {
    // バリデーション成功
    $name = $this->input->post('name');
    $email = $this->input->post('email');
} else {
    // エラーあり
    $errors = validation_errors();
}
```

### よく使うバリデーションルール
```php
'required'           // 必須
'max_length[100]'    // 最大文字数
'min_length[3]'      // 最小文字数
'valid_email'        // メール形式
'numeric'            // 数値のみ
'alpha_numeric'      // 英数字のみ
'matches[password]'  // 他フィールドと一致
```

### POST/GETデータの取得
```php
// POST取得
$name = $this->input->post('name');
$all_post = $this->input->post();

// GET取得
$id = $this->input->get('id');

// セキュア取得（XSS対策）
$name = $this->input->post('name', TRUE);  // 自動でHTMLエスケープ
```

## 🔐 5日目：セッション・セキュリティ

### セッション使用
```php
// ライブラリ読み込み
$this->load->library('session');

// セッション設定
$this->session->set_userdata('user_id', 123);
$this->session->set_userdata(['name' => '田中', 'role' => 'admin']);

// セッション取得
$user_id = $this->session->userdata('user_id');
$all_session = $this->session->userdata();

// セッション削除
$this->session->unset_userdata('user_id');
$this->session->sess_destroy();  // 全削除
```

### セキュリティ対策（必須！）
```php
// XSS対策
echo html_escape($user_input);  // HTMLエスケープ

// CSRF対策（config/config.phpで有効化）
$config['csrf_protection'] = TRUE;

// SQLインジェクション対策（自動で対応）
$this->db->where('id', $id);  // 自動でエスケープ

// フォームでCSRFトークン使用
echo form_open('controller/method');  // 自動でCSRFトークン挿入
```

## 📁 6日目：ファイルアップロード・ライブラリ

### ファイルアップロード
```php
// ライブラリ読み込み
$this->load->library('upload');

// 設定
$config = [
    'upload_path' => './uploads/',
    'allowed_types' => 'gif|jpg|png|pdf',
    'max_size' => 2048,  // 2MB
    'encrypt_name' => TRUE  // ファイル名暗号化
];

$this->upload->initialize($config);

// アップロード実行
if ($this->upload->do_upload('file_field')) {
    $data = $this->upload->data();
    echo $data['file_name'];  // 保存されたファイル名
} else {
    echo $this->upload->display_errors();
}
```

### よく使うライブラリ
```php
// メール送信
$this->load->library('email');
$this->email->to('test@example.com');
$this->email->subject('件名');
$this->email->message('本文');
$this->email->send();

// ページネーション
$this->load->library('pagination');
$config['total_rows'] = 100;
$config['per_page'] = 10;
$this->pagination->initialize($config);

// 画像操作
$this->load->library('image_lib');
```

## 🎯 7日目：実践・デバッグ

### デバッグテクニック
```php
// データ確認
var_dump($data);
print_r($array);
die(); // 処理停止

// ログ出力
log_message('error', 'エラーが発生しました');
log_message('debug', 'デバッグ情報: ' . print_r($data, TRUE));

// データベースクエリ確認
echo $this->db->last_query();

// エラー表示設定（development環境）
ini_set('display_errors', 1);
error_reporting(E_ALL);
```

### 設定ファイルの重要項目
```php
// config/config.php
$config['base_url'] = 'http://localhost/myapp/';  // 必須設定
$config['index_page'] = 'index.php';
$config['encryption_key'] = 'your_key_here';     // セッション用

// config/autoload.php（よく使うものを自動読み込み）
$autoload['libraries'] = array('database', 'session');
$autoload['helper'] = array('url', 'form');
```

## ⚡ 時短Tips

### 1. コントローラーのテンプレート
```php
class My_controller extends CI_Controller {
    
    public function __construct() {
        parent::__construct();
        $this->load->database();
        $this->load->helper(['url', 'form']);
        $this->load->library(['form_validation', 'session']);
    }
    
    public function index() {
        $data = [];
        $this->load->view('my_view', $data);
    }
}
```

### 2. よく使うコードスニペット
```php
// バリデーション＋処理のテンプレート
if ($this->input->method() === 'post') {
    $this->form_validation->set_rules('name', '名前', 'required');
    
    if ($this->form_validation->run()) {
        // 処理成功
        $data = $this->input->post();
        // DB処理など
        redirect('success_page');
    }
}
// エラー時はそのまま画面表示
```

### 3. エラーが出たときの確認順序
1. **URL確認** → コントローラー名・メソッド名は正しい？
2. **ファイル名確認** → 大文字小文字は正しい？
3. **読み込み確認** → ライブラリ・ヘルパー・モデルは読み込んだ？
4. **DB接続確認** → 設定は正しい？
5. **権限確認** → ファイル・フォルダの権限は正しい？

## 🚨 よくあるエラーと対処法

### 「404 Page Not Found」
- ファイル名の大文字小文字を確認
- コントローラーのクラス名とファイル名が一致しているか確認

### 「Call to undefined method」
- ライブラリやヘルパーの読み込み忘れ
- メソッド名のタイプミス

### 「Unable to connect to database」
- config/database.phpの設定確認
- データベースが起動しているか確認

### セッションが効かない
- config/config.phpの$config['encryption_key']を設定
- セッション用テーブルの作成（DB使用時）

## 📚 緊急時の参考資料

1. **公式ドキュメント**: https://codeigniter.com/userguide3/
2. **よく使う関数一覧**: フォームヘルパー、URLヘルパー、配列ヘルパー
3. **サンプルコード**: 上記のお問い合わせフォームを参考に改造

## 💡 コツ

1. **小さく始める**: まず動くものを作ってから機能追加
2. **コピー&改造**: 動くコードをベースに改造
3. **エラーを恐れない**: エラーメッセージを読んで一つずつ解決
4. **デバッグを活用**: var_dump()とdie()を使いまくる
5. **設定ファイルを確認**: エラーの9割は設定ミス