96's blog

WEBサイト制作科 6ヶ月コース

PHP24(フォームでパスワード入力、サーバーエラー表示、データ修正)

ブログ・PHPの勉強「スタッフ登録一覧(1)」

名前とパスワードを入力し、データベースに格納。

1)データベース作成

f:id:webtm2013:20131029122726j:image

2)入力画面

f:id:webtm2013:20131029122933j:image

<!DOCTYPE HTML>
<htmllang="ja">
<head>
<metacharset="utf-8">
<title>おいしい野菜農園</title>
<linkrel="stylesheet"href="./css/style.css">
</head>
<body>
<divid="container">
<header>
<h1>スタッフ追加</h1>
</header>
<sectionid="form">
<formaction="staff_add_check.php"method="post">
<p><labelfor="name">スタッフ名を入力してください。</label><br><inputtype="text"name="name"id="name"size="20" autofocus="autofocus" required></p>
<p><labelfor="password">パスワードを入力してください。</label><br><inputtype="password"name="password"id="password"size="10" required></p>
<p><labelfor="password2">パスワードをもう一度入力してください。</label><br><inputtype="password"name="password2"id="password2"size="10" required></p>
<inputtype="submit"value="確認画面へ">
</form>
</section>
</div>
</body>
</html>
  • HTML5の記述によって入力チェック。

3)確認画面

f:id:webtm2013:20131029132402p:image

<?php
if(empty($_POST)){
  print '処理終了';
  exit;
}

session_start();
  $staff_name=htmlspecialchars($_POST['name'],ENT_QUOTES);
  $staff_password=htmlspecialchars($_POST['password'],ENT_QUOTES);
  $staff_password2=htmlspecialchars($_POST['password2'],ENT_QUOTES);

$_SESSION['name']=$staff_name;
$_SESSION['password']=$staff_password;
$_SESSION['password2']=$staff_password2;
?>
<!DOCTYPE HTML>
<htmllang="ja">
<head>
<metacharset="utf-8">
<title>入力確認画面:おいしい野菜農園</title>
<linkrel="stylesheet"href="./css/style.css">
</head>
<body>
<divid="container">
<?php
if($staff_name==''){
  print 'スタッフ名が入力されていません。<br>';
}else{
  print 'スタッフ名:'.$staff_name.'<br>';
}
if($staff_password==''){
  print 'パスワードが入力されていません。<br>';
}
if($staff_password !=$staff_password2){
  print 'パスワードが一致しません。<br>';
}
if($staff_name==''||$staff_password==''||$staff_password !=$staff_password2){
  print '<form><input type="button" onclick="history.back()" value="戻る"></form>';
}else{
  $staff_password = crypt($staff_password);
  print '<form action="staff_add_done.php"><br>';
  print '<input type="button" onclick="history.back()" value="戻る">';
  print '<input type="submit" value="OK"></form>';
}
?>
</div>
</body>
</html>
  • 入力もれがなく、2回入力させたパスワードが合致していれば、crypt関数でパスワードを暗号化しデータを次のページにもって行く。
  • 暗号化の手法はいろいろありこれだけでは充分ではないが、今回はフォームの練習なので追求はしない。
  • var_dumpで暗号化の確認。

4)送信済み画面

f:id:webtm2013:20131029132219j:image

<?php
session_start();
  $staff_name=htmlspecialchars($_SESSION['name'],ENT_QUOTES);
  $staff_password=htmlspecialchars($_SESSION['password'],ENT_QUOTES);
?>
<!DOCTYPE HTML>
<htmllang="ja">
<head>
<metacharset="utf-8">
<title>入力確認画面:おいしい野菜農園</title>
<linkrel="stylesheet"href="./css/style.css">
</head>
<body>
<divid="container">
<?php
try{
$dsn='mysql:dbname=shop;host=localhost';
$user='root';
$password='root';
$dbh=new PDO($dsn,$user,$password);
$dbh->query('SET NAMES UTF8');

$sql='INSERT INTO mst_staff(name,password) VALUE(?,?)';
$stmt=$dbh->prepare($sql);
$data=$staff_name;
$data=$staff_password;
$stmt->execute($data);

$dbh = null;

print $staff_name.'さんを追加しました。<br>';
}
catch(Exception $e){
  print 'ただいま障害により大変ご迷惑をお掛けしております。';
  exit();
}
?>
<p><ahref="staff_list.php">スタッフ一覧</a></p>
</div>
</body>
</html>
  • try関数でデータベースに格納できなかった場合、catch関数でエラーの表示をし処理を終了する。

5)入力データ一覧

f:id:webtm2013:20131029132550j:image

<!DOCTYPE HTML>
<htmllang="ja">
<head>
<metacharset="utf-8">
<title>スタッフ一覧:おいしい野菜農園</title>
<linkrel="stylesheet"href="./css/style.css">
</head>
<body>
<divid="container">
<h1>スタッフ一覧</h1>
<?php
$dsn='mysql:dbname=shop;host=localhost';
$user='root';
$password='root';
$dbh=new PDO($dsn,$user,$password);
$dbh->query('SET NAMES UTF8');

$sql='SELECT * FROM mst_staff WHERE 1';
$stmt=$dbh ->prepare($sql);
$stmt->execute();
?>
<formaction="staff_edit.php"method="post">
<tableclass="manage">
<tr><th></th><thclass="id">No.</th><thclass="name">名前</th><th>パスワード</th>
</tr>
<?php
while(1){
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
if($rec==false){
  break;
}
  print '<tr><th><input type="radio" name="staff_code" value="'.$rec['code'].'"></th>';
  print '<td>'.$rec['code'].'</td>';
  print '<td>'.$rec['name'].'</td>';
  print '<td>'.$rec['password'].'</td></tr>';
}
?>
</table>
<inputtype="submit"value="修正する">
</form>
<p><ahref="index.html"class="css_btn_class">入力画面に戻る</a></p>
</div>
</body>
</html>
@charset "utf-8";
/* CSS Document */
body, div, h1, p, table, tr, th, td{
  margin:0;
  padding:0;
}
body{
  font-family:
    "Hiragino Kaku Gothic ProN",
    Meiryo,
    sans-serif;
  line-height:1.7;
  color:#333333;
}
#container{
  margin: 20px auto;
  padding:20px;
  width:80%;
  border-left:solid 4px #8ccab3;
  box-shadow:0px 0px 1px 1px #cccccc;
}
h1{
  font-size:18px;
  margin-bottom:20px;
}
p{
  margin-bottom:10px;
}
table{
  margin: 20px 0;
  border-collapse:collapse;
}
th{
  font-weight:600;
  background:#e6f7f1;
}
th,td{
  padding:2px;
  border:solid 1px #cecccd;
}
th.message{
  width:300px;
}
#submit{
  text-align:center;
}
input[type="submit"] {
  margin: 0 0 0 10px;
    padding:  5px 10px;
    font-weight: bold;
    border:  1px solid #FFF;
    color:  #FFF;
    background-color:  #D9F5F3;
    background-image:  -webkit-gradient(linear, left top, left bottom, from(#FF9900), color-stop(48%, #FF8600), color-stop(52%, #FF7700), to(#FF6600));
    font-size:  14px;
    -webkit-border-radius:  4px;
    border-radius:  4px;
    -webkit-box-shadow:  0 0 3px #333;
    box-shadow:  0 0 3px #333;
    cursor: pointer;
}
input[type="button"] {
  margin: 0 0 0 10px;
    padding:  5px 10px;
    font-weight: bold;
    border:  1px solid #FFF;
    color:  #FFF;
    background-color:  #D9F5F3;
    background-image:  -webkit-gradient(linear, left top, left bottom, from(#060), color-stop(48%, #0C3), color-stop(52%, #0F3), to(#093));
    font-size:  14px;
    -webkit-border-radius:  4px;
    border-radius:  4px;
    -webkit-box-shadow:  0 0 3px #333;
    box-shadow:  0 0 3px #333;
    cursor: pointer;
}