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

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

ただいまの
回答率

87.61%

表示はされるのですが、 少しおかしいような気がします。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 578
退会済みユーザー

退会済みユーザー

「よくわかるPHPの教科書」の参考書を利用して勉強しています。表示はされるのですが、
少しおかしいような気がします。
「check_step5_1.php」の</form>のすぐ上の
<div><a href="index.php?action=rewrite">&laquo;&nbsp;書き直す</a> 
| <input type="submit" value="登録する" /></div>
の箇所の「index.php」は「index_step5_2.php」にして
<div><a href="index_step5_2.php?action=rewrite">&laquo;&nbsp;書き直す</a> 
| <input type="submit" value="登録する" /></div>
とすべきなのですが、「index_step5_2.php」にすると、なにも表示されません。

<div><a href="index.php?action=rewrite">&laquo;&nbsp;書き直す</a> 
| <input type="submit" value="登録する" /></div>
とすると今打ち込んだデータが再現されます。

どこか間違っていると思い検討したのですが、探し出せません。
よろしくお願いいたします。

実行した後のURLは「php_sample/part5_2_sample/join/step5/index_step5_5.php?action=rewrite」です。
実行後の画面です。

イメージ説明
頂きましたネットは既に拝見済みですが、まだよく消化できていません。

//index_step5_2.php

<?php
    require('../dbconnect.php');

    session_start();
    $input_name = filter_input(INPUT_POST, 'name');

    $input_email = filter_input(INPUT_POST, 'email');

    $input_password = filter_input(INPUT_POST, 'password');

    $input_image = filter_input(INPUT_POST, 'image');

    if (!empty($_POST)) {

        // エラー項目の確認
        if ($_POST['name'] == '') {
        $error['name'] = 'blank';
        }
        if ($_POST['email'] == '') {
            $error['email'] = 'blank';
        }
        if (strlen($_POST['password']) < 4) {
            $error['password'] = 'length';
        }
        if ($_POST['password'] == '') {
            $error['password'] = 'blank';
        }

        $fileName = $_FILES['image']['name'];

        if (!empty($fileName)) {

            $ext = substr($fileName, -3);

            if ($ext != 'jpg' && $ext != 'gif') {
                $error['image'] = 'type';
            }
        }

        // 重複アカウントのチェック
        if (empty($error)) {
            $sql = sprintf('SELECT COUNT(*) AS cnt FROM members WHERE email="%s"',
                        mysqli_real_escape_string($db, $input_email)
            );
            $record = mysqli_query($db, $sql) or die(mysqli_error($db));

            $table = mysqli_fetch_assoc($record);

            if ($table['cnt'] > 0) {
                $error['email'] = 'duplicate';
            }
        }

        if (empty($error)) {

            // 画像をアップロードする 
            $image = date('YmdHis') . $_FILES['image']['name'];

            move_uploaded_file($_FILES['image']['tmp_name'], '../member_picture/' . $image);

            $_SESSION['join'] = $_POST;

            $_SESSION['join']['image'] = $image;

            header('Location: check_step5_1.php');
            exit();
        }
    }

    // 書き直し
    // 書き直し
    if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'rewrite'){
        $_POST = $_SESSION['join'];
        $error['rewrite'] = true;
    }
?>

<!DOCTYPE>
<html>
<head>
    <meta  charset="UTF-8" />
    <link rel="stylesheet" type="text/css" href="../style.css" />
    <title>会員登録</title>
</head>

<body>
<div id="wrap">
    <div id="head">
            <h1>会員登録</h1>
    </div>

    <div id="content">

        <p>次のフォームに必要事項をご記入ください。</p>

        <form action="" method="post" enctype="multipart/form-data">
            <dl>
                <dt>ニックネーム<span class="required">必須</span></dt>
                <dd>
                    <input type="text" name="name" size="35" maxlength="255" 
                                 value="<?php echo htmlspecialchars($input_name, 
                                 ENT_QUOTES, 'UTF-8'); ?>" />
                    <?php if ($input_name == 'blank'): ?>
                                <p class="error">* ニックネームを入力してください</p>
                    <?php endif; ?>
                </dd>

                <dt>メールアドレス<span class="required">必須</span></dt>
                <dd>
                    <input type="text" name="email" size="35" maxlength="255" 
                    value="<?php echo htmlspecialchars($input_email,
                    ENT_QUOTES, 'UTF-8'); ?>" />
                    <?php if ($input_email == 'blank'): ?>
                                <p class="error">* メールアドレスを入力してください</p>
                    <?php endif; ?>

                    <?php if ($input_email == 'duplicate'): ?>
                                <p class="error">* 指定されたメールアドレスはすでに登録されています</p>
                    <?php endif; ?>
                </dd>

                <dt>パスワード<span class="required">必須</span></dt>
                <dd>
                    <input type="password" name="password" size="10" maxlength="20" 
                                 value="<?php echo htmlspecialchars($input_password, 
                                                         ENT_QUOTES, 'UTF-8'); ?>" />
                    <?php if ($input_password == 'blank'): ?>
                                <p class="error">* パスワードを入力してください</p>
                    <?php endif; ?>

                    <?php if ($input_password == 'length'): ?>
                                <p class="error">* パスワードは4文字以上で入力してください</p>
                    <?php endif; ?>
                </dd>

                <dt>写真など</dt>
                <dd>
                    <input type="file" name="image" size="35" value="test" />

                    <?php if ($input_image == 'type'):?>
                                <p class="error">* 写真などは「.gif」または「.jpg」の画像を指定してください</p>
                    <?php endif; ?>

                    <?php if (!empty($error)): ?>
                                <p class="error">* 恐れ入りますが、画像を改めて指定してください</p>
                    <?php endif; ?>
                </dd>
            </dl>
            <div><input type="submit" value="入力内容を確認する" /></div>
        </form>
    </div>

    <div id="foot">
        <p><img src="../images/txt_copyright.png" width="136" height="15" alt="(C) H2O SPACE, Mynavi" /></p>
    </div>

</div>
</body>
</html>
//check_step5_1.php -->check_step5_2.phpに変更

<?php
session_start();
require('../dbconnect.php');

if (!isset($_SESSION['join'])) {
    header('Location: index_step5_2.php');
    exit();
}


?>

<!DOCTYPE>
<html>
<head>
    <meta  charset="UTF-8" />
    <link rel="stylesheet" type="text/css" href="../style.css" />
    <title>会員登録</title>
</head>

<body>
<div id="wrap">
<div id="head">
<h1>会員登録</h1>
</div>

<div id="content">
<p>記入した内容を確認して、「登録する」ボタンをクリックしてください</p>
<form action="" method="post">
    <input type="hidden" name="action" value="submit" />
    <dl>
        <dt>ニックネーム</dt>
        <dd>
        <?php echo htmlspecialchars($_SESSION['join']['name'], ENT_QUOTES, 'UTF-8'); ?>
        </dd>
        <dt>メールアドレス</dt>
        <dd>
        <?php echo htmlspecialchars($_SESSION['join']['email'], ENT_QUOTES, 'UTF-8'); ?>
        </dd>
        <dt>パスワード</dt>
        <dd>
        【表示されません】
        </dd>
        <dt>写真など</dt>
        <dd>
        <img src="../member_picture/<?php echo htmlspecialchars($_SESSION['join']['image'], ENT_QUOTES, 'UTF-8'); ?>" width="100" height="100" alt="" />
        </dd>
        </dl>
        <div><a href="index_step5_2.php?action=rewrite">&laquo;&nbsp;書き直す</a> | <input type="submit" value="登録する" /></div>
</form>
</div>

<div id="foot">
<p><img src="../images/txt_copyright.png" width="136" height="15" alt="(C) H2O Space. MYCOM" /></p>
</div>

</div>
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/12/31 18:18 編集

    「とすると」と言われても、そのあとどういう操作したのか書かれないと誰も再現できませんので。
    要は他者が再現できるコード、その後の操作手順まで具体的に提示していただく必要があります。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/12/31 18:46

    XAMPPを使って登録画面「index_step5_2.php」実行します。次に登録画面が表示されるので、テキスト画面に「ニックネーム」「メールアドレス」「パスワード」を記入して「image画像を選択」で画像を選択したのちにクリックすると、入力テキスト、画像が表示されます。ここで「書き直しボタン」をクリックしたときに、表示がうまくいきません。上の書き込みのように、「check_step5_1.php」を変更すると
    「書き直しボタン」を押したときにもとの打ち込みが再現できます。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/12/31 19:25

    index.phpからindex_step5_2.phpを導いているので、index_step5_2.phpのどこかがも違っていると思われます。check_step5_1.phpから遷移するindex.phpは正常動作をしているので、index_step5_2.phpを精査してみます。

    キャンセル

回答 2

checkベストアンサー

+1

「画面遷移」なのでREQUEST METHODはGETなのでPOSTで参照できる情報はありません。
filter_input()の結果もNULLでしょう。 

$_SESSIONに入れてたとしてもその$_SESSIONを参照している実装になってませんし。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/01 12:49

    自分で修正をして書き換えのとき、打ち込みデータが再現できるようになりましたが、@$_POST['name']を
    使ったので、間違いがあるか心配です。コードについて直したほうがいい箇所があったら教えてください。
    お願いいたします。

    キャンセル

0

コードの変更修正をしました
//index_step5_2.php
<?php
require('../dbconnect.php');

session_start();

$input_action = "";
if(array_key_exists('action',$_GET)){
$input_action = $_GET['action'];
}

if (!empty($_POST)) {
// エラー項目の確認
if ($_POST['name'] == '') {
$error['name'] = 'blank';
}
if ($_POST['email'] == '') {
$error['email'] = 'blank';
}
if (strlen($_POST['password']) < 4) {
$error['password'] = 'length';
}
if ($_POST['password'] == '') {
$error['password'] = 'blank';
}
$fileName = $_FILES['image']['name'];
if (!empty($fileName)) {
$ext = substr($fileName, -3);
if ($ext != 'jpg' && $ext != 'gif') {
$error['image'] = 'type';
}
}

// 重複アカウントのチェック
if (empty($error)) {
$sql = sprintf('SELECT COUNT(*) AS cnt FROM members WHERE email="%s"',
mysqli_real_escape_string($db, $_POST['email'])
);
$record = mysqli_query($db, $sql) or die(mysqli_error($db));
$table = mysqli_fetch_assoc($record);
if ($table['cnt'] > 0) {
$error['email'] = 'duplicate';
}
}

if (empty($error)) {
// 画像をアップロードする 
$image = date('YmdHis') . $_FILES['image']['name'];
move_uploaded_file($_FILES['image']['tmp_name'], '../member_picture/' . $image);

$_SESSION['join'] = $_POST;
$_SESSION['join']['image'] = $image;
header('Location: check_step5_2.php');
exit();
}
}

// 書き直し
if ($input_action == 'rewrite') {
$_POST = $_SESSION['join'];
}
?>

<!DOCTYPE>
<html>
<head>
<meta  charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="../style.css" />
<title>会員登録</title>
</head>

<body>
<div id="wrap">
<div id="head">
<h1>会員登録</h1>
</div>

<div id="content">
<p>次のフォームに必要事項をご記入ください。</p>
<form action="" method="post" enctype="multipart/form-data">
<dl>
<dt>ニックネーム<span class="required">必須</span></dt>
<dd>
<input type="text" name="name" size="35" maxlength="255" 
value="<?php echo htmlspecialchars(@$_POST['name'], 
ENT_QUOTES, 'UTF-8'); ?>" />
<?php if(!empty($error['name']) && $error['name'] == 'blank'): ?>
<p class="error">* ニックネームを入力してください</p>
<?php endif; ?>
</dd>
<dt>メールアドレス<span class="required">必須</span></dt>
<dd>
<input type="text" name="email" size="35" maxlength="255"
value="<?php echo htmlspecialchars(@$_POST['email'], 
ENT_QUOTES, 'UTF-8'); ?>" />
<?php if(!empty($error['email']) && $error['email'] == 'blank'): ?>
<p class="error">* メールアドレスを入力してください</p>
<?php endif; ?>
<?php if(!empty($error['email']) && $error['email'] == 'duplicate'): ?>
<p class="error">* 指定されたメールアドレスはすでに登録されています</p>
<?php endif; ?>
</dd>
<dt>パスワード<span class="required">必須</span></dt>
<dd>
<input type="password" name="password" size="10" maxlength="20" 
value="<?php echo htmlspecialchars(@$_POST['password'], 
ENT_QUOTES, 'UTF-8'); ?>" />

<?php if(!empty($error['password']) && $error['password'] == 'blank'): ?>
<p class="error">* パスワードを入力してください</p>
<?php endif; ?>

<?php if(!empty($error['password']) && $error['password'] == 'length'): ?>
<p class="error">* パスワードは4文字以上で入力してください</p>
<?php endif; ?>
</dd>
<dt>写真など</dt>
<dd><input type="file" name="image" size="35" value="test" />
<?php if(!empty($error['image']) && $error['image'] == 'type'): ?>
<p class="error">* 写真などは「.gif」または「.jpg」の画像を指定してください</p>
<?php endif; ?>

<?php if (!empty($error)): ?>
<p class="error">* 恐れ入りますが、画像を改めて指定してください</p>
<?php endif; ?>
</dd>
</dl>
<div><input type="submit" value="入力内容を確認する" /></div>
</form>
</div>

<div id="foot">
<p><img src="../images/txt_copyright.png" width="136" height="15" alt="(C) H2O SPACE, Mynavi" /></p>
</div>

</div>
</body>
</html>

//check_step5_1.php --->check_step5_2.php に変更修正しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/01 12:44

    <input type="text" name="name" size="35" maxlength="255"
    『value="<?php echo htmlspecialchars(@$_POST['name'],
    ENT_QUOTES, 'UTF-8'); ?>" />
    <?php if(!empty($error['name']) && $error['name'] == 'blank'): ?>
    <p class="error">* ニックネームを入力してください</p>』
    のように変更しました。あとのメールアドレス、パスワードも同じように変更しています。
    書き換えの時にどうしても打ち込んだデータが消えるので『@$_POST['name']』にしたのですが、
    これでいいのかしっくりいきません。
    とりあえず書き込み、書き換えが出来るようになりました。

    キャンセル

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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