DreamweaverでPHP/詳細ページの表示

久しぶりのDreamweaverでPHPのコーナーです。

Kazu様よりのご質問で、検索結果のページから詳細ページへの移動方法を尋ねられましたので、今回は、その方法をご紹介したいと思います。

一覧ページから詳細ページへの移動方法は既にご紹介済みと思っていましたが、ご紹介していたのは、マスター詳細ページセットによる作成方法でした。マスター詳細ページセットを利用すれば、マスターページ(一覧ページ)と詳細ページを同時に作成できますが、今回のように自分の好きなページから詳細ページへの移動方法は、ご紹介していなかったかもしれません。

それでは、『DreamweaverでPHP 検索ページ作成3』の続きとして、作成します。まず、新規作成でページを作成し、『DVD_detail.php』ファイル名でいったん保存します。空白だとわかりづらいので、『DVD詳細ページ』と文字を入力していて下さい。

一番簡単なデータの受け渡しはGETで値を渡すことです。但し、GETでデータを渡すとセキュリティがかなり甘くなりますので、注意して下さい。GETでの値の渡し方と何故、GETでは、セキュリティが甘くなるのかを見てみたいと思います。それでは、『DVD_search_and_result.php』ファイルを開き、検索窓に『愛』と入力して、『検索』ボタンをクリックしてみました。

さて、何か気づきましたでしょうか。そうです、ブラウザのアドレスバーがヒントです。『DVD_search_and_result.php』のあとに、『?Title=愛&button=検索』となっているのにお気づきになったでしょうか。この検索ページもGETで作成しています。GETでの値は、アドレスに続く、『?』移行にデータを渡しているのです。試しにアドレスバーに直接入力してみます。愛の代わりに『悪魔』と入力してみます。すると、悪魔という文字を含んだデータの一覧が表示されました。

つまり、GETで値を渡してページを表示する場合、非常に危険が伴うということを理解した上で利用して下さい。とりわけID番号などは、数字ですので、アドレスバーから入力したランダムな数字が、たまたまマッチする可能性は十分にあります。ですので、会員サイト等は、必ず、全ページでユーザー認証を行うようにして下さい。

前置きが長くなりましたが、GETでのデータの渡し方の説明に移ります。

まず、『DVD_search_and_result.php』ファイルを開き、IDのデータをクリックし、プロパティのリンクの横のアイコンをドラッグして、『DVD_detail.php』ファイルを選択します。

これで、『DVD_search_and_result.php』ファイルから、『DVD_detail.php』ファイルへのリンクは作成されました。このままデザイン画面で設定できればいいのですが、これから先は、コード画面で設定しますので、コード画面を開いて下さい。

まず、『<a href=”DVD_detail.php”>』の『php』の後ろに『?ID=』と入力します。次に、バインディングのレコードセットから、IDを『?ID=』の後ろにドラッグします。

下図のようになります。

他の値も渡したい場合は、『&』に続けてGETに指定する名前(任意)『=』で同じようにドラッグして下さい。たとえば、『&Title=』と入力後、バインディングのレコードセットから『Title』をドラッグします。

これで、『DVD_detail.php』のファイルにGETデータを渡すことができました。それでは、その渡されたデータを取得する方法を説明します。

『DVD_detail.php』ファイルを開き、『バインディング』→『+』→『レコードセット(クエリー)』をクリックします。

フィルターを『ID』『=』『URLパラメータ』『ID』と指定します。これは、GETで送られてきたIDの値をデータベースのIDと一致するデータを抽出するということです。『URLパラメータ』以外に『フォーム変数(POSTで送られてきたデータ)』『COOKIE』『セッション変数』『サーバー変数』『入力値』と選択することができます。これらの使い方はいずれ説明する機会があると思います。

『OK』ボタンをクリックするとレコードセットが自動生成されます。

デザイン画面に戻って、一般タブのテーブルで4行2列のテーブルを作成します。『ID』『タイトル』『日付』『内容』と入力したら、バインディングのレコードセットからそれぞれの箇所へドラッグします。

これで、完成です。ブラウザで確認してみます。検索ページからIDの数字をクリックしてみます。

詳細ページが表示されました。尚、お分かりだとは思いますが、何も律儀にIDの箇所にリンクを張る必要はありません。クリックしやすいTitleにリンクを張って、GETで送るのは、IDを指定すればいいだけですから。

ただ、何度も言いますが、ブラウザには、GETで送った値が表示されていますので、人に知られてはまずいような値などは絶対にGETでは送信しないようにして下さい。機会があれば、これ以外のデータの受け渡し方法(POSTやCOOKIE、セッション変数等)もご紹介します。

Kazu様、これでおわかりいただけましたでしょうか。

本日は以上です。

タグ

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

カテゴリー:Dreamweaver

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

CodeIgniterのファイルアップロードクラス

今日は、CodeIgniterのファイルアップロードクラスを勉強してみたいと思います。コードを入力する前に、データのアップロード先を作成しておきます。

CodeIgniterをインストールした場所のルート(私の場合は、CodeIgniterフォルダの直下、すなわち、applicationフォルダ及びsystemフォルダと同じ階層)に、『uploads』という名前のフォルダを作り、パーミッションを777にセットします。Dreamweaverでの作成方法を書いておきます。

ローカルでルートフォルダに『uploads』名のフォルダを作成し、いったんサーバーにアップしたら、展開アイコンをクリックします。

リモートサーバー側の『uploads』フォルダを右クリックして、権限の設定をクリックします。

『ファイルアクセスのプロパティ』ダイアログで、『すべて読み取り』『すべて書き込み』『すべて実行』をクリックして、『OK』ボタンをクリックします。もちろん、上の数字を直接『777』に変更しても構いません。

それでは、今日は、『CodeIgniterユーザガイド日本語版』のサイトに沿って勉強します。まずビューファイルを2つ作成します。『application/views』フォルダに『upload_form.php』ファイルと『upload_success.php』という2つのファイルを作成します。

同じく、Dreamweaverでの手順を書いておきます。ファイル→新規で新規ドキュメントのダイアログを開いたら『空白ページ』『PHP』『なし』を選択し、『作成』ボタンをクリックします。新しく作成されたファイルを『ファイル』→『別名で保存』で『application/views』フォルダに『upload_form.php』名で保存します。同じく『upload_success.php』というファイルも『application/views』フォルダ内に作成しておきます。

『upload_form.php』ファイルを開き、デザイン画面の空白部分をクリックし、フォームタブの『ファイルフィールド』アイコンをクリックします。『inputタグのアクセシビリティ属性』ダイアログは何も入力せずに『OK』ボタンをクリックします。

『フォームタグを入力しますか』のメッセージには、『いいえ』をクリックします。同じように、ファイルの送信ボタンも作成しておきます。

コード画面でファイルフィールドの前に以下のコードを挿入します。

<?php echo $error;?>
<?php echo form_open_multipart('upload/do_upload');?>

送信ボタンの後に『</form>』を挿入します。

ここで、肝心なことを忘れていました。ファイルフィールドの名称を『userfile』に変更しておきます。これを変更しておかないとファイルはアップロードされません。文字幅は別に入力しなくても構いません。CodeIgniterではファイルフィールドの名前は、デフォルトでは、『userfile』となっています。

次に送信が成功したときに表示するページ『upload_success.php』ファイルを開き、コード画面で、<body></body>の間に、下記のコードを入力します。

<h3>ファイルのアップロードに成功しました</h3>
 <ul>
 <?php foreach ($upload_data as $item=>$value):?>
 <li><?php echo $item;?>:<?php echo $valu;?></li>
 <?php endforeach;?>
 </ul>
 <p><?php echo anchor('upload','UPload Another File!');?></p>

それでは、肝心のコントローラを作成します。『applicaiton/controllers』フォルダに『upload.php』という名前のファイルを作成し、下記のコードを記述します。

class Upload extends CI_Controller {

	function __construct()
	{
		parent::__construct();
		$this->load->helper(array('form', 'url'));
	}

	function index()
	{
		$this->load->view('upload_form', array('error' => ' ' ));
	}

	function do_upload()
	{
		$config['upload_path'] = './uploads/';
		$config['allowed_types'] = 'gif|jpg|png';
		$config['max_size']	= '100';
		$config['max_width']  = '1024';
		$config['max_height']  = '768';

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

		if ( ! $this->upload->do_upload())
		{
			$error = array('error' => $this->upload->display_errors());

			$this->load->view('upload_form', $error);
		}
		else
		{
			$data = array('upload_data' => $this->upload->data());

			$this->load->view('upload_success', $data);
		}
	}
}

それでは、実際にブラウザで確認してみましょう。

パソコン内のjpegファイルを送信してみました。

実際に『uploads』フォルダをのぞいてみました。きちんとファイルがアップロードされています。

コードの解説

まずビューファイル『uproad_form.php』から見てみます。

form_open_multipart();

これは、前回『CodeIgniterのフォームヘルパ』で勉強したFormヘルパの中のひとつです。ファイルをアップロードする際に使うマルチパートの指定を属性に追加します。

つまり『form_open_multipart(‘upload/do_upload’)』は、下記のHTMLタグを生成します。

<form action="http://ci.builwing.co.jp/CodeIgniter/upload/do_upload" method="post" accept-charset="utf-8" enctype="multipart/form-data">

マルチパートとは、一通の電子メールに複数の異なる種類のデータを格納する方式。メールにASCII文字以外のデータを格納するための「MIME」規格の拡張仕様。インターネットの技術仕様の標準化にあたっているIETFにより、RFC 2112として規格化されている。添付ファイルとして画像を送ったりするのに使われる。従来、メールはヘッダと本文という2つの部分しか持てなかったが、マルチパート仕様により、「区切り文字」を境に任意の数の部分(パート)に分割することが可能となった。これにより、例えば1つのメールに本文、画像、ワープロ文書、音声をまとめて送受信することができる。一つのパートを複数のマルチパートに分割する「入れ子」構造も可能である(『IT用語辞典e-Words』より)

次は、ビューファイル『upload_success.php』です。

foreach ~ endforeach

これは、PHPの繰り返し構文です。foreach構文は、指定した配列の要素を1つずつ抜き取って処理します。foreachの最後は、『;(セミコロン)』ではなく、『:(コロン)』ですので、気をつけて下さい。

anchor()

これは、URLヘルパのコードのひとつで、サイトのURLに基づいて、標準のHTMLアンカーリンクを作成します。第1引数は、URLに追加したいセグメントを文字列または配列で指定します。第2引数は、リンクに指定したいテキストで、空のままだとURLが指定されます。第3引数は、リンクタグに指定したい属性のリストを文字列または、連想配列で指定します。つまり、『anchor(‘upload’,’Upload Anothe File!’)』は、下記のようなHTMLタグを生成します。

<a href="http://ci.builwing.co.jp/upload">Upload Another File!</a>

次に、コントローラを見てみましょう。

function __construct()

コンストラクタの復習です。コンストラクタとは何だったでしょうか。コントローラが実行される前に必ず呼び出されるメソッドの事ですね。ついでに、コンストラクタには『parent:: __construct()』は、セットだと覚えておきましょう。

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

これは、特に問題はないと思います。formヘルパとurlヘルパを同時に呼び出しています。

$this->load->view()

これは、ビューファイルを呼び出すメソッドですので、特に問題はないと思います。

次は、今回の主役ファイルアップロードクラスです。

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

配列$configの設定項目に基づいたアップロードクラスを呼び出しています。

$this->upload->display_erros()

do_upload()メソッドがFALSEを返したときの全てのエラーを取得します。試しに容量の大きなファイルを送信したときに出たエラーメッセージが下の図です。

$this->upload->data()

アップロードしたファイルについての情報を配列で返すメソッドです。詳細は、『CodeIgniterユーザーガイド日本語版』サイトをどうぞ。

本日は以上です。










タグ

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

カテゴリー:CodedIgniter

CodeIgniterのフォームヘルパ

『CodeIgniterユーザガイド日本語版』サイトで、ファイルアップロードクラスを勉強しようと思ったら、formヘルパ関数を使ったコードの表記がありました。これは先にformヘルパを勉強する必要があると思いましたので、今日はCodeIgniterのフォームヘルパについて勉強しようと思います。

$this->load->helper(‘form’);

これは、お馴染みのヘルパを呼び出すメソッドです。これでフォームヘルパが使用可能になります。

それでは、コードを少しずつ見ていきましょう。

form_open()

ユーザガイドには、『設定ファイルに基づいて構築したベース URL を設定して form の開始タグを作成します。 オプションで、form タグの属性と隠しフィールドを追加する事が出来、設定ファイルの文字コードの値に基づき、常に accept-charset 属性が付与されます。』とありますが、意味がいまいち理解できないので、実際にコードを書いて試してみます。『application/controllers』フォルダに『formhelper_sample.php』を作成し、下記のコードを入力します。

class Formhelper_sample extends CI_controller{
 function index()
 {
	 $this->load->helper('form');
	 echo form_open('formhelper_sample/send_mail');
	 echo "メールアドレス:".form_input('mailto','')."<br>";
	 echo "件名:".form_input('subject','')."<br>";
	 echo "内容:".form_textarea('body','')."<br>";
	 echo form_submit('submit','送信');
 }
	function send_mail()
	{
		$this->load->library('email');

		if($this->input->post('mailto')!=null){
			$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();

			echo $this->email->print_debugger();
		}else{
			header("Location: http://ci.builwing.co.jp/formhelper_sample");
		}
	}
}

これは、以前『CodeIgniterでEmail送信』で作成したEmail送信プログラムをビューファイルを使わずにControllerの中でフォームヘルパを使用して作成してみました。

それでは、ブラウザで確認してみましょう。実際メールアドレスを入力して、件名と内容を入力したら、きちんとメールが届きました。

これでわかるように『form_open()』は、HTMLフォームの『action=””』の中に『ベースURL+()の中のURI”』を代入し、設定された文字コードを指定することです。このコードの例で言えば、『form_open(formhelper_sample/sendmail』は、以下のようなHTMLタグを生成します。

<form  method="POST" accept-charset="UTF-8" action="http://ci.builwing.co.jp/formhelper_sample/send_mail">

 form_input()

これは、通常のテキストフィールドを生成します。第1引数に名前(name属性)、第2引数に値(value)を渡します。つまり、『form_input(‘mailto’,”)』は

<input type="text" name="mailto" value="">

というHTMLタグを生成します。また連想配列も渡すことができるみたいです。

$data=array(
    'name' =>'username',
    'id' => 'username',
    'value' => 'test',
    'maxlength' => '100',
    'size' => '50',
    'style' => 'width:50%',
    );
echo form_input($data);

は、下記のようなHTMLタグを生成します。

<input type="text" name="username" id="username" value="test" maxlength="100" size="50" style="width:50%" />

form_textarea

これはテキストエリアを生成します。あとは、form_input()とおなじです。

form_submit()

これは、通常の送信ボタンを生成します。『form_submit(‘submit’,’送信’);』は下記のようなHTMLタグを生成します。

<input type="submit" name="submit" value="送信" />

以下いろいろなコードがありますので、詳しく知りたい方は、『CodeIgniterユーザーガイド日本語版』のサイトへどうぞ。

これで、一応フォームヘルパの使い方がわかったところで、次回はファイルアップロードクラスを勉強したいと思います。

本日は、以上です。

タグ

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

カテゴリー:CodedIgniter

このページの先頭へ