register.php, auth.phpに性別、年齢、職業を追加

html

<?php elseif($status == "none"): ?>
	<p>ユーザ名(英数字3~32文字)、推測されにくいパスワード(英数字8~32文字)を入力してください。</p>
	<form method="POST" action="">
	ユーザ名:<input type="text" name="username">
	パスワード:<input type="password" name="password"><br>
	性別:
	<input type="radio" name="gender" value="male" checked>男性
	<input type="radio" name="gender" value="femail">女性<br>
	年齢:
	<select name="age">
	<option value="">選択してください</option>
	<option value="20歳未満">20歳未満</option>
	<option value="20-29歳">20-29歳</option>
	<option value="30-39歳">30-39歳</option>
	<option value="40-49歳">40-49歳</option>
	<option value="50-59歳">50-59歳</option>
	<option value="60-69歳">60-69歳</option>
	<option value="70-79歳">70-79歳</option>
	<option value="80歳以上">80歳以上</option>
	</select><br>
	職業:
	<select name="job">
	<option value="">選択してください</option>
	<option value="公務員">公務員</option>
	<option value="経営者・役員">経営者・役員</option>
	<option value="会社員">会社員</option>
	<option value="自営業">自営業</option>
	<option value="自由業">自由業</option>
	<option value="専業主婦">専業主婦</option>
	<option value="パート・アルバイト">パート・アルバイト</option>
	<option value="学生">学生</option>
	<option value="その他">その他</option>
	</select><br><br>
	<input type="submit" value="登録">
	</form>
	<a href="login.php">ログイン</a>
<?php else: ?>

php

($auth->register($_POST["username"], $_POST["password"], $_POST["gender"], $_POST["age"], $_POST["job"]))

auth.phpのclass

public function register($username, $password, $gender, $age, $job){
		$password = password_hash($_POST["password"], PASSWORD_DEFAULT);
		$stmt = $this->mysqli->prepare("INSERT INTO users (username, password, gender, age, job) VALUES(?, ?, ?, ?, ?)");
		$stmt->bind_param('sssss', $_POST["username"], $password, $_POST["gender"], $_POST["age"], $_POST["job"]);
		return $stmt->execute();
	}

mysql
入ってます。OK, いいね!

| kurumada   | $2y$10$3w/ZczuQsPD/xy6LThA0DuXM5KJ8T2U45nWSRq..hogehoge | male   | 40-49歳     | NULL | 経営者・役員       | NULL |

続いて、居住地を追加します。

登録地域:
	<select name="area">
	<option value="">選択してください</option>
	<option value="北海道">北海道</option>
	<option value="青森県">青森県</option>
	<option value="岩手県">岩手県</option>
	<option value="宮城県">宮城県</option>
	<option value="秋田県">秋田県</option>
	<option value="山形県">山形県</option>
	<option value="福島県">福島県</option>
	<option value="茨城県">茨城県</option>
	<option value="栃木県">栃木県</option>
	<option value="群馬県">群馬県</option>
	<option value="埼玉県">埼玉県</option>
	<option value="千葉県">千葉県</option>
	<option value="東京都" selected>東京都</option>
	<option value="神奈川県">神奈川県</option>
	<option value="新潟県">新潟県</option>
	<option value="富山県">富山県</option>
	<option value="石川県">石川県</option>
	<option value="福井県">福井県</option>
	<option value="山梨県">山梨県</option>
	<option value="長野県">長野県</option>
	<option value="岐阜県">岐阜県</option>
	<option value="静岡県">静岡県</option>
	<option value="愛知県">愛知県</option>
	<option value="三重県">三重県</option>
	<option value="滋賀県">滋賀県</option>
	<option value="京都府">京都府</option>
	<option value="大阪府">大阪府</option>
	<option value="兵庫県">兵庫県</option>
	<option value="奈良県">奈良県</option>
	<option value="和歌山県">和歌山県</option>
	<option value="鳥取県">鳥取県</option>
	<option value="島根県">島根県</option>
	<option value="岡山県">岡山県</option>
	<option value="広島県">広島県</option>
	<option value="山口県">山口県</option>
	<option value="徳島県">徳島県</option>
	<option value="香川県">香川県</option>
	<option value="愛媛県">愛媛県</option>
	<option value="高知県">高知県</option>
	<option value="福岡県">福岡県</option>
	<option value="佐賀県">佐賀県</option>
	<option value="長崎県">長崎県</option>
	<option value="熊本県">熊本県</option>
	<option value="大分県">大分県</option>
	<option value="宮崎県">宮崎県</option>
	<option value="鹿児島県">鹿児島県</option>
	<option value="沖縄県">沖縄県</option>
	<option value="海外">海外</option>
</select>

register.php

mysql

| kotori     | $2y$10$rWJ6TMpdc51Gm5aTdQocFuXG8mhjoS7...hoge | male   | 20-29歳     | 東京都    | 経営者・役員  

Yes! Good job!

続いて、ipアドレスですが、以下で取得できますね。

$_SERVER["REMOTE_ADDR"];

新規登録画面の項目をmysqlに追加していく

ここら辺は適当につくってきます。
性別、生年月日、エリア、職業あたりでしょうか。

重複登録を避けるため、ipアドレスを登録して、同じipアドレスから重複して登録できないようにしたいと思います。

ALTER TABLE users ADD gender int;
ALTER TABLE users ADD birth int;
ALTER TABLE users ADD area varchar(41);
ALTER TABLE users ADD job varchar(255);
ALTER TABLE users ADD ip int(41);

mysql> desc users;
+———-+————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+———-+————–+——+—–+———+——-+
| username | varchar(41) | YES | UNI | NULL | |
| password | varchar(255) | YES | | NULL | |
| gender | int(11) | YES | | NULL | |
| birth | int(11) | YES | | NULL | |
| area | varchar(41) | YES | | NULL | |
| job | varchar(255) | YES | | NULL | |
| ip | int(41) | YES | | NULL | |
+———-+————–+——+—–+———+——-+
7 rows in set (0.00 sec)

現在の登録画面

<?php elseif($status == "none"): ?>
	<p>ユーザ名(英数字3~32文字)、推測されにくいパスワード(英数字8~32文字)を入力してください。</p>
	<form method="POST" action="">
	ユーザ名:<br>
	<input type="text" name="username"><br>
	パスワード:<br>
	<input type="password" name="password"><br>
	性別:<br>
	<input type="radio" name="example" value="male" checked>男性
	<input type="radio" name="example" value="femail">女性<br>
	年齢:<br>
	<select name="age">
	<option value="">選択してください</option>
	<option value="20歳未満">20歳未満</option>
	<option value="20-29歳">20-29歳</option>
	<option value="30-39歳">30-39歳</option>
	<option value="40-49歳">40-49歳</option>
	<option value="50-59歳">50-59歳</option>
	<option value="60-69歳">60-69歳</option>
	<option value="70-79歳">70-79歳</option>
	<option value="80歳以上">80歳以上</option>
	</select><br>
	年齢:<br>
	<select name="job">
	<option value="">選択してください</option>
	<option value="公務員">公務員</option>
	<option value="経営者・役員">経営者・役員</option>
	<option value="会社員">会社員</option>
	<option value="自営業">自営業</option>
	<option value="自由業">自由業</option>
	<option value="専業主婦">専業主婦</option>
	<option value="パート・アルバイト">パート・アルバイト</option>
	<option value="学生">学生</option>
	<option value="その他">その他</option>
	</select><br><br>
	<input type="submit" value="登録">
	</form>
	<a href="login.php">ログイン</a>
<?php else: ?>

マッチングサイトの新規登録画面

東カレデート、pairs、omiaiにしてもfacebook連携ばっかりだな。。

YYC
性別、ニックネーム、パスワード、生年月日、登録地域、職業、利用目的

なるほど、性別・生年月日は必須として、登録地域・職業もあるといいですね。

ハッピーメール
性別、居住地、年齢、ニックネーム、求めるお相手(メル友、遊び友達、恋人)

ハッピーメールは項目が少なくライトですね。

ゼクシィ縁結び
名前、フリガナ、ニックネーム、生年月日、性別、居住地、パスワード、キャンペーンコード

マッチングでは、写真・年収あたりが大事な気がしますが、どこも写真のアップロードはないですね。。

in_arrayで送信したアドレスが存在するかチェックする

$sql = "select * from users";
			$stmt = $dbh2->query($sql);
			while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
				$users[] = $result['username'];
			}

   			$sql2 = "select * from sends where username = '".$username."' order by sendtime desc";
			$stmt2 = $dbh2->query($sql2);

			while($result = $stmt2->fetch(PDO::FETCH_ASSOC)){
				$id[] = $result['mid'];
				$to = $result['destination'];
				if(in_array($to, $users)){
					$suc[] = "送信済み"; 
				} else {
					$suc[] = "宛先のアドレスが存在しません"; 
				}
				$destination[] = $to;
				$subject[] = $result['subject'];
				$sendtime[] = $result['sendtime'];
			}

			$i= 0;
			echo "<table>";
			foreach($destination as $value){
				echo "<tr><td> <img src=\"icon.png\"> <a href=\"?path=mailrp&inbox=".$id&#91;$i&#93;."\">".$value ."</a></td><td><a href=\"?path=mailrp&inbox=".$id&#91;$i&#93;."\">". $subject[$i]."</a> </td><td>" .$sendtime[$i]. " </td><td>".$suc[$i]."</td></tr>";
				$i++;
			}
			echo "</table>";

おお、メール機能の基本的なところは大分出来てきた!

次は、register時における性別、年齢などusersのカラムを増やして、メールボックスにfacebookのように、「知り合いかも?」で、異性のプロフィールを表示させてマッチングさせる機能を付けたいですね。

phpでメールボックスをつくろう8 メールのユニークIDをautoincrementからランダムな英数字にする

推測されないようにします。

$str = array_merge(range('a','z'), range('0', '9'), range('A', 'Z'));
	$r_str = null;
	for($i = 0; $i < 8; $i++){
		$r_str .= $str[rand(0, count($str) - 1)];
	}
	$mid = $r_str;

いいですね~!

続いて、send itemsで、メールが送信できたか否かを表示したいと思います。

添付ファイルの表示およびダウンロード

表示するphpファイル
写真が2枚の時は、vertical-align:topで上揃えにします。

<style>
#menu {
	border: solid 1px #f0f8ff;
	font-size:small;
	color:#d3d3d3;
	padding-left:10px;
}
#img{
	position: relative;
}
#img img{
	vertical-align:top;
}
</style>
<?php
$id = 15;

$dsn = "mysql:dbname=mail;host=localhost";
$user = "hoge";
$password = "hogehoge";
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
}
$sql = "select * from sends where id = '".$id."'";
$stmt = $dbh->query($sql);

$result = $stmt->fetch(PDO::FETCH_ASSOC);
$send_from = $result['username'];
$send_sub = $result['subject'];
$send_body = $result['body'];
$sendtime = $result['sendtime'];
$file1 = $result['file1'];
$file2 = $result['file2']; 

echo "<h3>".$send_sub."</h3>";
echo "From: ".$send_from. "<br>";
echo $sendtime. "<hr>";
echo $send_body. "<br>";
if(!empty($file2)){
	echo "<br><div id=\"img\"><img src=\"".$file1."\"> <img src=\"".$file2."\"></div><br>";
	echo "<a href=\"wa.php?id=".$file1."\">1.ダウンロード</a> <a href=\"wa.php?id=".$file2."\">2.ダウンロード</a><br>";
}elseif(!empty($file1)){
	echo "<br><img src=\"".$file1."\"><br>";
	echo "<a href=\"wa.php?id=".$file1."\">ダウンロード</a><br>";
}
?>
<br>
<div id="menu"> <a href="?compose=reply&inbox=<?php echo $id; ?>">返信する</a> | <a href="?path=todelete&inbox=<?php echo $id; ?>">削除</a> | <a href="?path=tojunk&inbox=<?php echo $id; ?>">ジャンク</a></div>

ダウンロード押下すると、wa.phpで生成した画像ファイルをダウンロードします。
拡張子に応じて、switch文で切り替えます。
wa.php (web access ※outlookの真似をしました)

<?php 

$fpath = $_GET&#91;'id'&#93;;
$ext = substr($fpath, strrpos($fpath, '.') + 1);

$date = date(Ymdhis);

switch ($ext) {
	case 'jpeg':
		$fname = "".$date.".jpeg";
		header('Content-Type: application/force-download');
		header('Content-Length: '.filesize($fpath));
		header('Content-disposition: attachment; filename="'.$fname.'"');
		readfile($fpath);
		break;
	case 'gif':
		$fname = "".$date.".gif";
		header('Content-Type: application/force-download');
		header('Content-Length: '.filesize($fpath));
		header('Content-disposition: attachment; filename="'.$fname.'"');
		readfile($fpath);
		break;
	case 'png':
		$fname = "".$date.".png";
		header('Content-Type: application/force-download');
		header('Content-Length: '.filesize($fpath));
		header('Content-disposition: attachment; filename="'.$fname.'"');
		readfile($fpath);
		break;
	default:
		$fname = "".$date.".jpg";
		header('Content-Type: application/force-download');
		header('Content-Length: '.filesize($fpath));
		header('Content-disposition: attachment; filename="'.$fname.'"');
		readfile($fpath);
		break;
}
?>

まーいいんじゃないでしょうか。

添付が1枚の時

つなげると、

OK! Good!

さて、idはauto incrementではなく、乱英数字8桁くらいにしたいですね。

$str = array_merge(range('a','z'), range('0', '9'), range('A', 'Z'));
$r_str = null;
for($i = 0; $i < 8; $i++){
	$r_str .= $str[rand(0, count($str) - 1)];
}
echo $r_str;

ほい

Gmail、hotmail、Yahoo!添付ファイル受信時の表示とURLの設計

gmail
-> 写真が表示されます。

hotmail
-> 写真を表示

yahoomail
-> 写真表示

ぬぬぬ、なるほど、基本は表示ですね。

ダウンロード時のURI
gmail:https://mail.google.com/mail/u/0/?ui=2&ik=10桁の英数字&view=att&th=16桁の英数字&attid=0.1&disp=safe&realattid=f_9桁の英数字&zw
hotmail:https://attachment.outlook.live.net/owa/hoge@hotmail.com/service.svc/s/GetAttachmentThumbnail?id=AQMkADAwATE2MjYxLTU3MmEtMGU4ZC0wMAItMDAKAEYAAAPamN5TZvIjQZibMQuFo… 以下略
yahoo: https://jp.mg5.mail.yahoo.co.jp/neo/launch?.rand=13桁の英数字#

なんじゃこりゃ?URIだけ見ると、yahooは比較的シンプルに見える。
hotmailは、subdomainがattachmentに変わって、id, x-owa-canary(意味不明?), tokenなどのパラメーターが色々ついています。※owaはoutlook web accessの略ですね。
これ、どういう設計になってるんでしょう???
もう、誰だよ、これつくってるの。

mysqlからデータを取り出して、form・textareaに挿入する

複数行のデータは、explode(“\n”, $hoge);で、1行ずつ配列に変換
inputはvalueに変数を代入、textareaはタグ内に挿入
textareaの改行は”&#13″を使う。

<?php
	$dsn = "mysql:dbname=mail;host=localhost";
	$user = "hoge";
	$password = "hogehoge";
	$id = 5;
	try {
	    $dbh = new PDO($dsn, $user, $password);
	} catch (PDOException $e){
	    print('connection failed:'.$e->getMessage());
	}
		$sql = "select * from sends where id = $id";
	$stmt = $dbh->query($sql);

	$result = $stmt->fetch(PDO::FETCH_ASSOC);
	$to = $result['username'];
	$subject = $result['subject'];
	$body = $result['body'];
	$body = explode("\n", $body);
	$sendtime = $result['sendtime'];
?>
<span id="fs-s">※必須</span><br>
<input type="text" name="to" size="90%" value="<?php echo $to ?>" required><br>
件名<br>
<input type="text" name="subject" value="><?php echo $subject; ?>" size="90%"><br>
本文
<span id="fs-s">※必須</span><br>
<textarea name="body" rows="12" cols="100%" required>
&#13;&#13;<?php
			echo ">".$sendtime ."&#13;"; 
		foreach($body as $value){
			echo ">" .$value;
		}
	?>
</textarea>
</p>
<input type="file" id="files" name="files&#91;&#93;" multiple />
<div id="caution">
※送信できるファイルの拡張子は"gif","jpg","jpeg","png"の何れかです。<br>
※ファイル送信は最大2つまでです。3つ以上選択しても、3つ目以降は送れません。また、二つのファイルを送信する場合は、キーボードの"ctl"ボタンなどで二つ選択した状態で開いてください。</div>
<output id="list"></output>
<p>
<input type="submit" value="送信">
</form>

返信っぽい表示になっていますね。

では、代入していきます。

メール詳細

返信押下

返信

送信済メール

割と簡単でしたね。

値がNULLのselect文

“columname is NULL”で選択できます。

select * from sends where destination = '".$username."' and deleted is NULL and junk is NULL order by sendtime desc

受信トレイ

メール本文

「削除」もしくは「ジャンク」がクリックされた場合は、pdoのupdateでテーブル側のステータスを変更します。

<div id="menu"> <a href="?path=todelete&inbox=<?php echo $id; ?>">削除</a> | <a href="?path=tojunk&inbox=<?php echo $id; ?>">ジャンク</a></div>

変更された対象のテーブルを読み込む。

$sql = "update sends set junk = :junk where id = ".$id.""

基本的なところは大分出来てきましたね♪

あと大きなところとして、1.メールの返信機能、2.添付ファイルの表示
余力があれば、3.Post後にPHP側で宛先の有り無しをチェックして、表示の出し分け

メールの返信はどうすればいいんでしょう?
機能としては、新規作成メールのformに、対象のレコードを呼び出して、fromをtoにセットして、返信するメールのsendtime, subject, bodyを新規メールのbodyの下部に返信とわかるように追加、というところでしょうか。
結構ややこしいですね。

phpでメールボックスをつくろう7 送信したメールを表示

getパラメーターでメールのidを取得して、テーブルから呼び出します。

<?php elseif($_GET&#91;"path"&#93; == 'mailrp'): ?>
			<?php
			$id = empty($_GET&#91;"inbox"&#93;)? 'null' : $_GET&#91;"inbox"&#93;;

			$dsn = "mysql:dbname=mail;host=localhost";
			$user = "hoge";
			$password = "hogehoge";
			try {
			    $dbh = new PDO($dsn, $user, $password);
			} catch (PDOException $e){
			    print('connection failed:'.$e->getMessage());
			}
			$sql3 = "select * from sends where id = '".$id."'";
			$stmt3 = $dbh->query($sql3);

			$result3 = $stmt3->fetch(PDO::FETCH_ASSOC);
			$send_des = $result3['destination'];
			$send_sub = $result3['subject'];
			$send_body = $result3['body'];
			$sendtime = $result3['sendtime'];

			echo "<h3>".$send_sub."</h3>";
			echo "To: ".$send_des. "<br>";
			echo $sendtime. "<hr>";
			echo $send_body. "<br>";
			?>
   <?php endif; ?>

1.nakayamaさんにメールを書く

2.送信する

3.送信一覧

4.メール詳細を表示

送信一覧は、order byでソート順逆ですね。

$sql2 = "select * from sends where username = '".$username."' order by sendtime desc";

新着順にしました。

添付ファイルの表示設計は面倒なので後にして、受信ボックスを先に作りたいと思います。

受信ボックス

受信メール