ステップ1:テンプレート
サイトのベーシックなレイアウトを入れておいたので、フォームを作ったりかわいく見えるサイトを作るために時間を無駄にすることはない。君がここに来た理由であるコーディングにすぐ取り組める。Site Template folderを開き(←ない。有料登録したらDLできるのか?)、ローカルホストかウェブサーバーにコピーする。
index.phpを開いてちょっと見てほしい。入力項目が3つあるシンプルなフォームがあるだろう。これからキャプチャーするフィールドだ。ユーザーネーム、パスワード、eメール。ユーザーがサインアップした時に他の要素をキャプチャーすることもできる。が、今必要なのは3つだ。
ステップ2:MySQLのセットアップ
PHPMyAdminか、MySQLの管理に使っているプログラムを開いて、新しいデータベースを作る。名前は何でも良い。ユーザーの情報confirmの情報を入れておくための列が必要だ。そのためUsersとConfirmの2つのテーブルを作る。最初のテーブルには列を5つ作る。最初はユーザーがサインアップするときに与えるIDだ。これは自動生成するのでユーザーはユニークなIDを持つ。次にユーザーネーム、パスワード、IDだ。 最後の2つはユーザーのステータスをアクティブにするのに使う(←この訳怪しい)。最初はアクティブステータスのデフォルトは0で、ユーザーのアカウントは非アクティブだ。ユーザーがconfirmすればアクティブステータスを1にする。これでアカウントはアクティブになる。
- CREATE TABLE `users` (
- `id` int(11) NOT NULL auto_increment,
- `username` varchar(50) NOT NULL default '',
- `password` varchar(128) NOT NULL default '',
- `email` varchar(250) NOT NULL default '',
- `active` binary(1) NOT NULL default '0',
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
2つ目のテーブルはconfirmテーブルだ。ここにはユーザーのID、eメール、ユーザーアカウントをconfirmするためにランダム生成されたキーを入れる。
- CREATE TABLE `confirm` (
- `id` int(11) NOT NULL auto_increment,
- `userid` varchar(128) NOT NULL default '',
- `key` varchar(128) NOT NULL default '',
- `email` varchar(250) default NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
ステップ3:MySQLに接続する
inc/php/config.phpを開く。まずデータベースに接続しないといけない。
君のセットアップによっては、variablesをいくつか変更しないといけない。
- mysql_connect('localhost', 'username', 'password') or die("I couldn't connect to your database, please make sure your info is correct!");
次に どのデータベースを使うかMySQLに教えてやる。
mysql_select_db('your_database_name') or die("I couldn't find the database table make sure it's spelt right!");すべて編集したらindex.phpをサーバーにアップ。
トップに何もエラーが出なければ接続成功。
ステップ4:フォームのSubmit
フォームデータをキャプチャーする。コードの一部を記載して説明した後、変更を実施して機能を追加しよう。
index.phpのトップに以下の記載がある。
ここではフォームがsubmitされたかどうかのステータスをチェックしている。
- //check if the form has been submitted
- if(isset($_POST['signup'])){
- }
これがないと、ページがリフレッシュされる度にスクリプトが走ってしまう。
注:使っているアプリケーションやコーディングスタイルによっては、このコードはフォームがsubmitされた時にアクセスされる別なファイルに入っているかもしれない。自分はシンプルにして追いやすくするため全部1ファイルにまとめている。
ステップ5:変数を整理してチェックする
ユーザーの入力内容をチェックしたい。最初のパートでは$_POST変数をシンプルな変数にしてデータベース格納用に整形している。
- $username = mysql_real_escape_string($_POST['username']);
- $password = mysql_real_escape_string($_POST['password']);
- $email = mysql_real_escape_string($_POST['email']);
mysql_real_escapse_string() では、ユーザーにアポストロフィを使わせないようにしている。(MySQLインジェクションでデータベースにアクセスさせないため)
ユーザーが入力した情報をデータベースに入れたい時は常に、
mysql_real_escape_string()を通すようにしてほしい。MySQLインジェクションについて詳しくはWikipedia参照。変数をきれいにしたら、入力漏れがないかチェックする。
if文を3つ使って各フィールドが空でないかチェックしている。
- if(empty($username)){ //put code in me please }
- if(empty($password)){ //put code in me please }
- if(empty($email)){ //put code in me please }
もしフィールドが空なら、いくつか変数をアサインする。
配列を作って登録プロセスのステータスとユーザーに見せる文言を入れる。
このコードのすぐ上に、配列と変数をいくつか作っておく。
まず、actionという空の配列を作り、結果の値をセットする。
- $action = array();
- $action['result'] = null;
- $text = array();
この結果には成功か失敗の値がある。
次に、textという空の配列をもう一つ作る。
ここには、登録の間ユーザーに見せたいテキストがぜんぶ入ることになる。
変数をチェックするこのif文はまだ何のコードも実行しないので、最初のif文にコードを追加する。
このコードをusernameのif文の中に入れる。
usernameが空でsubmitされたら、上のコードが走ってエラーを返す。
- $action['result'] = 'error';
- array_push($text,'You forgot your username');
そこでarray_push()を使って、text配列に何かテキストを置く。これは他の2つのif文でも使うので、このコードをそちらにもコピペする。if文の内容に合わせてテキストを変更する。 注:フォームsubmitで起きる複数のエラーに対応するためarray_push()を使っているが、すべてのif文が実行されるなら、テキストの配列は次のようになる。
- Array(
- [0] => 'You forgot your username',
- [1] => 'You forgot your password',
- [2] => 'You forgot your email'
- )
ステップ6:エラーがなければユーザーを登録
action配列の返り値がエラーになるかどうかチェックしよう。
md5() functionにパスワードも通している。
- if($action['result'] != 'error'){
- //no errors, continue signup
- $password = md5($password);
- }
- $action['text'] = $text;
このfunctionはpasswordを次のような32文字の文字列で返す。
a3470ce826283eca7ce3360d0f26b230 パスワードをデータベースに入れる前にハッシングfunctionを通すのはいい取り組みだ。
もしデータベースがハッキングされてもこれによってパスワードを見られることがなくなる。
もしactionの返り値がエラーなら、このコードすべてをスキップしてエラーを表示し、ユーザーに修正してもらう。
最後のコードでtext配列の値をaction配列に入れる。
ステップ7:ユーザーをデータベースに追加する
最後のif文にこのコードを追加する。ユーザーの情報をデータベースに入れるため
- ...
- If Statement checking for errors
- ...
- //add to the database
- $add = mysql_query("INSERT INTO `users` VALUES(NULL,'$username','$password','$email',0)");
- if($add){
- //the user was added to the database
- }else{
- $action['result'] = 'error';
- array_push($text,'User could not be added to the database. Reason: ' . mysql_error());
- =
- }
mysql_query() と INSERTを使う。次に、もう一つif文を追加してユーザーがデータベースに追加されたかチェックする。
これは$add変数がtrueかfalseかでチェックできる。
ユーザーが追加されていれば登録を継続し、そうでなければ適当な変数を割り当てて登録を中止する。
MySQLの作業では
mysql_error() functionを使う。mysql_error() functionはエラーをテキストで吐いてくれるので、クエリーのどこに問題があるかデバッグするのに役立つ。ステップ8:Confirmが必要
ユーザーがフォームをsubmitして全てチェックを通りデータベースに入ったら、ユーザーがアカウントを使えるようにしないといけない。confirmをセットアップしよう。簡単に言うと、新しいユーザーIDを変数に割り当て、それを後で使う。
- ...
- if added check
- ...
- //get the new user id
- $userid = mysql_insert_id();
- //create a random key
- $key = $username . $email . date('mY');
- $key = md5($key);
- //add confirm row
- $confirm = mysql_query("INSERT INTO `confirm` VALUES(NULL,'$userid','$key','$email')");
- if($confirm){
- //let's send the email
- }else{
- $action['result'] = 'error';
- array_push($text,'Confirm row was not added to the database. Reason: ' . mysql_error());
- }
これを実現するのにm
ysql_insert_id()を使う。 m
ysql_insert_id()はどんな新しいユーザーIDでも$useridにセットする。 次にユーザー固有のランダムキーを作る。
変数を作ってkeyという名前にする。でusername、email、dateを代入する。
文字列はmattmatt@email.com012009のようになる。
そして
md5() functionを使ってそのユーザー固有のランダムな文字列にコンバートする。mysql_query() and INSERTをもう一度使って、新しいユーザーID、kerとemailをデータベースに入れる。ステップ9:eメールのテンプレートをセッティング
PHPのコーディングから一時離れて新しいファイルを2つ作る。効率UPのため、このチュートリアルに入れておいた2つのテンプレートを使う。
これから見ていく2ファイルは
signup_template.html と signup_template.txtだ。ユーザーのメールソフトがHTMLメールに対応してない場合にHTMLとTEXTバージョンを切り替えて使う。
signup_template.htmlを開こう。
注: eメールのHTMLをよく研究すること。
このファイルの編集まではやらない。仕組みを説明して、このチュートリアルを終えた後に利用できるようにするところまでだ。
このファイルの最も重要なパートは
{USERNAME}やconfirm.php?email={EMAIL}&key={KEY}のようなタグだ。これからこのテンプレートを使いフォームから得られる変数でこれらのタグを入れ替えるfunctionを書く。
ステップ10:テンプレートの機能
inc/php/functions.phpを開くと、以下のようなコードがある。
- function format_email($info, $format){
- //set the root
- $root = $_SERVER['DOCUMENT_ROOT'].'/dev/tutorials/email_signup';
- //grab the template content
- $template = file_get_contents($root.'/signup_template.'.$format);
- //replace all the tags
- $template = ereg_replace('{USERNAME}', $info['username'], $template);
- $template = ereg_replace('{EMAIL}', $info['email'], $template);
- $template = ereg_replace('{KEY}', $info['key'], $template);
- $template = ereg_replace('{SITEPATH}','http://site-path.com', $template);
- //return the html of the template
- return $template;
- }
format_email()はindex.phpでも使われる2つの変数を使う。最初の変数はフォームの情報の配列で、二つ目の変数はフォーマットだ。 フォーマットの変数があるので、この配列をHTMLとTXTバージョンのどちらのテンプレートにも再利用できる。
最初にルートを設定する。
これはテンプレートがあるフォルダを指す。
次にテンプレートの中身を利用できるようにして、それを変数に入れる。
これで
ereg_replace()を使ってテンプレート内にある{USERNAME}タグをフォームで入力された内容に入れ替えられる。このテンプレートは基本的にスーパーシンプルなシステムだ。 最後に全てのhtmlが入っているテンプレート変数に戻る。
説明:要は
format_email()がテンプレートファイルを開き、HTMLを読み込んで変数にアサインする。これは簡潔な方法で、その後全てのHTMLをfunctionそのものにアサインする。 ステップ11:メール送信
Swiftを実行してメールを送信するためもう一つfunctionを書く。
- function send_email($info){
- //format each email
- $body = format_email($info,'html');
- $body_plain_txt = format_email($info,'txt');
- //setup the mailer
- $transport = Swift_MailTransport::newInstance();
- $mailer = Swift_Mailer::newInstance($transport);
- $message = Swift_Message::newInstance();
- $message ->setSubject('Welcome to Site Name');
- $message ->setFrom(array('noreply@sitename.com' => 'Site Name'));
- $message ->setTo(array($info['email'] => $info['username']));
- $message ->setBody($body_plain_txt);
- $message ->addPart($body, 'text/html');
- $result = $mailer->send($message);
- return $result;
- }
format_email()のように、 send_email()は情報の配列を変数としてとる。funcitonの最初のパートでは2つの変数をアサインする。
$body と
$body_plain_textだ。format_email()でテンプレートのHTML値を各変数にアサインする。 Swift_MailTransport:newInstance()を使ってswiftインスタンスをセットアップし、Swift_Mailer::newInstance($transport);でメールソフトをセットアップする。 Swiftメッセージの新しいインスタンスを作ってこのインスタンスに変数をいくつかアサインする。
メールのsubjectとtoのアドレス、それから
setBody()を使ってテキストバージョンのメールをメーラーインスタンスにアサインアウトする。 HTMLバージョンの追加には
addPart()を使う。send() functionはメール送信を司り、そしてresultに戻る。 これでメールを作って送るfunctionができた。
index.phpに戻ってメインの登録をやっつけよう。
ステップ12:送信した?Confirmする?
最後はconfirm列が作られたかどうかをチェックするif文だ。eメールを送信して、何も問題ないか確認しよう。
Swiftクラスがなくてはメールを送信できないので、最初にswiftクラスをincludeしている。
- ...
- if confirm
- ...
- //include the swift class
- include_once 'inc/php/swift/swift_required.php';
- //put info into an array to send to the function
- $info = array(
- 'username' => $username,
- 'email' => $email,
- 'key' => $key
- );
- //send the email
- if(send_email($info)){
- //email sent
- $action['result'] = 'success';
- array_push($text,'Thanks for signing up. Please check your email for confirmation!');
- }else{
- $action['result'] = 'error';
- array_push($text,'Could not send confirm email');
- }
新しいfunctionの両方に情報を送らないといけないので、新しい配列を作って変数をアサインする。
if文の追加も必要だが、ユーザーの簡便性のためにエラーをチェックする必要がある。
ユーザーは常に想像できる限りのミスをすると仮定しておかないといけない。
send_email() functionを、$info arrayをパスするのと同じようにもう一つのif文にラップする。 もしメールが送信されたら成功の値をアサインし、ユーザーに登録を感謝する。
エラーが出たらおなじみの値を使う。
登録はほとんど完了だ。
最後に一つだけfunctionを作る必要がある。
エラーや成功の変数をアサインしたが、ユーザーに情報を示すテキストを表示するようにしていない。
functions.phpに次のコードをペーストする。
複雑に見えるかもしれないが、実際には成功/エラーを作っているだけだ。
- //cleanup the errors
- function show_errors($action){
- $error = false;
- if(!empty($action['result'])){
- $error = "<ul class="\"alert" $action[result]\"="">"."\n";
- if(is_array($action['text'])){
- //loop out each error
- foreach($action['text'] as $text){
- $error .= "<li><p>$text</p></li>"."\n";
- }
- }else{
- //single error
- $error .= "<li><p>$action</p></li>";
- }
- $error .= "</ul>"."\n";
- }
- return $error;
- }
まず配列が空かどうかチェックして、必要がなければコードを実行しない。
次にulタグを作ってresultをクラスにしている。
次の変数が配列か単なる文章かチェックする。
文章ならliにラップする。
配列なら、配列のアイテムを全部ループしてliにラップする。
最後に、ulを閉じて全体の文に戻る。
index.phpに戻って
header.phpをインクルードしている所のすぐ後にこのコードを正しく入れたら、このセクションをラップアップできる。ステップ13:ユーザーを登録する
We should have a good grip on how the script is functioning; so for this next script I’m going to give you the entire chunk of code and then go through it with you.
confirm.phpを開きヘッダーとshow_errors() functionの間にこれをペーストOpen up
confirm.php and paste this in-between the header include and your show_errors() function.大部分はなじみがあると思うので、間を飛ばしてkeyがデータベースセクションにあるかどうかチェックする。
- //setup some variables
- $action = array();
- $action['result'] = null;
- //quick/simple validation
- if(empty($_GET['email']) || empty($_GET['key'])){
- $action['result'] = 'error';
- $action['text'] = 'We are missing variables. Please double check your email.';
- }
- if($action['result'] != 'error'){
- //cleanup the variables
- $email = mysql_real_escape_string($_GET['email']);
- $key = mysql_real_escape_string($_GET['key']);
- //check if the key is in the database
- $check_key = mysql_query("SELECT * FROM `confirm` WHERE `email` = '$email' AND `key` = '$key' LIMIT 1") or die(mysql_error());
- if(mysql_num_rows($check_key) != 0){
- //get the confirm info
- $confirm_info = mysql_fetch_assoc($check_key);
- //confirm the email and update the users database
- $update_users = mysql_query("UPDATE `users` SET `active` = 1 WHERE `id` = '$confirm_info[userid]' LIMIT 1") or die(mysql_error());
- //delete the confirm row
- $delete = mysql_query("DELETE FROM `confirm` WHERE `id` = '$confirm_info[id]' LIMIT 1") or die(mysql_error());
- if($update_users){
- $action['result'] = 'success';
- $action['text'] = 'User has been confirmed. Thank-You!';
- }else{
- $action['result'] = 'error';
- $action['text'] = 'The user could not be updated Reason: '.mysql_error();;
- }
- }else{
- $action['result'] = 'error';
- $action['text'] = 'The key and email is not in our database.';
- }
- }
またmysql_query()を使い、emailとkeyがユーザーのemailから提供されたkeyに等しい行を取得する。 mysql_num_rows()で該当する行の数が0より大きいかどうかチェックする。 データベースにemailとkeyがあれば、
mysql_fetch_assoc()でデータベースから全ての情報を取れる。ユーザーがアカウントをconfirmしたら、データベースを更新してactive rowを1にセットする必要がある。
もう一度
mysql_query()を使うが、INSERTの代わりにUPDATEを使ってuserIDが現在のユーザーのIDと同じactive rowを更新する。 すべてをきれいにするため、
mysql_query()とDELETEでconfirmation rowをデータベースから削除する。これでユーザーはこのページに戻れなくなり、confirmを繰り返すことはできなくなる。
これでデータベースもきれいに保つことができる。
終わりに
このチュートリアルでは多岐にわたるエリアをカバーしてきた。
emailを送信するためにサードパーティのスクリプトをダウンロードしてインクルードしたし、
シンプルなフォームの確認をインプリメントした。
emailを整形するためにスーパーシンプルなテンプレートも作った。
If you’re new to MySQL we’ve touched on the three most common functions in MySQL so you should have no problem completing some more advanced tutorials.
Final Notes
- emailを展開するスクリプトとして使ったSwiftはここからダウンロードできる。 http://swiftmailer.org/
- Zurbから提供されるボタンスタイルも使った。http://www.zurb.com/blog_uploads/0000/0485/buttons-02.html
0 件のコメント:
コメントを投稿