PHPで会員登録にチャレンジ!【4.データベース接続】

PHP

今回は、PHPでデータベース接続方法
説明していきます。

会員登録の入力欄追加

しかし、その前に「会員登録」でパスワード入力
1度しか行っていなかったのは、
セキュリティというか入力ミスを防ぐために
2度入力するように変更します。

ファイル名:register.html

<記述例>

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>会員登録画面</title>
  </head>
  <body>
    <main>
      <section>
        <form method="post" style="background: lightcyan; margin:10px; padding:10px; border:6px solid royalblue; width:400px;" action="register_check.php">
          <h3>会員登録画面</h3>
            ユーザー名:<input type="text" name="username" size="30" style="margin:6px;"><br>
          メールアドレス:<input type="email" name="email" size="30" style="margin:6px;"><br>
            パスワード:<input type="password" name="password" size="30"style="margin:6px;"><br>
          パスワードをもう一度入力してください。<br>
          パスワード(再):<input type="password" name="password2" size="30"style="margin:6px;"><br>
          <input type="submit" value="登録確認する" style="margin:10px 0 10px 40%;">
        </form>
      </section>
    </main>
  </body>
</html>

1度目のパスワード入力の名前は「password」のままで、
2度目のパスワード入力の名前を「password2」にしました。

それでは、PHPでデータベースと接続する
方法を説明します。

PHPでデータベースと接続する

まず、PHPでデータベース(MySQL)に接続する場合、
データベースサーバーの障害対策が必要です。

障害対策には、「try」「catch」を使います。

記述例

<記述例>

<?php
try
{
  // ここに本来のプログラムを書きます。
}
catch(Exception $e)
{
  // エラーが出た時の表示です。
  print ' ただいま障害により大変ご迷惑をおかけしております。';
  exit();
}
?>

※上記PHPに書かれた「//」は、一行のみのコメントです。

PHPからデータベースにアクセスするには、
順序があります。

1.データベースに接続する
2.データベースエンジンにSQL文で命令する
3.データベースから切断する

最後の切断を忘れるとデータが正しく反映されない
こともありますので、必ず切断してください。

1.データベースに接続する

記述例

<記述例>

$dsn='mysql:dbname=register;host=localhost';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);
$dbh->query('SET NAMES utf8');

[dbname]にデータベース名、
[host]にデータベースサーバー名
[$user]にデータベース接続のユーザー名、
[$password]にデータベース接続のパスワード
をそれぞれ入れます。

ここでは、一連の記事で作成したデータベースと、
XAMPPをインストールした初期値を代入しています。

[dbname]を[register]、[host]を[localhost]、
[$user]を[root]、[$password]を(なし)

実際に動作確認するときは、XAMPPをインストールしていれば
そのままできると思います。

しかし、サーバー上にアップロードして動作確認する場合、
そのサーバーの設定を記述してください

2.データベースにSQL文で命令する

記述例

<記述例>

$sql='SELECT name FROM member WHERE name=?;
$stmt=$dbh->prepare($sql);
$data[]=$username;
$stmt->execute($data);

[$sql(変数)]にSQL文を代入しています。

SQL文の後ろにある[?]の場所に入れたいデータを、
下に書かれてある「$data[]」に代入します。

「$stmt=$dbh->prepare($sql);」
データベースを準備するための命令です。

「$stmt->execute($data);」
SQL文で命令を出しています。

3.データベースから切断する

記述例

<記述例>

$dbh=null;

データベースアクセスを切断する命令です。

会員登録入力チェックを変更

会員登録入力チェックで、ユーザー名の重複チェックを
していなかったので入れていきます。

ファイル名:register_check.php

<記述例>

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>会員登録入力チェック</title>
  </head>
  <body>
<?php

$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
$password2 = $_POST['password2'];

$username = htmlspecialchars($username);
$email = htmlspecialchars($email);
$password = htmlspecialchars($password);
$password2 = htmlspecialchars($password2);

try
{

$dsn='mysql:dbname=register;host=localhost';
$user='root';
$dbpassword='';
$dbh=new PDO($dsn,$user,$dbpassword);
$dbh->query('SET NAMES utf8');

$sql='SELECT name FROM member WHERE name=?';
$stmt=$dbh->prepare($sql);
$data[]=$username;
$stmt->execute($data);

$dbh=null;

}
catch(Exception $e)
{
  print ' ただいま障害により大変ご迷惑をおかけしております。';
  exit();
}

$rec=$stmt->fetch(PDO::FETCH_ASSOC);

$flag1=true;
if($rec == true)
{
  print 'このユーザー名は既に使われております。<br>';
  $flag1=false;
}
if($username == '')
{
  print 'ユーザー名が入力されていません。<br>';
  $flag1=false;
}
else
{
  print 'ユーザー名:'.$username.'<br>';
}
if(preg_match('/^[\w\-\.]+\@[\w\-\.]+\.([a-z]+)$/',$email)==0)
{
  print 'メールアドレスを正確に入力してください。<br><br>';
  $flag1=false;
}
else
{
  print 'メールアドレス:'.$email.'<br>';
}
if($password == '')
{
  print 'パスワードが入力されていません。<br>';
  $flag1=false;
}
if($password!=$password2)
{
  print 'パスワードが一致しません。<br>';
  $flag1=false;
}
if($flag1==false)
{
  print '<form>';
  print '<input type="button" onclick="history.back()" value="戻る">';
  print '</form>';
}
else
{
  $password=md5($password);
  print '<form method="post" action="register_end.php">';
  print '<input type="hidden" name="username" value="'.$username.'">';
  print '<input type="hidden" name="email" value="'.$email.'">';
  print '<input type="hidden" name="password" value="'.$password.'">';
  print '<br><br>';
  print '上記内容で会員登録します。<br><br>';
  print '<input type="button" onclick="history.back()" value="戻る">';
  print '<input type="submit" value="登録する">';
  print '</form>';
}

?>
  </body>
</html>

前回よりいろいろ変更追加していますので解説します。

まず、「password2」を追加しました。

20行目からは、先ほど説明した
データベースに接続し、切断する方法です。

<記述例>

try
{

$dsn='mysql:dbname=register;host=localhost';
$user='root';
$dbpassword='';
$dbh=new PDO($dsn,$user,$dbpassword);
$dbh->query('SET NAMES utf8');

$sql='SELECT name FROM member WHERE name=?';
$stmt=$dbh->prepare($sql);
$data[]=$username;
$stmt->execute($data);

$dbh=null;

}
catch(Exception $e)
{
  print ' ただいま障害により大変ご迷惑をおかけしております。';
  exit();
}

ここでは、SQLでSELECT文を使用しています。

SELECT文を簡単に説明すると、
SELECT カラム名 FROM テーブル名 WHERE 条件式
となっています。

ここでは、テーブル名:member のカラム名:name
条件式(name=?)にあてはまるデータを抽出してください
ということです。

とりあえず、SELECT文は、データベースのテーブルのデータを
選択して受け取るための命令だと理解してください。

43行目では、先ほどSELECT文で選択したデータを
1行分 $rec 変数に代入をしています。

記述例

<記述例>

$rec=$stmt->fetch(PDO::FETCH_ASSOC);

60行目は、メールアドレスの簡易チェックです。

<記述例>

if(preg_match('/^[\w\-\.]+\@[\w\-\.]+\.([a-z]+)$/',$email)==0)
{
  print 'メールアドレスを正確に入力してください。<br><br>';
  $flag1=false;
}

preg_match 命令で正規表現を使い、
メールアドレスをチェックしています。

74行目は、2回入力したパスワードが同じものか
チェックしています。

<記述例>

if($password!=$password2)
{
  print 'パスワードが一致しません。<br>';
  $flag1=false;
}

45行目は、$flag1 変数に、
真(true)を代入しています。

<記述例>

$flag1=true;

これは、チェックした後処理のためにあります。

ユーザー名、メールアドレス、パスワードを
チェックしてだめたっだ場合、
偽(false)を代入しています。

<記述例>

print 'ユーザー名が入力されていません。<br>';
$flag1=false;

79行目で $flag1 が偽(false)だった場合の処理をしています。

<記述例>

if($flag1==false)
{
  print '<form>';
  print '<input type="button" onclick="history.back()" value="戻る">';
  print '</form>';
}

やっぱり長くなってしまいましたが、
これで「register_check.php」の解説
終わります。

この後、88行目にあるファイル「register_end.php」
に入力データを渡し、いよいよ会員登録していきます。

長くなったので、次回にします。

コメント

タイトルとURLをコピーしました