CodeIgiterで会員サイト/データベースへの会員登録

それでは、今日はデータベースへの会員情報の登録手続きをしてみたいと思います。前回作成したビューファイル『entry_check.php』から、登録ボタンをクリックするとデータベースに登録するように作成します。

データベースに登録する前にクエリのエスケープ処理について少し勉強します。PHPではSQLインジェクション攻撃を防ぐため、『mysql_real_escape_string』関数を使ってエスケープ処理していました。つまり今回のデータベース登録をPHPで書くと下記のようになると思います。

$name=$_SESSION[‘name’];
$email=$_SESSION[‘email’];
$passw=$_SESSION[‘passw’];
$picture=$_SESSION[‘picture’];
$sql=sprintf(‘INSERT INTO members SET name=”%s”,email=”%s”,
passw=”%s”,picture=”%s”‘,
mysql_real_escape_string($name),
mysql_real_escape_string($email),
mysql_real_escape_string($passw),
mysql_real_escape_string($picture));

SQLインジェクション攻撃とは、データベースと連動したWebサイトで、データベースへの問い合わせや操作を行うプログラムのパラメータに不正な値を送信して、実行されるSQLクエリを改竄してしまう攻撃方法です。場合によっては、任意のSQLクエリを実行させることができ、データベースの情報を取り出したり、破壊したりすることができるようになります。

クエリのエスケープ処理

CodeIgniterにはクエリのエスケープ処理を支援する3つのメソッドがあります。

$this->db->escape()

このメソッドは、データの型を決定し、文字列データだけをエスケープ処理します。また、自動でデータをシングルクォーテーションで囲みます。

$this->db->escape_str()

このメソッドは型を無視して渡されたデータをエスケープします。ほとんどの場合はこれを使わず、上のメソッドを利用することになると思います。

$this->db->escape_like_str()

このメソッドは、文字列の中のLIKE句で使用されるワイルドカード(‘%’,’_’)についても適切にエスケープされるように、文字列がLIKE条件で使用されるときには、このメソッドを使用するべきです。

クエリのバインディング

クエリのバインディングを使うと、クエリを見やすく記述できるだけでなく、値が自動的にエスケープされ、安全なクエリが生成されます。つまりCodeIgniterでは、下記のように書くことができます。

$name=$this->session->userdata(‘name’);
$email=$this->session->userdata(‘email’);
$passw=$this->session->userdata(‘passw’);
$picture=$this->session->userdata(‘picture’);
$sql=”INSERT INTO  members SET name=?,emai=?,passw=?,picture=?”;
$this->db->query($sql,array($name,$email,$passw,$picture));

これは便利ですね。とても重宝すると思います。

クエリのエスケープ処理はこの辺にして、『登録確認』の画面からデータベースへ実際に登録するためのメソッドへ遷移するために、ビューファイル『entry_check.php』のフォームの『action=””』を『action=”db_entry”』に変更します。

次に、データが登録されたらログイン画面へ移動するようにするために、ログイン画面のビューファイルを作成しておきます。ログインはメールアドレスとパスワードでログインするように作成したいと思います。『application/views』フォルダに『login.php』ファイル名で新規ファイルを作成して、下記のような感じで作成しておいて下さい。詳細は後ほど説明します。

今日は、データベース登録処理のコードをコントローラ内に書きますが、いずれモデルを使用したコードに書き換えると思います。コントローラ『members.php』に新しく、データベース登録のためのメソッドを作成し、下記のコード入力します。

 function db_entry()
 {
	//登録データの整理
	$name=$this->session->userdata('name');
	$email=$this->session->userdata('email');
	$passw=$this->session->userdata('passw');
	$picture=$this->session->userdata('picture');
	$created=date("Y-m-d H:i:s");

	 //データベースへの接続
	$this->load->database();
	//データの登録
	$sql="INSERT INTO members SET name=?,email=?,passw=?,picture=?,created=?";
	$this->db->query($sql,array($name,$email,$passw,$picture,$created));
	//現在のセッションをクリアします
	$this->session->sess_destroy();
	//登録後にログインページへ移動
	$this->load->view('login');
 }

それでは、ブラウザで確認してみます。会員登録のページで『名前』『メールアドレス』『パスワード』を入力後、『入力内容の確認』ボタンをクリックすると、下記のような登録確認の画面になりました。

写真は選択しませんでしたので、『アップロードするファイルが選択されていません』とエラーメッセージが出ますが、気にせず名前とメールアドレスとパスワードがうまく登録できるか『登録』ボタンをクリックしてみます。下記のようにログイン画面が表示されました。

いきなり、ログイン画面というのも味気ないので、途中で『登録ありがとうございました』のページを挟んだ方がいいかもしれません。それはいいとして、データが登録されているか確認してみます。下記のように登録されていました。

重複アカウントのチェック

1つ問題点があります。現状のプログラムでは、同じアカウント(メールアドレス)で何度でも登録ができてしまいますので、誤ってアカウントが重複してしまう可能性があります。そこで、『重複確認』をするためのプログラムを挿入します。

	//重複アカウントのチェック
	$sql="SELECT * FROM members WHERE email=?";
	$query=$this->db->query($sql,$email);
	//もしクエリの行数が1件以上あれば
	if($query->num_rows() > 0){
		//エラーメッセージを配列$errorに代入します
		$error=array('duplication'=>'指定されたメールアドレスは既に登録されています',
		'error'=>'');
		$this->load->view('entry_check',$error);
	}else{
	//データの登録
	$sql="INSERT INTO members SET name=?,email=?,passw=?,picture=?,created=?";
	$this->db->query($sql,array($name,$email,$passw,$picture,$created));
	//現在のセッションをクリアします
	$this->session->sess_destroy();
	//登録後にログインページへ移動
	$this->load->view('login');
	}

実際には、errorメッセージをhiddenで渡さなければならないのですが、プログラムが長くなりそうなので、端折りました。ですので、既にメールアドレスが登録されていて写真がアップされていない場合は、写真の項目の横にはエラーメッセージは表示されません。もう少しすっきりとしたコードの書き方があれば手直しします。

今日は、ここまでにして、次回はログインのためのプログラムを作成したいと思います。

 

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ