会員登録の際に被らないようにする実装 – PHP

これは、完全に自分用のメモです。会員登録の際、ポストで飛んできたデータをMYSQLのデータベースに既に登録されているデータと被らないか判定して、もし被っていた場合は登録させないという実装になります。

言語はPHPとPODを用いています。判定内容は「ユーザーネームとメールアドレス、どちらもデータベースの既に存在するユーザーネームとメールアドレスに同じものがなければ登録完了」という実装です。

最初にデータベースのユーザーネームカラムのデータ全てを、ポストで飛んできた値と比較します、その後にデータベースのメールアドレスカラムのデータ全てを、ポストで飛んできた値と比較します。

感想

下記のコードは多くの問題があります。まず、データが存在しない場合`foreach`が動かず登録ができない。それから`$username_flag = “string”;`と`$mail_flag = “string”;`の変数を用いて最終的にDBの中にPOSTされてきたデータが存在するかを確認しているけどスマートなやり方とは思えない。後if文が多すぎだし複雑だし不親切極まりない。きっと後で読む人がだるく感じる。スマートじゃない。

実装

<?php

// echo "名前は".$_POST["UserName"].
// "アドレスは".$_POST["mail"].
// "パスワードは".$_POST["password"].
// "ニュースレターは". $_POST["newsletter"];

if ($_POST["newsletter"] != 'on') {$newsletter = 'off';};
if ($_POST["UserName"] != '' && $_POST["mail"] != '' && $_POST["password"] != '') {
try {
$dbh = new PDO('mysql:host=localhost;dbname=db_name', 'root', ' password');
} catch (PDOException $e) {
print "エラー!: " . $e->getMessage() . "<br/>";
die();
}
$smtt = $dbh->query('select * from tbl_userdata');
$select_data = $smtt->fetchAll(PDO::FETCH_ASSOC);
//ポストで飛んできたデータとDBの値を参照するために必要な変数
$username_flag = "string";
$mail_flag = "string";

foreach ($select_data as $valuee) {
if ($valuee['username'] == $_POST["UserName"]){
//echo "ユーザーネームが存在したからループを終了させる";
//echo $valuee['username'];
$username_flag = "ユーザーネームが存在したからループを終了させる";
break;
}else{
//echo "ユーザーネームは存在しない";
$username_flag = "ユーザーネームは存在しない";
};

if ($valuee['mail'] == $_POST["mail"]){
//echo "メールアドレスは存在したからループを終了させる";
//echo $valuee['mail'];
$mail_flag = "メールアドレスは存在したからループを終了させる";
break;
}else{
//echo "メールアドレスは存在しない";
$mail_flag = "メールアドレスは存在しない";
};
};

if ($mail_flag == "メールアドレスは存在しない" && $username_flag == "ユーザーネームは存在しない") {

echo "登録完了しました";
// クッキーを設定します
setcookie("cookie[password]", $_POST["password"], time()+3600, "./"); // 有効期限1時間
setcookie("cookie[mail]", $_POST["mail"], time()+3600, "./"); // 有効期限1時間
setcookie("cookie[UserName]", $_POST["UserName"], time()+3600, "./"); // 有効期限1時間
#値をdbにインサートする
$stmt = $dbh -> prepare("INSERT INTO tbl_userdata (username, mail, password, newsletter) VALUES (:username, :mail, :password, :newsletter)");
$stmt->bindParam(':username', $_POST["UserName"], PDO::PARAM_STR);
$stmt->bindParam(':mail', $_POST["mail"], PDO::PARAM_STR);
$stmt->bindParam(':password', $_POST["password"], PDO::PARAM_STR);
$stmt->bindParam(':newsletter', $newsletter, PDO::PARAM_STR);
$stmt->execute();
}else{
echo "登録失敗(名前、もしくはメールアドレスが既に存在します)";
};
}else{
//echo "入力されていないフィールフォがあるため何も実行しない";
};
?>