今回は、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」
に入力データを渡し、いよいよ会員登録していきます。
長くなったので、次回にします。
コメント