Written by Manabu Bannai

【完全保存版】CodeIgniterで『ログインと会員登録機能』を実装する方法

CodeIgniter PROGRAMMING

CodeIgniterでログインと会員登録機能を実装する方法です。記事通りに実装していけば、だれでも会員登録できるサイトを作成することができます。

» コードをDLする。

ログイン機能の仕様は以下のとおりです

  • ログイン/ログアウト機能が使える
  • ログインユーザーとログインしていないユーザーはセッションで判別します

会員登録機能の仕様は以下のとおりです

  • 名前、Emailで会員登録ができます。
  • 会員登録を完了すると、確認メールが飛びます。
  • 確認メールのリンク先をクリックすると、会員登録が完了します。

ログインと会員登録機能を作ることで以下の知識を学ぶことができます。部分的に学習したい方は以下のリンクから該当箇所にジャンプできます。

『ログインと会員登録機能』する際に利用する知識

それではまとめていきます。

CodeIgniterの初期セットアップ

まずはmod_rewriteの設定です。過去記事にまとめました。以下からご確認ください。
【基礎】これからCodeIgniterをはじめる方へ 〜初期セットアップの手順〜

インデックスページ情報を変更する

編集ファイル:application/config/config.php

// $config['index_page'] = 'index.php';
$config['index_page'] = '';

ユーザー登録用のデータベースを2つ作成する

テーブル名:users
カラム数:3

user_db

テーブル名:temp_users
カラム数:4

temp_user_db

データベースとCodeIgniterを紐づける

データベースのオートロード設定を行なう。
編集ファイル:application/config/autoload.php

/*
| -------------------------------------------------------------------
|  Auto-load Libraries
| -------------------------------------------------------------------
| These are the classes located in the system/libraries folder
| or in your application/libraries folder.
|
| Prototype:
|
|	$autoload['libraries'] = array('database', 'session', 'xmlrpc');
*/

// $autoload['libraries'] = array();
$autoload['libraries'] = array("database");

次に、データベース情報を入力する。
編集ファイル:application/config/database.php

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = 'root';
$db['default']['database'] = 'ci_site';
$db['default']['dbdriver'] = 'mysql';

このタイミングで、トップページをリロードして、エラーが出ないか確認します。

CodeIgniterでログインページのビューを作成

small__8750503473

ヘルパー機能の設定をする

フォームヘルパー(ユーザー登録時に利用)とURLヘルパー(ページURLの動的出力に利用)を利用します。
編集ファイル:application/config/autload.php

/*
| -------------------------------------------------------------------
|  Auto-load Helper Files
| -------------------------------------------------------------------
| Prototype:
|
|	$autoload['helper'] = array('url', 'file');
*/

// $autoload['helper'] = array();
$autoload['helper'] = array("form", "url");

ログインページのメソッドを作成する

作成ファイル:application/controllers/main.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Main extends CI_Controller {

	public function index()
	{
		$this->load->view('login');
	}
}

ログインページのビューを作成する

作成ファイル:application/views/login.php

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>ログインページ</title>

</head>
<body>

<div id="container">
	<h1>ログインページ</h1>
</div>

</body>
</html>

デフォルトコントローラーで初期表示用のページ設定をする

編集ファイル:application/config/routes.php

$route['default_controller'] = "main";

login_view

indexメソッドとログインメソッドを切り分ける

main.phpを以下のように編集する。
編集ファイル:application/controllers/main.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Main extends CI_Controller {

	public function index()
	{
		$this->login();
	}

	public function login(){
		$this->load->view('login');
	}
}

indexのメソッドとloginメソッドを切り分けることでコードがわかりやすくなります。

CodeIgniterでログインページ用のフォーム機能を作成

small__2108134526

ログインページのビューにフォーム機能を追加する

編集ファイル:application/views/login.php

<div id="container">
	<h1>ログインページ</h1>

	<?php

	echo form_open();	//フォームを開く

	echo "<p>Email:";
	echo form_input("email");	//Emailの入力フィールドを出力
	echo "</p>";

	echo "<p>パスワード:";
	echo form_password("password");	//パスワードの入力フィールドを出力
	echo "</p>";

	echo "<p>";
	echo form_submit("login_submit", "Login");	//ユーザー登録ボタンを出力
	echo "</p>";

	echo form_close();	//フォームを閉じる

	?>

</div>

フォームのアクション先を設定する

編集ファイル:application/views/login.php

// echo form_open();					//フォームを開く
echo form_open("main/login_validation");	//フォームを開く

情報が以下のURLにポストされるようになります。
http://localhost/basicsite/main/login_validation
※現状は、404エラーが発生します。

login_validationのメソッドを作る

編集ファイル:application/controllers/main.php

public function login_validation(){}

この時点で、以下のURLで404エラーが発生しなくなります。
http://localhost/basicsite/main/login_validation

CodeIgniterでログインフォームへのバリデーション機能の追加

small__6482944999

ログインバリデーションのメソッドを作っていく

編集ファイル:application/controllers/main.php

public function login_validation(){
	$this->load->library("form_validation");	//フォームバリデーションライブラリを読み込む。
	//利用頻度の高いライブラリ(HTMLヘルパー、URLヘルパーなど)はオートロード設定をしますが、
	//フォームバリデーションライブラリはログインバリデーションライブラリ内のみで読み込みます。

	$this->form_validation->set_rules("email", "メール", "required");	//Email入力欄のバリデーション設定
	$this->form_validation->set_rules("password", "パスワード", "required|md5");	//パスワード入力欄のバリデーション設定
}

パスワード入力欄のバリデーション:『MD5』とは。
DBにパスワードを保存する際に、パスワードが自動的に暗号化される処理です。

フォームのバリデーションセキュリティを高める

編集ファイル:application/controllers/main.php

$this->form_validation->set_rules("email", "メール", "required|trim|xss_clean");
$this->form_validation->set_rules("password", "パスワード", "required|md5|trim");

※trimとは。
バリデーションが行われる前に、文字列の最初と最後の空白を自動的に削除します

※xss_cleanとは。
クロスサイトスクリプティングを阻止します。

バリデーションエラーの有無で条件分岐する処理を記述する

編集ファイル:application/controllers/main.php

public function login_validation(){
	$this->load->library("form_validation");	//フォームバリデーションライブラリを読み込む。

	$this->form_validation->set_rules("email", "メール", "required");	//Email入力欄のバリデーション設定
	$this->form_validation->set_rules("password", "パスワード", "required|md5");	//パスワード入力欄のバリデーション設定

	if($this->form_validation->run()){	//バリデーションエラーがなかった場合の処理
		redirect("main/members");
	}else{							//バリデーションエラーがあった場合の処理
		$this->load->view("login");
	}
}

バリデーションエラーが起きたときにフォーム上部にエラー表示をする

編集ファイル:application/views/login.php

echo form_open("main/login_validation");	//フォームを開く
echo validation_errors();		//バリデーションのエラー表示用

バリデーションエラーが起きても、Emailの入力内容が消失されないようにする。

ユーザビリティ向上のため。
編集ファイル:application/views/login.php

echo "<p>Email:";
echo form_input("email", $this->input->post("email"));
echo "</p>";

バリデーションエラーがなかった場合のリダイレクト先であるメンバーページのコントローラーを作成する

編集ファイル:application/controllers/main.php

public function members(){
	$this->load->view("members");
}

メンバーページのビューを作成する

新規作成ファイル:application/views/members.php

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>メンバーページ</title>
</head>
<body>

<div id="container">
	<h1>メンバーページ</h1>
</div>

</body>
</html>

CodeIgniterでPOSTデータの受け取る

POSTされた情報を受け取るテストをしてみる

編集ファイル:application/controllers/main.php

public function login_validation(){

// - - - 省略 - - - 

if($this->form_validation->run()){		
	redirect("main/members");
	}else{						
		$this->load->view("login");
	}

echo $_POST["email"];	//ポストされた情報を受け取ってみるテスト

//以下の記述でも同様の結果が得られます。
echo $this->input->post("email");

正常に動いたら、テスト部分の記述は削除してください。

コールバック設定をする

編集ファイル:application/controllers/main.php

// $this->form_validation->set_rules("email", "メール", "required|trim|xss_clean");
$this->form_validation->set_rules("email", "メール", "required|trim|xss_clean|callback_validate_credentials");
// validate_credentialsというメソッドを呼び出します。

コールバックとは、プログラム中で、呼び出し先の関数の実行中に実行されるように、あらかじめ指定しておく関数。
参考:» コールバックとは

Email情報がPOSTされたときに呼び出されるコールバック機能を作成していく

編集ファイル:application/controllers/main.php

public function validate_credentials(){		//Email情報がPOSTされたときに呼び出されるコールバック機能
	$this->load->model("model_users");

	if($this->model_users->can_log_in()){	//ユーザーがログインできたあとに実行する処理
		return true;
	}else{					//ユーザーがログインできなかったときに実行する処理
		$this->form_validation->set_message("validate_credentials", "ユーザー名かパスワードが異なります。");
		return false;
	}
}

CodeIgniterでログイン処理を行なう機能(can_log_inメソッド)を作っていく

small__3170509251

ユーザーのログイン処理を行なうモデルを作成する

新規作成ファイル:application/model/model_users.php

<?php

class Model_users extends CI_Model{
	public function can_log_in(){	//can_log_inメソッドを作っていく

		$this->db->where("email", $this->input->post("email"));	//POSTされたemailデータとDB情報を照合する
		$this->db->where("password", md5($this->input->post("password")));	//POSTされたパスワードデータとDB情報を照合する
		$query = $this->db->get("users");

		if($query->num_rows() == 1){	//ユーザーが存在した場合の処理
			return true;
		}else{					//ユーザーが存在しなかった場合の処理
			return false;
		}
	}
}

DB内にユーザーを作成してログインできるかテストする

暗号化したパスワードを取得するために、以下のサイトにとぶ。
md5 Hash Generator

以下が暗号化の例です。
パスワード:hellojapan
⇒暗号化したパスワード:28f29c53b1fe589377453209f69123

usersテーブルに以下のように情報を挿入します。
user_info

これでログインページが動くようになります\(^o^)/

CodeIgniterでセッションの設定をする

small__4531465716

セッションをライブラリでオートロードする

編集ファイル:application/config/autoload.php

$autoload['libraries'] = array("database", "session");

この時点でページをリロードすると以下のエラーメッセージが表示されます。

An Error Was Encountered
In order to use the Session class you are required to set an encryption key in your config file.

上記エラー解決のために、configファイルを編集します。
下記ファイルに入力する Encryptionキーは以下のサイトから取得してください。
Random Key Generator
編集ファイル:application/config/config.php

/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| If you use the Encryption class or the Session class you
| MUST set an encryption key.  See the user guide for info.
|
*/
$config['encryption_key'] = '3mgdphESlFFQk61rbilLr42ySa8Fk2U7';

encryption

これでエラーが解消されます( ◜◡ ̄)b

セッションクラスを作成する

編集ファイル:application/controller/main.php

if($this->form_validation->run()){		//バリデーションエラーがなかった場合の処理

	$data = array(
		"email" => $this->input->post("email"),
		"is_logged_in" => 1
	);
	$this->session->set_userdata($data);

	redirect("main/members");
}else{						//バリデーションエラーがあった場合の処理
	$this->load->view("login");
}

このプログラム解説は後ほど行います。

メンバーページにセッションデータを表示してみる

編集ファイル:application/views/members.php

<div id="container">
	<h1>メンバーページ</h1>

	<?php

	print_r ($this->session->all_userdata());

	?>

</div>

すると以下のようにセッションデータが表示されます。
session_data

メンバーページへのログイン前にログインしているかどうかを確認する

編集ファイル:application/controllers/main.php

public function members(){
	if($this->session->userdata("is_logged_in")){	//ログインしている場合の処理
		$this->load->view("members");
	}else{									//ログインしていない場合の処理
		redirect ("main/restricted");
	}
}

続いて、restrictedのメソッドを作成します。
public function members()の下に以下を追記。

public function restricted(){
	$this->load->view("restricted");
}

CodeIgniterでログアウト処理を作成する

small__6843413077

ログアウトリンクを作成する

編集ファイル:application/views/members.php

<?php
	print_r ($this->session->all_userdata());
?>
<a href="<?php echo base_url() . "main/logout" ?>">ログアウト</a>

ログアウトのメソッドを追加する

編集ファイル:application/controllers/main.php

public function logout(){
	$this->session->sess_destroy();		//セッションデータの削除
	redirect ("main/login");		//ログインページにリダイレクトする
}

ここまでで、ログイン、ログアウト処理が利用できるようになります。
尚、ログアウトした状態で、直接メンバーページにアクセスするとエラーが発生します。
http://localhost/basicsite/main/restricted

次に、restrictedのビューを作ります。

restrictedのビューを作成する

新規作成ファイル:application/views/restricted.php

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>アクセス権限がありません</title>
</head>
<body>

<div id="container">
	<h1>アクセス権限がありません</h1>
	<a href="<?php echo base_url() . "main/login" ?>">ログイン</a>

</div>

</body>
</html>

ここまでで、一般的なWebアプリケーションにおける、ログイン/ログアウト処理が完成しました。

CodeIgniterで会員登録ページを作成する

small__2152086392

会員登録のメソッドを作成する

編集ファイル:application/controllers/main.php

public function signup(){
	$this->load->view("signup");
}

ログインページに新規会員登録のリンクを作成する

編集ファイル:application/views/login.php

<a href="<?php echo base_url() . "main/signup" ?>">会員登録する</a>

会員登録ページのビューを作成する

新規作成ファイル:appllication/views/signup.php

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>会員登録ページ</title>

</head>
<body>

<div id="container">
	<h1>会員登録ページ</h1>

	<?php

	echo form_open("main/signup_validation");

	echo "<p>Email:";
	echo form_input("email");		//Emailの入力フィールド
	echo "</p>";

	echo "<p>パスワード:";
	echo form_password("password");	//パスワードの入力フィールド
	echo "</p>";

	echo "<p>パスワードの確認";
	echo form_password("cpassword");	//パスワード入力ミス防止用のフィールド
	echo "</p>";

	echo "<p>";
	echo form_submit("signup_submit", "会員登録する");	//会員登録ボタン
	echo "</p>";

	?>

</div>

</body>
</html>

CodeIgniterで会員登録時のバリデーションを作成していく

small__6723411369

会員登録時のバリデーションを作成していく

編集ファイル:application/controllers/main.php

public function signup_validation(){
	$this->load->library("form_validation");	//フォームバリデーションのライブラリを読み込む

	$this->form_validation->set_rules("email", "Email", "required|trim|valid_email|is_unique[users.email]");
	$this->form_validation->set_rules("password", "パスワード", "required|trim");
	$this->form_validation->set_rules("cpassword", "パスワードの確認", "required|trim|matches[password]");
}

すこしややこしいので、区切って解説します。

まず、set_relesの文法は以下。
set_rules(“value名”, “エラーメッセージ用のフィールド”, “条件”);

条件を解説していきます。

  • trim ⇒ 無駄な空白の削除
  • valid_email ⇒ Emailの形式が正しいかどうかを正規表現でチェック
  • is_unique[users.email] ⇒ usersDB内にあるemailカラムから情報を取得して、入力された値がユニークであるかチェック

文法としては以下。
is_unique[DB名 . カラム名]

これめちゃめちゃ便利ですね。。CodeIgniterすごい。

会員登録のバリデーションを通過する/しないで条件分岐する

編集ファイル:application/controllers/main.php

public function signup_validation(){
	$this->load->library("form_validation");	//フォームバリデーションのライブラリを読み込む

	$this->form_validation->set_rules("email", "Email", "required|trim|valid_email|is_unique[users.email]");
	$this->form_validation->set_rules("password", "パスワード", "required|trim");
	$this->form_validation->set_rules("cpassword", "パスワードの確認", "required|trim|matches[password]");

	if($this->form_validation->run()){
		echo "Success!!";
	}else{
		echo "You can't pass,,,";
		$this->load->view("signup");
	}
}

会員登録ページにバリデーションエラーのメッセージを表示する

編集ファイル:application/views/signup.php

<?php
	echo form_open("main/signup_validation");
	echo validation_errors();

会員登録ページでエラーが起きても、Emailの入力内容が消失されないようにする。

ユーザビリティ向上のため。
編集ファイル:application/views/signup.php

echo "<p>Email:";
echo form_input("email", $this->input->post("email"));
echo "</p>";

会員登録ページのエラーメッセージを編集する

編集ファイル:application/controllers/main.php

public function signup_validation(){
	$this->load->library("form_validation");	//フォームバリデーションのライブラリを読み込む

	$this->form_validation->set_rules("email", "Email", "required|trim|valid_email|is_unique[users.email]");
	$this->form_validation->set_rules("password", "パスワード", "required|trim");
	$this->form_validation->set_rules("cpassword", "パスワードの確認", "required|trim|matches[password]");

	//ここを追加
	$this->form_validation->set_message("is_unique", "入力したメールアドレスはすでに登録されています");

	if($this->form_validation->run()){
		echo "Success!!";
	}else{
		echo "You can't pass,,,";
		$this->load->view("signup");
	}
}

CodeIgniterで仮会員登録したユーザーへのフロー(会員登録確認メールの送信機能)を作成する

フォームバリデーションを通過したあとの処理を作成

編集ファイル:application/controllers/main.php

if($this->form_validation->run()){
	// echo "Success!!";

	//ランダムキーを生成する

	//ユーザーに確認メールを送信する

	//ユーザーを temp_users DBに追加する

}else{
	echo "You can't pass,,,";
	$this->load->view("signup");
}

上記コード内にあるコメント部分のプログラムを作っていきます。

ランダムキーを生成する

編集ファイル:application/controllers/main.php

if($this->form_validation->run()){
	// echo "Success!!";

	//ランダムキーを生成する
	$key=md5(uniqid());

メールの送信設定をする

編集ファイル:application/controllers/main.php

if($this->form_validation->run()){
	// echo "Success!!";

	//ランダムキーを生成する
	$key=md5(uniqid());

	//Emailライブラリを読み込む。メールタイプをHTMLに設定(デフォルトはテキストです)
	$this->load->library("email", array("mailtype"=>"html"));

	//送信元の情報
	$this->email->from("[email protected]", "送信元");

	//送信先の設定
	$this->email->to($this->input->post("email"));

	//タイトルの設定
	$this->email->subject("仮の会員登録が完了しました。");

	//メッセージの本文
	$message = "

会員登録ありがとうございます。

"; // 各ユーザーにランダムキーをパーマリンクに含むURLを送信する $message .= "

こちらをクリックして、会員登録を完了してください。

"; $this->email->message($message); //ユーザーに確認メールを送信する if($this->email->send()){ echo "Message has been sent."; }else echo "Coulsn't send the message."; //ユーザーを temp_users DBに追加する }else{ echo "You can't pass,,,"; $this->load->view("signup"); }

ユーザーを temp_users DBに追加する(1)

編集ファイル:application/controllers/main.php

ユーザーモデルを利用するので、以下のように読み込みます。

if($this->form_validation->run()){
	// echo "Success!!";

	//ランダムキーを生成する
	$key=md5(uniqid());

	//Emailライブラリを読み込む。メールタイプをHTMLに設定(デフォルトはテキストです)
	$this->load->library("email", array("mailtype"=>"html"));
	$this->load->model("model_users");

ユーザーを temp_users DBに追加する(2)

編集ファイル:application/controllers/main.php

確認メールの送信後に、『add_temp_users』メソッドを実行します
※『add_temp_users』メソッドはあとで作成します。

//ユーザーに確認メールを送信する
if($this->email->send()){
	echo "Message has been sent.";
}else echo "Coulsn't send the message.";

//ユーザーを temp_users DBに追加する
$this->model_users->add_temp_users($key);

ユーザーを temp_users DBに追加する(3)

編集ファイル:application/controllers/main.php

メール送信時点で、エラーが起きた場合はadd_temp_usersメソッドを利用する必要はありません。
よって、以下のようにif文で条件分岐します。

//ユーザーに確認メールを送信できた場合、ユーザーを temp_users DBに追加する
if($this->model_users->add_temp_users($key)){
	if($this->email->send()){
	echo "Message has been sent.";
	}else echo "Coulsn't send the message.";
}else echo "problem adding to database";

add_temp_usersのモデルを作成する

編集ファイル:application/models/model_users.php

public function add_temp_users($key){
		
	//add_temp_usersのモデルの実行時に、以下のデータを取得して、$dataと紐づける
	$data=array(		
		"email"=>$this->input->post("email"),
		"password"=>$this->input->post("password"),
		"key"=>$key
	);

	//$dataをDB内のtemp_usersに挿入したあとに、$queryと紐づける
	$query=$this->db->insert("temp_users", $data);

	if($query){		//データ取得が成功したらTrue、失敗したらFalseを返す
		return true;
	}else{
		return false;
	}
}

ここで、main.phpにて、先ほど作成したプログラムをもう一度みてみます。

if($this->model_users->add_temp_users($key))

add_temp_usersモデルは実行に成功したらTrue、失敗したらFalseを返します。
よって、以下のプログラムでは、add_temp_usersメソッドがTrueを返した場合のみ、メール送信が実行されることを意味します。

//add_temp_usersモデルがTrueを返したら、メール送信を実行
if($this->model_users->add_temp_users($key)){
	if($this->email->send()){
	echo "Message has been sent.";
	}else echo "Coulsn't send the message.";
}else echo "problem addin to database";

パスワードをDBに保存する際のセキュリティを高める

編集ファイル:application/models/model_users.php

public function add_temp_users($key){
		
	//add_temp_usersモデルの実行時に、以下のデータを取得して、$dataと紐づける
	$data=array(		
		"email"=>$this->input->post("email"),
		"password"=>md5($this->input->post("password")),
		"key"=>$key
	);

この時点で会員登録を完了すると、以下のURL付きのメールが送信されます。
http://localhost/basicsite/main/resister_user/[ランダムキー]

現時点では、404エラーが発生します。
よって、resister_userメソッドを作成していきます。

CodeIgniterで仮会員登録したユーザーへのフロー(会員登録確認メールのリンク先ページ)を作成する

small__4917556840

resister_userメソッドをテストしてみる

編集ファイル:application/controllers/main.php

以下のテスト用プログラムを作ります。
実行すると、URIから取得したkeyがそのまま表示されます。

public function resister_user($key){
	echo $key;
}

わかりやすく説明すると以下のような感じです。

http://localhost/basicsite/main/resister_user/test
⇒画面には『test』と表示されます。

http://localhost/basicsite/main/resister_user/I_LOVE_CodeIgniter
⇒画面には『I_LOVE_CodeIgniter』と表示されます。

resister_userメソッドを作成する

編集ファイル:application/controllers/main.php

public function resister_user($key){
	//add_temp_usersモデルが書かれている、model_uses.phpをロードする
	$this->load->model("model_users");

	if($this->model_users->is_valid_key($key)){	//キーが正しい場合は、以下を実行
		echo "valid key";
	}else echo "invalid key";
}

とりあえずは、キーが正しい場合は『valid key』、そうでない場合は『invalid key』と表示させます。
後ほど、さらに機能を作っていきます。

is_key_validモデルを作成する

編集ファイル:application/models/model_users.php
先ほどのプログラムででてきた、以下の部分のモデルを作成していきます。

$this->model_users->is_valid_key($key)

public function is_valid_key($key){
	$this->db->where("key", $key);	// $keyと等しいレコードを指定
	$query = $this->db->get("temp_users");		//temp_userテーブルから情報を取得

	if($query->num_rows() == 1){
		return true;
	}else return false;
}

この時点で仮会員登録メールに表示されたURLにアクセスすると『valid key』と表示されます。

キーが正しい場合の処理を作成する

編集ファイル:application/controllers/main.php

if($this->model_users->is_valid_key($key)){	//キーが正しい場合は、以下を実行
	// echo "valid key";
	$this->model_users->add_users($key);

add_usersモデルを作成していきます。

add_usersモデルを作成する

編集ファイル:application/models/model_users.php

public function add_user($key){
	
	//keyのテーブルを選択
	$this->db->where("key", $key);
	
	//temp_usersテーブルからすべての値を取得
	$temp_user = $this->db->get("temp_users");	

	if($temp_user){
		$row = $temp_user->row();
		//$rowでは、temp_usersの行を返します。
		//しかし、このままでは1行目のみが返されるので、さらに以下を追記する。

		$data = array(	//$rowで取得した値のうち、必要な情報のみを取得する
			"email"=>$row->email,
			"password"=>$row->password
		);

		$did_add_user = $this->db->insert("users", $data);

	}
}

会員登録が完了したら、temp_userの情報を削除する

編集ファイル:application/models/model_users.php

public function add_user($key)内に以下を追加

if($did_add_user){		//did_add_userが成功したら以下を実行
	$this->db->where("key", $key);
	$this->db->delete("temp_users");
	return true;
}return false;

add_usersメソッドの実行条件を設定する

編集ファイル:application/controllers/main.php

public function resister_user($key){
	//add_temp_usersモデルが書かれている、model_uses.phpをロードする
	$this->load->model("model_users");

	if($this->model_users->is_valid_key($key)){	//キーが正しい場合は、以下を実行

		if($this->model_users->add_user($key)){	//add_usersがTrueを返したら以下を実行
			echo "success";
		}else echo "fail to add user. please try again";

	}else echo "invalid key";
}

この時点で会員登録を行なうと『success』と表示されます。
同時に、以下2点が実行されています。

  1. temp_usersのDBを確認すると、データが削除されています。
  2. usersテーブルでは、新規ユーザーのデータが挿入されています。

ユーザー追加が完了した後の処理を作っていきます。

編集ファイル:application/controllers/main.php
※現状では『success』と表示されるだけです。

//add_usersがTrueを返したら以下を実行
if($this->model_users->add_user($key)){	

	// echo "success";
	$data = array(
		"email" => ,
		"is_logged_in" => 1
	);

	$this->sessinon->set_userdata($data);
	redirect ("main/members");

}else echo "fail to add user. please try again";

このままではemailの取得でエラーが起きます。
通常では、usersのDBからemailを取得するメソッドを作成しますが、add_userの返り値を以下のように変更することで、問題を解決できます。
編集ファイル:application/models/model_users.php

if($did_add_user){		//did_add_userが成功したら以下を実行
	$this->db->where("key", $key);
	$this->db->delete("temp_users");
	
	//return true;
	return $data["email"]; 	//emailの値を返す
}return false;

その後、resister_userメソッドを以下のように変更
編集ファイル:application/controllers/main.php

//add_usersがTrueを返したら以下を実行
if($newemail = $this->model_users->add_user($key)){	

	// echo "success";
	$data = array(
		"email" => $newemail,
		"is_logged_in" => 1
	);

	$this->sessinon->set_userdata($data);
	redirect ("main/members");

}else echo "fail to add user. please try again";

これで完了\(^o^)/
ユーザー登録のできるサイトが完成しました!

コードはgithubに公開しています。
manabubannai/basicsite

※P.S:無料メルマガで発信中:過去の僕は「ブログ発信で5億円」を稼ぎました。次は「30億円」を目指します。挑戦しつつ、裏側の思考を「メルマガ」から発信します。不満足なら1秒で解約できます。無料登録は「こちら」です。