Tank_Authのログイン画面のカスタマイズ

Tank_Authは、導入後すぐに使えるようになっていますが、ログイン画面があまりかっこよくありません。そこで、WordPressのログイン画面のように、見た目を少し変更したいと思います。尚、スマートフォンでアクセスしてもきれいに見えるように作成してみたいと思います。

この投稿の続きを読む »

タグ

2011年10月29日 | コメント/トラックバック(0) |

カテゴリー:CodedIgniter

Tank Authの基本設定

今日は、前回導入した認証用ライブラリTank Authの基本設定を変更してみたいと思います。『application/config』フォルダの『tank_auth.php』を開きます。10行目と11行目を見てみます。

$config[‘website_name’] = ‘Your project’;
$config[‘webmaster_email’] = ‘webmaster@your-site.com’;

これは、認証ライブラリから送信されたEmail用の設定です。試しに『Your project』を『WinRoad徒然草』、『webmaster@your-site.com』を自分のメールアドレスに変更して、ユーザー登録をしてみます。

下記のようなアクティベート用メールが送信されてきました。

表題がちょっとおかしいですし、英語ですので、変更したいと思います。『application/language/japanese』フォルダの『tank_atuh_lang.php』ファイルを開き、33行目

$lang[‘auth_subject_activate’] = ‘ようこそ %s さん!’;

の『ようこそ%sさん』を『ようこそ%s へ』に変更します。

次に、『application/views/email』フォルダの『activate-html.php』ファイルを下記のように変更します。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title>Welcome to <?php echo $site_name; ?>!</title></head>
<body>
<div style="max-width: 800px; margin: 0; padding: 30px 0;">
<table width="80%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="5%"></td>
<td align="left" width="95%" style="font: 13px/18px Arial, Helvetica, sans-serif;">
<h2 style="font: normal 20px/23px Arial, Helvetica, sans-serif; margin: 0; padding: 0 0 18px; color: black;">ようこそ <?php echo $site_name; ?>へ</h2>
<?php echo $site_name; ?>への新規登録ありがとうございます。 登録が安全に行われるようにアクティベートをお願いします。<br />
アクティベートするには、下記のリンクをクリックして下さい。<br />
<br />
<big style="font: 16px/18px Arial, Helvetica, sans-serif;"><b><a href="<?php echo site_url('/auth/activate/'.$user_id.'/'.$new_email_key); ?>" style="color: #3366cc;">登録完了(アクティベート)</a></b></big><br />
<br />
リンクが動作しない場合は、下記のリンクをアドレスバーにコピーして下さい。<br />
<nobr><a href="<?php echo site_url('/auth/activate/'.$user_id.'/'.$new_email_key); ?>" style="color: #3366cc;"><?php echo site_url('/auth/activate/'.$user_id.'/'.$new_email_key); ?></a></nobr><br />
<br /><?php echo $activation_period; ?> 時間以内に、アクティベートを完了させて下さい。そうでなければ、登録は無効になり、再登録する必要があります。<br />
<br />
<br />
<?php if (strlen($username) > 0) { ?>あなたのお名前: <?php echo $username; ?><br />
<?php } ?>あなたのEメールアドレス: <?php echo $email; ?><br />
<?php if (isset($password)) { /* ?>Your password: <?php echo $password; ?><br /><?php */ } ?>
<br />
<br />
楽しい時を過ごして下さい!<br /><?php echo $site_name; ?> チーム</td>
</tr>
</table>
</div>
</body>
</html>

次に、スパム登録防止用のcapthca画像がデフォルトでは、ものすごく見づらい(大文字と小文字の判別がつきにくい、数字なのかアルファベットなのか判別しづらい)ですので、変更します。
『application/config』フォルダの『tank_auth.php』ファイルを開き、113行目

$config[‘captcha_fonts_path’] = ‘captcha/fonts/5.ttf’;

の最後を『4.ttf;』に変更します。これは各自の好みで変更して下さい。私はこれが一番読みやすかったです(読みやすい文字がスパム防止になるかどうかはわかりませんが、登録時のいらいらからは解消されました)。

それでは、ブラウザで確認してみます。アクティベート用のメールが下記のように変更になりました。

次に、『application/views/auth』フォルダの『login_form.php』ファイルを日本語にします。

<?php
$login = array(
	'name'	=> 'login',
	'id'	=> 'login',
	'value' => set_value('login'),
	'maxlength'	=> 80,
	'size'	=> 30,
);
if ($login_by_username AND $login_by_email) {
	$login_label = 'ログイン名又はEmail';
} else if ($login_by_username) {
	$login_label = 'ログイン名';
} else {
	$login_label = 'Email';
}
$password = array(
	'name'	=> 'password',
	'id'	=> 'password',
	'size'	=> 30,
);
$remember = array(
	'name'	=> 'remember',
	'id'	=> 'remember',
	'value'	=> 1,
	'checked'	=> set_value('remember'),
	'style' => 'margin:0;padding:0',
);
$captcha = array(
	'name'	=> 'captcha',
	'id'	=> 'captcha',
	'maxlength'	=> 8,
);
?>
<?php echo form_open($this->uri->uri_string()); ?>
<table>
	<tr>
		<td><?php echo form_label($login_label, $login['id']); ?></td>
		<td><?php echo form_input($login); ?></td>
		<td style="color: red;"><?php echo form_error($login['name']); ?><?php echo isset($errors[$login['name']])?$errors[$login['name']]:''; ?></td>
	</tr>
	<tr>
		<td><?php echo form_label('パスワード', $password['id']); ?></td>
		<td><?php echo form_password($password); ?></td>
		<td style="color: red;"><?php echo form_error($password['name']); ?><?php echo isset($errors[$password['name']])?$errors[$password['name']]:''; ?></td>
	</tr>

	<?php if ($show_captcha) {
		if ($use_recaptcha) { ?>
	<tr>
		<td colspan="2">
			<div id="recaptcha_image"></div>
		</td>
		<td>
			<a href="javascript:Recaptcha.reload()">Get another CAPTCHA</a>
			<div class="recaptcha_only_if_image"><a href="javascript:Recaptcha.switch_type('audio')">Get an audio CAPTCHA</a></div>
			<div class="recaptcha_only_if_audio"><a href="javascript:Recaptcha.switch_type('image')">Get an image CAPTCHA</a></div>
		</td>
	</tr>
	<tr>
		<td>
			<div class="recaptcha_only_if_image">Enter the words above</div>
			<div class="recaptcha_only_if_audio">Enter the numbers you hear</div>
		</td>
		<td><input type="text" id="recaptcha_response_field" name="recaptcha_response_field" /></td>
		<td style="color: red;"><?php echo form_error('recaptcha_response_field'); ?></td>
		<?php echo $recaptcha_html; ?>
	</tr>
	<?php } else { ?>
	<tr>
		<td colspan="3">
			<p>Enter the code exactly as it appears:</p>
			<?php echo $captcha_html; ?>
		</td>
	</tr>
	<tr>
		<td><?php echo form_label('Confirmation Code', $captcha['id']); ?></td>
		<td><?php echo form_input($captcha); ?></td>
		<td style="color: red;"><?php echo form_error($captcha['name']); ?></td>
	</tr>
	<?php }
	} ?>

	<tr>
		<td colspan="3">
			<?php echo form_checkbox($remember); ?>
			<?php echo form_label('ログインの記憶', $remember['id']); ?>
			<?php echo anchor('/auth/forgot_password/', 'パスワードの紛失'); ?>
			<?php if ($this->config->item('allow_registration', 'tank_auth')) echo anchor('/auth/register/', '新規登録'); ?>
		</td>
	</tr>
</table>
<?php echo form_submit('submit', 'ログイン'); ?>
<?php echo form_close(); ?>

同じフォルダ内の『register_form.php』ファイルを下記のように変更します。

<?php
if ($use_username) {
	$username = array(
		'name'	=> 'username',
		'id'	=> 'username',
		'value' => set_value('username'),
		'maxlength'	=> $this->config->item('username_max_length', 'tank_auth'),
		'size'	=> 30,
	);
}
$email = array(
	'name'	=> 'email',
	'id'	=> 'email',
	'value'	=> set_value('email'),
	'maxlength'	=> 80,
	'size'	=> 30,
);
$password = array(
	'name'	=> 'password',
	'id'	=> 'password',
	'value' => set_value('password'),
	'maxlength'	=> $this->config->item('password_max_length', 'tank_auth'),
	'size'	=> 30,
);
$confirm_password = array(
	'name'	=> 'confirm_password',
	'id'	=> 'confirm_password',
	'value' => set_value('confirm_password'),
	'maxlength'	=> $this->config->item('password_max_length', 'tank_auth'),
	'size'	=> 30,
);
$captcha = array(
	'name'	=> 'captcha',
	'id'	=> 'captcha',
	'maxlength'	=> 8,
);
?>
<?php echo form_open($this->uri->uri_string()); ?>
<table>
	<?php if ($use_username) { ?>
	<tr>
		<td><?php echo form_label('ユーザー名', $username['id']); ?></td>
		<td><?php echo form_input($username); ?></td>
		<td style="color: red;"><?php echo form_error($username['name']); ?><?php echo isset($errors[$username['name']])?$errors[$username['name']]:''; ?></td>
	</tr>
	<?php } ?>
	<tr>
		<td><?php echo form_label('メールアドレス', $email['id']); ?></td>
		<td><?php echo form_input($email); ?></td>
		<td style="color: red;"><?php echo form_error($email['name']); ?><?php echo isset($errors[$email['name']])?$errors[$email['name']]:''; ?></td>
	</tr>
	<tr>
		<td><?php echo form_label('パスワード', $password['id']); ?></td>
		<td><?php echo form_password($password); ?></td>
		<td style="color: red;"><?php echo form_error($password['name']); ?></td>
	</tr>
	<tr>
		<td><?php echo form_label('パスワード再入力', $confirm_password['id']); ?></td>
		<td><?php echo form_password($confirm_password); ?></td>
		<td style="color: red;"><?php echo form_error($confirm_password['name']); ?></td>
	</tr>

	<?php if ($captcha_registration) {
		if ($use_recaptcha) { ?>
	<tr>
		<td colspan="2">
			<div id="recaptcha_image"></div>
		</td>
		<td>
			<a href="javascript:Recaptcha.reload()">Get another CAPTCHA</a>
			<div class="recaptcha_only_if_image"><a href="javascript:Recaptcha.switch_type('audio')">Get an audio CAPTCHA</a></div>
			<div class="recaptcha_only_if_audio"><a href="javascript:Recaptcha.switch_type('image')">Get an image CAPTCHA</a></div>
		</td>
	</tr>
	<tr>
		<td>
			<div class="recaptcha_only_if_image">Enter the words above</div>
			<div class="recaptcha_only_if_audio">Enter the numbers you hear</div>
		</td>
		<td><input type="text" id="recaptcha_response_field" name="recaptcha_response_field" /></td>
		<td style="color: red;"><?php echo form_error('recaptcha_response_field'); ?></td>
		<?php echo $recaptcha_html; ?>
	</tr>
	<?php } else { ?>
	<tr>
		<td colspan="3">
			<p>下記に表示されるコードを入力して下さい</p>
			<?php echo $captcha_html; ?>
		</td>
	</tr>
	<tr>
		<td><?php echo form_label('確認コード', $captcha['id']); ?></td>
		<td><?php echo form_input($captcha); ?></td>
		<td style="color: red;"><?php echo form_error($captcha['name']); ?></td>
	</tr>
	<?php }
	} ?>
</table>
<?php echo form_submit('register', '登録'); ?>
<?php echo form_close(); ?>

パスワード再発行のためのフォーム『forgot_password_form.php』も下記のように変更します。

<?php
$login = array(
	'name'	=> 'login',
	'id'	=> 'login',
	'value' => set_value('login'),
	'maxlength'	=> 80,
	'size'	=> 30,
);
if ($this->config->item('use_username', 'tank_auth')) {
	$login_label = 'Email又はユーザ名';
} else {
	$login_label = 'Email';
}
?>
<?php echo form_open($this->uri->uri_string()); ?>
<table>
	<tr>
		<td><?php echo form_label($login_label, $login['id']); ?></td>
		<td><?php echo form_input($login); ?></td>
		<td style="color: red;"><?php echo form_error($login['name']); ?><?php echo isset($errors[$login['name']])?$errors[$login['name']]:''; ?></td>
	</tr>
</table>
<?php echo form_submit('reset', '新しいパスワードの発行'); ?>
<?php echo form_close(); ?>

それと、パスワード再発行用のメールも変更します。『application/views/email』フォルダの『fogot_password_html.php』ファイルを下記のように変更します。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title><?php echo $site_name; ?>の新規パスワード作成</title></head>
<body>
<div style="max-width: 800px; margin: 0; padding: 30px 0;">
<table width="80%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="5%"></td>
<td align="left" width="95%" style="font: 13px/18px Arial, Helvetica, sans-serif;">
<h2 style="font: normal 20px/23px Arial, Helvetica, sans-serif; margin: 0; padding: 0 0 18px; color: black;">新しいパスワードを作成します</h2>
パスワードをお忘れですか?大丈夫です。<br />
下記のリンクをクリックして新しいパスワードを作成して下さい。<br />
<br />
<big style="font: 16px/18px Arial, Helvetica, sans-serif;"><b><a href="<?php echo site_url('/auth/reset_password/'.$user_id.'/'.$new_pass_key); ?>" style="color: #3366cc;">新しいパスワードの作成</a></b></big><br />
<br />
リンクが動作しない場合は、下記のリンクをアドレスバーにコピーして下さい。<br />
<nobr><a href="<?php echo site_url('/auth/reset_password/'.$user_id.'/'.$new_pass_key); ?>" style="color: #3366cc;"><?php echo site_url('/auth/reset_password/'.$user_id.'/'.$new_pass_key); ?></a></nobr><br />
<br />
<br />
<a href="<?php echo site_url(''); ?>" style="color: #3366cc;"><?php echo $site_name; ?></a> ユーザーによりパスワード紛失の手続きが取られましたので、このメールを発行いたしました。 これは、新しいパスワードを作成する手続きの一部です。もし、あなたが新しいパスワードの発行を依頼していないのであれば、このメールを無視して下さい。以前のパスワードのままでご利用になれます。 <br />
<br />
<br />
ありがとうございました。<br />
<?php echo $site_name; ?> チーム</td>
</tr>
</table>
</div>
</body>
</html>

それでは、ブラウザで確認してみます。まずは、ログイン画面です。

次に、新規登録をクリックしてみます。

ログイン画面に戻って、今度は、パスワードの紛失をクリックしてみます。

新しいパスワードの発行をクリックしてみます。下記のようなメールが届きました。

修正自体も難しくありませんので、他にも『application/views』フォルダ内の『auth』フォルダと『mail』フォルダに色々ファイルがありますので、自分好みに修正して下さい。

尚、使い方は、『application/controllers』フォルダに上書き保存した『welcom.php』を見てみてば、わかると思いますが、一応説明しておきます。

$this->load->helper(‘url’);
$this->load->library(‘tank_auth’);

コンストラクタで、urlヘルパとtank_authライブラリを読み込んでいます。urlヘルパはredirectを利用するために読み込んでいます。

if (!$this->tank_auth->is_logged_in()) {
redirect(‘/auth/login/’);

これは、ログイン(認証)していなければ、『application/controllers』の『auth.php』の『login』メソッドへ移動します。

$data[‘user_id’] = $this->tank_auth->get_user_id();
$data[‘username’] = $this->tank_auth->get_username();
$this->load->view(‘welcome’, $data);

『user_id』と『username』のデータを配列$dataに代入して、ビューファイル『welcom』を開きます。

たったこれだけでユーザー認証ができるのはかなり便利です。

本日は、以上です。

タグ

2011年9月8日 | コメント/トラックバック(2) |

カテゴリー:CodedIgniter

CodeIgniterでTank Authの導入

認証用のライブラリ『Tank Auth』を導入して、使い心地を試してみようと思います。下記アドレスにアクセスして、『Download Tank Auth』をクリックします。

http://www.konyukhov.com/soft/tank_auth/

ダウンロードしたZipファイルには、『application』フォルダ、『captcha』フォルダ、『schema.sql』ファイルがあります。『captcha』フォルダはルートフォルダ(applicationフォルダと同じ階層)にコピーします。

次に、『application』フォルダをクリックしてみると、『config』『controllers』『helpers』『language』『libraries』『models』『views』フォルダがありますので、それぞれのフォルダの中身を同じ名前のフォルダにコピーして下さい。絶対にフォルダごとコピーしないで下さい。せっかく作った自分自身のファイルを上書きしないように、注意して下さい。

次に、サーバーのPHPMyAdminを開き、『インポート』タブをクリックし、ダウンロードした『schema.sql』ファイルを選択し、『実行する』ボタンをクリックします。

4つのテーブルが作成されました。

ブラウザで確認してみます。『http://ci.builwing.co.jp』と入力してみます。強制的に、認証ページ『auth/login』へリダイレクトしています。

それでは、『Register』をクリックして、ユーザーデータを登録してみましょう。

データが登録されたら、登録したEメールアドレスにアクティベート用のメールが届きます。

届いたメールの『Finish your registration』をクリックすると、再び『ログイン』画面になりますので、名前とパスワードを入力すれば、登録OKです。

ただ、結構あちこちで文字化けしますので、色々修正が必要な気がします。

時間があれば、細かい設定等もそのうちにしてみたいと思います。本日は以上です。

タグ

2011年9月7日 | コメント/トラックバック(0) |

カテゴリー:CodedIgniter

CodeIgniterで会員サイトの訂正

keiji様より、『Form validationのルールで htmlspecialchars してしまうと、保存するデータがおかしくなりませんか?』とのご指摘がありましたので、検証してみました。

会員登録のお名前を『7&i』と入力してみました。

登録確認画面でも、『7&i』と表示しています。

会員登録チェックのページでは、普通に表示していましたので、大丈夫かなと思ったのですが、登録されたデータベースを確認してみたら、『7&amp;i』となっていました。

『form_validation.php』でXSSフィルタリングの検証もできたら、楽かなと考えましたが、浅はかでした。やはり出力時にエスケープする必要がありそうです。

そこで、横着者の私は、kenji様のコードをお借りして、ヘルパを作成しようと思いました。『application/helpers』フォルダに『xssfilter_helper.php』ファイル名で、下記のコードを入力、作成しました。

<?php
//変数のエスケープ処理
function h($var)
{
	if (is_array($var))
	{
		return array_map('h', $var);
	}
	else
	{
		return htmlspecialchars($var, ENT_QUOTES, config_item('charset'));
	}
}

//URIのエスケープ処理
function allow_url($str)
{
	if (preg_match('/\Ahttp(s?):/', $str) OR
		preg_match('#\A/#', $str))
	{
		return h($str);
	}
	else
	{
		$backtrace = debug_backtrace();
		$view = $backtrace[0]['file'];
		$line = $backtrace[0]['line'];

		log_message('error',
				'allow_url() got unallowable string: "' . $str . '" in ' . $view .
				' on line ' . $line);
		return 'Error';
	}
//イベントハンドラ内の文字列リテラル
// 文字列をすべて \uXXXX 形式に変換
function unicode_escape($matches)
{
	$u16 = mb_convert_encoding($matches[0], 'UTF-16');
	return preg_replace('/[0-9a-f]{4}/', '\u$0', bin2hex($u16));
}

// 英数字とマイナス、ピリオド以外を \uXXXX 形式でエスケープ
function escape_js_str($str)
{
	return preg_replace_callback('/[^-\.0-9a-zA-Z]+/u',
					'unicode_escape', $str);
}
//style要素内で数字だけを許可するヘルパー
function allow_num($str)
{
	$CI =& get_instance();
	$CI->load->library('form_validation');

	if ($CI->form_validation->numeric($str))
	{
		return $str;
	}
	else {
		$backtrace = debug_backtrace();
		$view = $backtrace[0]['file'];
		$line = $backtrace[0]['line'];

		log_message('error',
				'allow_num() got unallowable string: "' . $str . '" in ' . $view .
				' on line ' . $line);
		return 'Error';
	}
}
//style要素内でアルファベットと数字、アンダースコア(_)、ダッシュ(-)を許可するヘルパー
function allow_alnum($str)
{
	$CI =& get_instance();
	$CI->load->library('form_validation');

	if ($CI->form_validation->alpha_dash($str))
	{
		return $str;
	}
	else {
		$backtrace = debug_backtrace();
		$view = $backtrace[0]['file'];
		$line = $backtrace[0]['line'];

		log_message('error',
				'allow_alnum() got unallowable string: "' . $str . '" in ' . $view .
				' on line ' . $line);
		return 'Error';
	}
}
}

それでは、『application/config』フォルダの『form_validation.php』のmembers検証グループを次のように変更します。全てのhtmlspecialcharsを外しました。

	'members'=>array(
		array(
			'field'  => 'name',
			'labbel' => 'お名前',
			'rules'  => 'required'
		),
		array(
			'field'  => 'email',
			'labbel' => 'メールアドレス',
			'rules'  => 'required|valid_email'
		),
		array(
			'field'  => 'passw',
			'label'  => 'パスワード',
			'rules'  => 'required|min_length[4]|md5'
		),
		array(
			'field'  => 'picture',
			'label'  => '写真',
			'rules'  => ''
		)
	)

次に、コントローラmembersのコンストラクタに先程作成したヘルパーを追加します。

$this->load->helper(array(‘form’,’url’,’xssfilter’));

作成したヘルパーは『xssfilter_helper.php』なのに、何故、ヘルパーの指定は、『xssfilter_helper』では、なくて、『xssfilter』なのでしょう。これは、ヘルパーの仕様で、ヘルパの物理ファイル名の末尾には『_helper』というサフィックスがついていますが、呼び込むときは、サフィックスは不要だということです。

次に、ビューファイル『entry_check.php』のecho文にフィルタをかけてエスケープします。フィルタをかけると言っても『h()』で囲うだけですが、『echo $name』を『echo h($name)』に変更します。同様に他のecho文もフィルタをかけて下さい。

本日は以上でした。

 

WinRoadお奨め書籍

たしか、kenji様もご推奨だと思いましたので、早速購入しました。セキュリティ本は、ほとんどが中級以上の人が対象ですので、読んでいても意味不明な箇所が多いのですが、この本は、初心者でもある程度の流れみたいなものはつかめると思います。

Webアプリケーションには、どういう罠が潜んでいて、どういう対処が必要か事細かに書かれていますので、Webサイト、ましてや会員サイト等を作りたいと考えている人は、是非一読下さい。できれば、手元に置いて、セキュリティチェックの糧にして下さい。

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践

posted with amazlet at 11.08.26
徳丸 浩
ソフトバンククリエイティブ
売り上げランキング: 675

タグ

2011年8月27日 | コメント/トラックバック(0) |

カテゴリー:CodedIgniter

CodeIgniterで会員サイト/ログインページの作成

今日は、登録した会員情報でログインするための処理を作成します。プログラムの流れとして、会員サイトのトップページにアクセスした場合、基本的にログインページへ移動するように作成します。但し、既にログインできている場合は、ログインページへ移動しないで、そのままトップページを表示します。

それでは、実際に作成しながら考えていきましょう。ログイン用のページは前回作成しましたが、ログイン後のトップページを作成しておきます。空白でも構いませんが、味気ないので、『ようこそ、Wirnroad会員サイトへ』と表示したページを『application/views』フォルダに『top.php』ファイル名で保存します。

まず、前回作成したビューファイル『login.php』を開きます。『<?php echo validation_errors();?>』をフォームの上に入力し、フォームのアクションに『login』と入力します。

それと、テキストフィールド名を『email』『passw』に変更しておきます。これは、次で設定する検証グループ『login』の配列『filed』の名称と同じにします。

そして、『application/config』フォルダの『form_validation.php』に新しい検証グループ『login』を作成します。

  'login'=>array(
 array(
 'field' => 'email',
 'labbel' => 'メールアドレス',
 'rules' => 'required|htmlspecialchars|valid_email'
 ),
 array(
 'field' => 'passw',
 'label' => 'パスワード',
 'rules' => 'required|htmlspecialchars|md5'
 )
 )

それでは、コントローラの『members.php』に『login』メソッドを追加します。

 function login()
 {
	 //フォームバリデーションに登録してあるloginがFALSEなら
	if($this->form_validation->run('login') == FALSE)
	 {
		 //ビューファイル『login.php』を開きます。
		$error=array('login_err'=>'');
		$this->load->view('login',$error);
	//フォームバリデーションが全てOKなら
	 }else{
	 //入力データの整理
	 $email=$_POST['email'];
	 $passw=$_POST['passw'];

	 //データベースへの接続
	 $this->load->database();
	 //ログイン処理
	$sql="SELECT * FROM members WHERE email=? AND passw=?";
	$query=$this->db->query($sql,array($email,$passw));
	//もしクエリの行数が1件以上あれば
		if($query->num_rows() > 0)
		{
			$this->session->set_userdata(
				array('email'=>$email,'passw'=>$passw));
			$this->load->view('top');
		}else{
			$error=array('login_err'=>'メールアドレスかパスワードが違います');
			$this->load->view('login',$error);
		}
 	 }
  }

次に、ビューファイル『login.php』に新規登録ファイルへ戻るリンクとエラーメッセージの表示箇所を作成します。新規登録の文字をドラッグして選択し、リンク先を『entry』と入力します。次にログインページの下の方に『<?php echo $login_err;?>』を挿入します。

それでは、ブラウザで確認してみましょう。まずバリデーションのチェックです。メールアドレスに『nakada.info』パスワードを空白にして、ログインボタンを押してみます。

次に、間違ったパスワードで入力してみます。

最後に、正しいメールアドレスとパスワードを入力すると、トップページへ移動します。

それでは、毎回ログインページを経由するのではなく、セッションユーザデータの『email』と『passw』が会員データベーステーブル『members』のデータと一致したら、直接トップページへ移動するように設定します。『application/controllers』フォルダの『members』ファイルを開き、『index』メソッドを作成し、下記のコードを入力します。

  function index()
  {
	 //データベースへの接続
	 $this->load->database();
	 //セッションユーザデータの取得
	 $email=$this->session->userdata('email');
	 $passw=$this->session->userdata('passw');
	 //ログイン処理
	$sql="SELECT * FROM members WHERE email=? AND passw=?";
	$query=$this->db->query($sql,array($email,$passw));
	//もしクエリの行数が1件以上あれば
		if($query->num_rows() > 0)
		{
			//トップページへ移動
			$this->load->view('top');
	//クエリの件数が0件なら
		}else{
			//ログインページへ移動
			redirect('members/login');
		}
  }

それでは、ブラウザで確認してみます。

『http://ci.builwing.co.jp/members』と入力してみます。一度ログインできていれば、直接トップページへ移動します。

尚、セッションが終了するまでの秒数は、デフォルで2時間(7200秒)となっています。有効期限を変更したい場合は、『application/config』フォルダの『config.php』ファイルを開き248行目あたりの『$config[‘sess_expiration’]=7200;』の数字を変更して下さい。有効期限のないセッションを使いたい場合は0に設定して下さい。とりあえず、今回は3日間(60×60×24×3=259,200)に設定してみます。

本日は以上です。次回からは、このトップページをツイッター風の会員サイトにしてみたいと思います。お楽しみに!!

タグ

2011年8月26日 | コメント/トラックバック(0) |

カテゴリー:CodedIgniter

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

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

 

タグ

2011年8月24日 | コメント/トラックバック(0) |

カテゴリー:CodedIgniter

CodeIgniterで会員サイト

今日からCodeIgniterで実践的なプログラムを作成しながら勉強していきたいと思います。やはりPHPを勉強する人に人気のある会員専用サイトを作成していきたいと思います。作成には、プログラム初心者にも分かり易いDreamweaverを使用して作成していきます。それでは、会員専用のデータベースから作成したいと思います。

尚、試行錯誤しながら作成していきますので、コードと画像が違う場合がありますが、コードの方が正しいと思って下さい。画像の取り直しは面倒ですので、省略しています。

データベーステーブルの項目は、次の7項目『id(会員ID)』『name(氏名)』『email(メールアドレス)』『passw(パスワード)』『picture(写真のパス)』『created(入会日)』『modified(変更日)』にします。SQLを下記に記載しておきます。データベース名の箇所は、各自のデータベース名に変更して下さい。

CREATE TABLE  `データベース名`.`members` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 100 ) NOT NULL ,
`email` VARCHAR( 255 ) NOT NULL ,
`passw` VARCHAR( 100 ) NOT NULL ,
`picture` VARCHAR( 255 ) NULL ,
`created` DATETIME NOT NULL ,
`modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE = MYISAM

次に、画像をアップするためのフォルダを前回で作成した『uploads』フォルダの下に、『members_picture』名で作成し、パーミッションを777にセットします。やり方がわからない方は、『CodeIgnieterのファイルアップロードクラス』を参考にして下さい。それでは、会員登録用のビューファイルを先に作成します。『application/controllers』フォルダに『entry.php』ファイルを作成します。

フォームタブのフォームをクリックして、フォームの赤い枠が作成されたら、その中に、一般タブのテーブルをクリックして、6行2列のテーブルを作成し、表題を『会員登録』『お名前』『メールアドレス』『パスワード』『写真』と入力し、6行目の列を結合し、フォームタブのボタンを挿入し、名前を『入力内容の確認』に変更しましたら、いったん保存します。

次に入力内容のページも作成します。とりあえず今のトップの表題を『登録確認』に変更して、『entry_check.php』名で別名保存します。
それでは、フォームバリデーションの追加です。『application/config』フォルダの『form_validation.php』ファイルに下記のコードを追加します。

尚、kenji様のご指摘でCodeIgniterのXSSフィルタリングは使用しない方がいいとのことでしたので、全ての項目をhtmlspecialcharsでエスケープ処理しています。

'members'=>array
  array(
 'field' => 'name',
 'labbel' => 'お名前',
 'rules' => 'required|htmlspecialchars'
 ),
 array(
 'field' => 'email',
 'labbel' => 'メールアドレス',
 'rules' => 'required|htmlspecialchars|valid_email'
 ),
 array(
 'field' => 'passw',
 'label' => 'パスワード',
 'rules' => 'required|htmlspecialchars|min_length[4]'
 ),
 array(
 'field' => 'picture',
 'label' => '写真',
 'rules' => 'htmlspecialchars'
 )
)

次に再度ビューファイルを変更します。『application/views』フォルダの『entry.php』ファイルを開き、フォームバリデーションクラスのところでやったように、下記の2行を追加し、その下の1行を削除します。画像では、『form_open()』ですが、写真もアップできるように作成しましたので、『form_open_multipart()』に変更しました。

<?php echo validation_errors();?>
<?php echo form_open_multipart('members/entry');?>

そして、2行2列目をクリックし、フォームタブのフィールドをクリックし、テキストフィールドを挿入します。そして、下のプロパティで、テキストフィールド名を先程、『form_validation.php』で設定した名前に変更します。初期値のところに『<?php echo set_value(‘name’);?>と入力します。メールアドレス、パスワードも同様に設定します。ここでは、フォームバリデーションに沿って上の方にエラーを表示するようにしています。

写真の右の列をクリックし、フォームタグのファイルフィールドを挿入します。そしてファイルフィールド名を必ず『userfile』に変更して下さい。

それでは、コントローラを作成します。『application/controllers』フォルダに『members.php』ファイル名で作成し、下記のコードを入力して下さい。

class Members extends CI_Controller
{
 function __construct()
 {
	 parent::__construct();
	 //プロファイラを有効にする
	 $this->output->enable_profiler(TRUE);
	 $this->load->library(array('form_validation','session'));
	 $this->load->helper(array('form','url'));
 }
 function entry()
 {
	 //form_validation.phpに登録してあるmembersがFALSEなら
	 if($this->form_validation->run('members') == FALSE)
	 {
		 //ビューファイル『entry.php』を開きます
		 $this->load->view('entry');
	//フォームバリデーションが全てOKなら
	 }else{
		 //POST送信された値をセッションデータに保存します
		 $name=$_POST['name'];
		 $email=$_POST['email'];
		 $passw=$_POST['passw'];
		 $this->session->set_userdata(array(
		 				'name' => $name,
						'email' => $email,
						'passw' => $passw));
	//ファイルアップロードのためのオプションを設定します
	$config['upload_path'] ='./uploads/members_picture/';
	$config['allowed_types']= 'gif|jpg|png';
	$config['max_size']='100';
	$config['max_width']='1024';
	$config['max_height']='768';
	$config['encrypt_name']='TRUE';//ファイル名を暗号文字に変換します
	//上記設定に基づいたアップロードクラスを呼び出します
	$this->load->library('upload',$config);
	//ファイルがアップロードされなければ
	if(!$this->upload->do_upload())
	{
		//セッションpictureがセットされていなければ
		if(!$this->session->userdata('picture'))
		{
			//エラーメッセージを変数$errorに代入します
			$error=array('error'=>$this->upload->display_errors());
		//セッションpictureがセットされていれば
		}else{
			//エラーメッセージを初期化します
			$error=array('error'=>'');
	}
	//ファイルがアップロードされたら
	}else{
		//アップロードファイル名を取得します
		$data=$this->upload->data();
		$picture=$data['file_name'];
		//取得したファイル名をセッションデータに保存します
		$this->session->set_userdata(array('picture'=>$picture));
		//エラーメッセージを初期化します
		$error=array('error'=>'');
	 }
		//ビューファイル『entry_check.php』を開きます
		 $this->load->view('entry_check',$error);
	}
 }
}

かなり細かに注釈をつけましたので、余り説明の必要がないと思いますが、少し補足します。

$this->output->enable_profiler(TRUE);

これは、プロファイラを有効にするメソッドです。プロファイラは、『メモリ使用量』『ベンチマーク結果』『URI文字列』『GET/POSTデータ』『実行したクエリ』を配置したコントローラ内で表示します。『$_GET、$_POSTデータやSQLクエリに誤りがないかどうかも確かめながら開発することができます。効率の悪いコードも発見することができます。ただ、検証が終わった後は、引数を『FALSE』にするか削除して下さい。プロファイラは下記のように表示されます。

$this->form_validation->run(‘members’)

先程作成した『application/config』フォルダの『form_validatio.php』ファイルの中の配列『members』の条件によってフォームバリデーションされます。ブラウザで確認してみます。メールアドレスを未入力で送信してみました。

$this->session->set_userdata(array( ‘name’ => $name, ‘email’ => $email, ‘passw’ => $passw));

バリデーションがOKなら、ポスト送信されたデータ『name』『emai』『passw』をセッションユーザーデータに保存します。

次にファイルをアップロードするためのオプションを設定します。

$config[‘encrypt_name’]=’TRUE’;

ファイル名をランダムなファイル文字列に変換します。ユーザーが画像をアップロードしたときに同じファイル名が重ならないための工夫です。

$this->load->library(‘upload’,$config);

上記設定ファイル$configに基づいたアップロードクラスを呼び出します。

if(!$this->session->userdata(‘picture’)){
   $error=array(‘error’=>$this->upload->display_errors());
 }else{
$error=array(‘error’=>”);

画像データはユーザ登録の前にアップロードされますので、画像以外のデータの入力直しをしても画像は送信しなくてもいいようにエラーメッセージの処理をします。

$data=$this->upload->data();
$picture=$data[‘file_name’];
$this->session->set_userdata(array(‘picture’=>$picture));
$error=array(‘error’=>”);

次にファイルがアップロードされたら、取得したセッションファイル名をセッションデータ『picture』にセットし、エラーメッセージを初期化します。

ビューファイル『entry_check.php』ファイルを下記のように変更します。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>会員登録チェック</title>
</head>

<body>
<?php
$name=$this->session->userdata('name');
$email=$this->session->userdata('email');
$passw=$this->session->userdata('passw');
$picture=$this->session->userdata('picture');
?>
  <div id="form">
    <table width="400" border="1" align="center">
      <tr>
        <th colspan="2" scope="row">登録確認</th>
      </tr>
      <tr>
        <th width="156" scope="row">お名前</th>
        <td width="228"><label for="name"><?php echo $name;?></label></td>
      </tr>
      <tr>
        <th scope="row">メールアドレス</th>
        <td><label for="email"><?php echo $email;?></label></td>
      </tr>
      <tr>
        <th scope="row">パスワード</th>
        <td><label for="passw"><?php echo $passw;?></label></td>
      </tr>
      <tr>
        <th scope="row">写真名</th>
        <td><label for="usefile"><?php echo $picture;?><?php echo $error;?></label></td>
      </tr>
      <tr>
        <th colspan="2" scope="row"><?php echo anchor('members/entry','もう一度');?>
          <input type="submit" name="button" id="button" value="登録" /></th>
      </tr>
      </table>
</div>
</body>
</html>

それでは、ブラウザで送信後の状態を確認してみましょう。

それでは、本日の作業内容を整理します。

  • 会員サイト用のデータベーステーブル『members』を作成。
  • バリデーションファイル『forum_validatio.php』ファイルに新しいバリデーションルールグループを作成
  • ビューファイル『entry.php』ファイルを作成
  • バリデーションのエラー表示箇所とデータ送信用のフィールドを作成
  • ビューファイル『entry_check.php』ファイルを作成
  • コントローラ『members.php』ファイルを作成

次にプログラムの流れを整理します。

  1. ブラウザで『http://ci.builwing.co.jp/members/entry』にアクセスすると、会員登録用の『enrty.php』ファイルを開きます。
  2. 『entry.php』ファイルからPOST送信されたデータがバリデーション条件をクリアしたら、POST送信された値をセッションユーザデータに保存します。
  3. もし画像が選択されていたら、アップロード条件そって画像をアップロードします。
  4. ファイルがアップロードされたらランダムな文字列に変更されたアップロードファイル名を取得します。
  5. 取得したファイル名をセッションユーザデータ『picture』にセットします。
  6. ビューファイル『entry_check』を開きます。
  7. 『entry_check』に入力された値を表示します。

本日は、以上までの行程でした。次回は、データベースに会員情報を保存するところまでやりたいと思います。

Adobe Dreamweaver CS5.5 Windows版
Adobe Dreamweaver CS5.5 Windows版

posted with amazlet at 11.08.20
アドビシステムズ (2011-05-20)
売り上げランキング: 349

タグ

2011年8月22日 | コメント/トラックバック(2) |

カテゴリー:CodedIgniter

CodeIgniterのページネーションクラス

今日は、CodeIgniterのページネーションクラスを調べてみます。皆さんはページネーションという言葉をご存じでしょうか。googleをよくご利用の方ならおわかりと思いますが、検索ページの下の方に表示される複数のページ間を移動するためのリンクナビゲーションをページネーションと言います。

CodeIgniterのページネーションクラスは、この機能を簡単なコマンドで実施することができます。それでは、実際に見てみましょう。

以前『CodeIgniterでテーブルの一覧を表示する』で使用したデータを使用します。普通に表示してみます。

データ数はあまり多くありませんが、全部で13件のデータがあります。これを5件ごとに3ページに分けて表示してみたいと思います。

『dvd_list_view.php』ファイルのテーブルの下に、ページネーションを表示する下記のコードを追加します。

<?php echo $this->pagination->create_links();?>

続いて、コントローラの『dvd_list.php』ファイルを変更します。

コンストラクタにページネーションクラスを呼び込む下記のコードを追加します。

$this->load->library('pagination');

funciton index()に下記のコードを追加変更します。

$lm='5';
$of=$this->uri->segment(3);
$data['records']=$this->db->get('dvd',$lm,$of)->result_array();
$config['base_url']='http://ci.builwing.co.jp/dvd_list/index':
$config['total_rows']=$this->db->count_all_result('dvd');
$this->pagination->initialize($config);

コードの説明

簡単にコードの説明をします。まず、データベースのリミット値とオフセット値をあらかじめ変数として用意しておきます。リミット値は変数$lmに5を代入します。オフセット値には、変数$ofにURIクラスの第3引数を代入します。つまり、ページネーションがクリックされたときのURIの最後の数字です。言葉ではわかりづらいので、ブラウザに表示してみます。

オフセットとは、あるデータの位置を、基準点からの差(距離)で表した値のこと。「offset」は英語で「差し引き計算する」という意味で、そこから転じて、必要なデータの位置を基準点からの差(距離)で表した値のことをオフセットと呼んでいます。

ブラウザに『http://ci.builwing.co.jp/dvd_list』と入力すると、テーブルの下に、『1 2 3 >』と表示されました。

数字の2をクリックすると、ブラウザのアドレスが『http://ci.builwing.co.jp/dvd_list/index/5』と表示されているのがわかると思います。数字の3をクリックすると、ブラウザのアドレスが『http://ci.builwing.co.jp/dvd_list/index/10』と表示されて、3ページ目のデータが表示されます。

このように、CodeIgniteerのページネーションクラスは、デフォルトでは、指定した『base_url』にオフセット値を付加したURIを返す仕様になっています。

$config配列について

$config 配列は、ユーザ設定の変数を格納します。 20程度の項目を設定できますが、例のように、最低限下記の3つの設定項目が必要です。

  • base_url ページネーション処理が含まれるコントローラクラス/ メソッドへの完全なURLです。
  • total_rows この数字は、ページネーションで表示すべき結果セットの総行数をあらわします。 典型的には、この数字は、データベースクエリが返した総行数になります。
  • per_page 1ページあたりに表示したい件数。上の例では、1ページあたり5件を表示します。

この配列は、上で示すように $this->pagination->initialize メソッドに渡されます。

class属性の追加について

ページネーションクラスで生成される各 a タグに class 属性を追加したい場合は,config 配列の “anchor_class” により指定することができるみたいです。

タグ

2011年8月19日 | コメント/トラックバック(0) |

カテゴリー:CodedIgniter

CodeIgniterのフォーム・バリデーションクラス/その2

本日は、前回の『CodeIgniterのフォーム・バリデーションクラス』の続きをやりたいと思います。

配列を使った検証ルールの指定

CodeItniterのフォーム・バリデーションクラスは、配列を使った検証ルールを設定することができます。但し、配列のキー名は決まっています。配列のキー名には、第1パラメータ名を『field』、第2パラメータ名を『label』、第3パラメータ名を『rules』に指定しなければなりません。

$this->form_validation->set_rules('yourname','あなたの名前','trim|required|xss_clean');
 $this->form_validation->set_rules('mailto','相手先メアド','trim|required|valid_email|matches[mailconf]|htmlspecialchars');
 $this->form_validation->set_rules('mailconf','確認用メアド','trim|required|htmlspecialchars');
 $this->form_validation->set_rules('subject','件名','','htmlspecialchars');
 $this->form_validation->set_rules('body','内容','trim|required|htmlspecialchars');

前回の上記のコードを配列を使った検証ルールで変更すると下記のようになります。

$config=array(
 array(
 'field'=>'yourname',
 'label'=>'あなたの名前',
 'rules'=>'trim|required|xss_clean'
 ),
 array(
 'field'=>'mailto',
 'label'=>'相手先メアド',
 'rules'=>'trim|required|valid_email|matches[mailconf]|htmlspecialchars'
 ),
 array(
 'field'=>'mailconf',
 'label'=>'確認用メアド',
 'rules'=>'trim|required|htmlspecialchars'
 ),
 array(
 'field'=>'subject',
 'label'=>'件名',
 'rules'=>'htmlspecialchars'
 ),
 array(
 'field'=>'body',
 'label'=>'内容',
 'rules'=>'trim|required|htmlspecialchars'
 ),
 );
$this->form_validation->set_rules($config);

上記のような配列を普通にコントローラの中で使うのは、コードが長くなるばかりであまり意味がないような気がします。配列で利用するためには、検証ルールを設定ファイルに保存し、グループとして呼び出すときに本領を発揮するのではないでしょうか。

検証ルールを設定ファイルに保存

ユーザガイドでも、『フォーム検証クラスの素晴らしい特徴は、アプリケーション全体に適用する検証ルールを全て設定ファイル内に格納する事が出来る点です。』と書いていますが、私もこの機能がフォームバリデーションクラスの最大のメリットだと思います。フォームバリデーションの基本的なパターンは決まっていますし、個人的に特殊な入力フォームがあれば、それをルールとして設定ファイルに保存しておけばいい事だと思います。

それでは設定ファイルを作成してみましょう。文言は若干変更しますが、先程の配列に沿って作成します。

まず、新規ファイルを作成し、『application/config』フォルダ内に、『form_validation.php』という名前でいったん、保存します。保存したファイルに下記のコードを入力後、再度保存します。

<?php
$config = array(
'email' => array(
array(
'field' => 'yourname',
'label' => 'あなたのお名前',
'rules' => 'required|xss_clean'
),
array(
'field' => 'mailto',
'label' => '相手先メールアドレス',
'rules' => 'required|valid_email|htmlspecialchars'
),
array(
'field' => 'mailconf',
'label' => '確認用メールアドレス',
'rules' => 'required|valid_email|htmlspecialchars'
),
array(
'field' => 'subject',
'label' => '件名',
'rules' => 'htmlspecialchars'
),
array(
'field' => 'body',
'label' => 'メール本文',
'rules' => 'required|htmlspecialchars'
)
)
);

それでは、『testmail.php』を再度変更します。

if($this->form_validation->run(‘emai’) == FALSE)

先程の長かったコードがたったこれだけで済みます。

それでは、ブラウザで何も入力せずに送信ボタンを押してみます。下記のように表示されました。

とても便利です。ここまでで満足して力尽きました。本日はここで終了します。

尚、これ以外にも『フィールド名の指定に配列を使う』方法とか、『ルールリファレンス』『関数リファレンス』等の詳細は、いつものように『CodeIgniterユーザガイド日本語版』サイトをご覧下さい。『CodeIgniterユーザガイド日本語版』を編集、作成していただいている皆様いつもありがとうございます。

タグ

2011年8月18日 | コメント/トラックバック(0) |

カテゴリー:CodedIgniter

CodeIgniterのフォーム・バリデーションクラス

PHPでプログラムを作成していると、結構手間を食うのが、バリデーション処理です。今日は、CodeIgniterのフォーム・バリデーションクラスがいかに便利か勉強してみましょう。

バリデーションとは、検証(する)、実証(する)、認可(する)、妥当性確認、などの意味を持つ英単語。ITの分野では、対象がその仕様や文法などに照らして適切に記述・構築されているか否かを検証すること、という意味で使われる(IT用語辞典e-Wordsより)。

以前、『CodeIgniterのフォームヘルパ』で作成した『testmail_view.php』を多少変更します。<body>のすぐ下に下記のコードを入力し、最初の1行を削除します。

<?php echo validation_errors(); ?>
<?php echo form_open('testmail'); ?>

次に、メールが送信された時の成功ページ『mail_success.php』名で新規ファイルを作成し、『application/views』フォルダに保存します。<body></body>の間に、下記のコードを入力します。

<h3>メールは送信されました!</h3><br /><br />
<?php echo anchor('testmail','他にメール送信する!');?>

最後にコントローラを作成します。前回作成した『testmail.php』を多少変更します。

class Testmail extends CI_Controller{

	function index()
	{
		$this->load->helper(array('form', 'url'));
		$this->load->library('form_validation');

		if ($this->form_validation->run() == FALSE)
		{
			$this->load->view('testmail_view');
		}
		else
		{
		$this->load->library('email');

			$mailto=$this->input->post('mailto');
			$subject=$this->input->post('subject');
			$body=$this->input->post('body');
			$this->email->from('nakada@winroad.info','winroad徒然草');
			$this->email->to($mailto);

			$this->email->subject($subject);
			$this->email->message($body);

			$this->email->send();
			$this->load->view('mail_success');
		}
	}

}

それでは、実際にブラウザで確認してみましょう。全て入力して送信してみました。

すると入力値が全てクリアされてメールも送信されません。何故でしょう。考えてみれば特に不思議もありません。なぜなら、まだ検証ルールを何も設定していないからです。バリデーションクラスは、デフォルトでは、FALSEを返します。run()メソッドは、1つも失敗せずにユーザが指定したルールに適合する場合にのみTRUEを返すからです。

それでは、バリデーション(検証ルール)を設定しましょう。

$this->form_validation->set_rules()

これが、検証ルールを設定するメソッドです。set_rules()の中には、3つの入力パラメータを指定します。最初のパラメータは、フォームのname属性で、第2パラメータは、このフォームの表示名、最後のパラメータが、検証ルールです。

それでは、簡単な検証ルールである『requied(入力値の有無)』で検証ルールを作成してみます。下記のコードを挿入します。

$this->form_validation->set_rules('mailto','宛先','required');
$this->form_validation->set_rules('subject','件名','required');
$this->form_validation->set_rules('body','内容','required');

それでは、ブラウザで確認してみます。何も入力しないで、送信ボタンを押してみます。下記のように表示され、メールも送信されません。

次に、全てを入力して、送信してみます。下のように表示されて実際にメールも届きました。

ルールの連結(カスケード)

さて、上記のバリデーションは入力値の有無だけでしたが、CodeIgniterは複数のルールを互いにパイプすることができます。『testmail_view』を多少変更して、下記のように作成してみます。

これに複数のルールをセットしてみましょう。下記のようにコードを変更します。

$this->form_validation->set_rules('yourname','あなたの名前','trim|required|xss_clean');
$this->form_validation->set_rules('mailto','相手先メアド','trim|required|valid_email|matches[mailconf]|htmlspecialchars');
$this->form_validation->set_rules('mailconf','確認用メアド','trim|required|htmlspecialchars');
$this->form_validation->set_rules('subject','件名','','trim|htmlspecialchars');
$this->form_validation->set_rules('body','内容','trim|required|htmlspecialchars');

それでは、ブラウザで確認してみます。『あなたの名前』を未入力にし、メールアドレスに間違った形式のメールアドレスを入力しました。すると下記のように表示されました。

htmlspecialchars、trim、MD5などのような引数を1つだけ取るPHPの組み込み関数はどれでもルールとして使用することができます。

フォームの再入力

ところで、このままでは、些細な間違いでも最初から入力直ししなくてはなりません。CodeIgniterには、これを補うヘルパー関数が、用意されています。

set_value(‘フィールド名’)

それでは『testmail_view.php』を多少手直しします。Dreamweaverのデザイン画面でテキストフィールドをクリックして、初期値に『<?php echo set_value(‘yourname’);?>』と入力します。コードを直接入力するなら、『value=”<?php echo set_value(‘yourname’);?>』を該当箇所に挿入して下さい。

同じように残りのフィールドも入力します。下記のように入力して下さい。

それではブラウザで確認してみます。『あなたの名前』を空白で、メールアドレスの間違った形式の入力をしてみました。以下のように表示されました。

『フォーム・バリデーションクラス』は、まだまだ長いので、本日はここまでにします。後日続きをやりたいと思います。お疲れ様でした。

WinRoadお奨め書籍

今現在唯一と言っていい、CodeIgniterの日本語版書籍です。ただ、3年前に執筆された書籍で、執筆時のバージョンが1.6.1なので、最新の日本語バージョンが2.0.1であるのを勘案すると若干古いのでは、という印象があります。実際、コードの仕様も変わっていますので、きちんと読み替えることができないとそこで行き詰まってしまう可能性があります。ですが、その辺のマイナス面を考えても余りある程の良書だと思います。早く2.0対応の改訂版が出ることを期待します。私もこの本でCodeIgniterの勉強を始めました。

CodeIgniter徹底入門

CodeIgniter徹底入門

posted with amazlet at 11.08.15
河合 勝彦 鈴木 憲治 安藤 建一
翔泳社
売り上げランキング: 78181

 

タグ

2011年8月17日 | コメント/トラックバック(2) |

カテゴリー:CodedIgniter

このページの先頭へ