質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

解決済

PHP会員登録フォーム

teityann1225
teityann1225

総合スコア158

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1回答

0リアクション

0クリップ

2604閲覧

投稿2017/04/22 10:38

やりたいこと

本魁夷登録画面を正常に動かしたい。
よろしくお願いします。

###エラー内容

このページは動作していませんとなる。

###コード

確認画面

<?php session_start(); header("Content-type: text/html; charset=Shift_JIS); //クロスサイトリクエストフォージェリ(CSRF)対策のトークン判定 if ($_POST['token'] != $_SESSION['token']){ echo "不正アクセスの可能性あり"; exit(); } //クリックジャッキング対策 header('X-FRAME-OPTIONS: SAMEORIGIN'); //前後にある半角全角スペースを削除する関数 function spaceTrim ($str) { // 行頭 $str = preg_replace('/^[ ]+/u', '', $str); // 末尾 $str = preg_replace('/[ ]+$/u', '', $str); return $str; } //エラーメッセージの初期化 $errors = array(); if(empty($_POST)) { header("Location: registration_mail_form.php"); exit(); }else{ //POSTされたデータを各変数に入れる $account = isset($_POST['account']) ? $_POST['account'] : NULL; $password = isset($_POST['password']) ? $_POST['password'] : NULL; //前後にある半角全角スペースを削除 $account = spaceTrim($account); $password = spaceTrim($password); //アカウント入力判定 if ($account == ''): $errors['account'] = "アカウントが入力されていません。"; elseif(mb_strlen($account)>10): $errors['account_length'] = "アカウントは10文字以内で入力して下さい。"; endif; //パスワード入力判定 if ($password == ''): $errors['password'] = "パスワードが入力されていません。"; elseif(!preg_match('/^[0-9a-zA-Z]{5,30}$/', $_POST["password"])): $errors['password_length'] = "パスワードは半角英数字の5文字以上30文字以下で入力して下さい。"; else: $password_hide = str_repeat('*', strlen($password)); endif; } //エラーが無ければセッションに登録 if(count($errors) === 0){ $_SESSION['account'] = $account; $_SESSION['password'] = $password; } ?> <!DOCTYPE html> <html> <head> <title>会員登録確認画面</title> <meta charset="utf-8"> </head> <body> <h1>会員登録確認画面</h1> <?php if (count($errors) === 0): ?> <form action="registration_insert.php" method="post"> <p>メールアドレス:<?=htmlspecialchars($_SESSION['mail'], ENT_QUOTES)?></p> <p>アカウント名:<?=htmlspecialchars($account, ENT_QUOTES)?></p> <p>パスワード:<?=$password_hide?></p> <input type="button" value="戻る" onClick="history.back()"> <input type="hidden" name="token" value="<?=$_POST['token']?>"> <input type="submit" value="登録する"> </form> <?php elseif(count($errors) > 0): ?> <?php foreach($errors as $value){ echo "<p>".$value."</p>"; } ?> <input type="button" value="戻る" onClick="history.back()"> <?php endif; ?> </body> </html>

フォーム

<?php session_start(); header("Content-type: text/html; charset=Shift_JIS"); //クロスサイトリクエストフォージェリ(CSRF)対策 $_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32)); $token = $_SESSION['token']; //クリックジャッキング対策 header('X-FRAME-OPTIONS: SAMEORIGIN'); //データベース接続 require_once("DSN.php"); $dbh = db_connect(); //エラーメッセージの初期化 $errors = array(); if(empty($_GET)) { header("Location: registration_mail_form.php"); exit(); }else{ //GETデータを変数に入れる $urltoken = isset($_GET[urltoken]) ? $_GET[urltoken] : NULL; //メール入力判定 if ($urltoken == ''){ $errors['urltoken'] = "もう一度登録をやりなおして下さい。"; }else{ try{ //例外処理を投げる(スロー)ようにする $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //flagが0の未登録者・仮登録日から24時間以内 $statement = $dbh->prepare("SELECT mail FROM pre_member WHERE urltoken=(:urltoken) AND flag =0 AND date > now() - interval 24 hour"); $statement->bindValue(':urltoken', $urltoken, PDO::PARAM_STR); $statement->execute(); //レコード件数取得 $row_count = $statement->rowCount(); //24時間以内に仮登録され、本登録されていないトークンの場合 if( $row_count ==1){ $mail_array = $statement->fetch(); $mail = $mail_array[mail]; $_SESSION['mail'] = $mail; }else{ $errors['urltoken_timeover'] = "このURLはご利用できません。有効期限が過ぎた等の問題があります。もう一度登録をやりなおして下さい。"; } //データベース接続切断 $dbh = null; }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } } } ?> <!DOCTYPE html> <html> <head> <title>会員登録画面</title> <meta charset="utf-8"> </head> <body> <h1>会員登録画面</h1> <?php if (count($errors) === 0): ?> <form action="registration_check.php" method="post"> <p>メールアドレス:<?=htmlspecialchars($mail, ENT_QUOTES, 'UTF-8')?></p> <p>アカウント名:<input type="text" name="account"></p> <p>パスワード:<input type="text" name="password"></p> <input type="hidden" name="token" value="<?=$token?>"> <input type="submit" value="確認する"> </form> <?php elseif(count($errors) > 0): ?> <?php foreach($errors as $value){ echo "<p>".$value."</p>"; } ?> <?php endif; ?> </body> </html>

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。