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

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

ただいまの
回答率

87.80%

会員登録画面のニックネームのテキスト欄に出ているエラーを消したい

解決済

回答 1

投稿

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

退会済みユーザー

「よくわかるPHPの教科書」の参考書を利用して勉強しています。表示はされるのですが、
会員登録画面のニックネームのテキスト欄にエラーが出ています。この本はエラーだらけで
苦労していますが、勉強になりました。ネットでだいぶ怒られましたが、よろしくお願いいたします。

イメージ説明

内容的は「<br /><b>Notice</b>:  Undefined index: name in <b>C:\xampp\htdocs\php_sample\part5_2_sample\join\step5\index.php</b> on line <b>93</b><br />」

となっており、Undefined index:についてはだいぶ勉強したつもりなんですが、
ニックネームのコードのなかの<input type="text" name="name" size="35" maxlength="255" 
value="<?php echo htmlspecialchars($_POST['name'], 
ENT_QUOTES, 'UTF-8'); ?>" />を<input type="text" name="name" size="35" maxlength="255" 
value="<?php echo htmlspecialchars(isset($_POST['name']), 
ENT_QUOTES, 'UTF-8'); ?>" />
とすると、エラーは消えるのですが、書き換えの時にissetの戻り値がニックネームのテキスト欄に「1」と表示されます。これは当然なんですが、、これを最初に打ち込んだニックネームを表示するにはどのようにしたらいいでしょうか。

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

    session_start();

    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.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($_POST['name'], 
                                 ENT_QUOTES, 'UTF-8'); ?>" />
                    <?php if (isset($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 (isset($error['email']) && $error['email'] == 'blank'): ?>
                                <p class="error">* メールアドレスを入力してください</p>
                    <?php endif; ?>

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

                    <?php if (isset($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 (isset($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>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

原因としては画面初期表示時点ではREQUEST METHODはGETであるため$_POSTが空であることです。

この手のものは個別に初期値空を設定した変数を用意しておきarray_key_exists()やisset()でチェックした上で変数に受け取るのが定石ですが、

$input_name = "";
if(array_key_exists('name',$_POST)){
    $input_name = $_POST['name'];
}

// バリデーション

// 表示

直接$_POST参照するとコードも長くなるので、バリデーションするときも含めてfilter_input()で1回受け取ると短く済みます。

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

//バリデーション

?>
//中略
<input type="text" name="name" size="35" maxlength="255" 
                                 value="<?php echo htmlspecialchars($input_name, 
                                 ENT_QUOTES, 'UTF-8'); ?>" />

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/12/31 13:46

    参考書はそもそも実装方法として古いので、そもそも私はその書き方をしません。
    というかフレームワークなりテンプレートエンジンなりを利用するので、大分実装方法変わりますね。
    回答の最初に書いてあるように、初期値設定しておけばそもそもisset()なんて使う必要なくなります。

    キャンセル

  • 2019/12/31 14:28

    ありがとうございます。未熟者で、PHPで初期値設定してあるものを使うのですね。
    <?php if (isset($error['name']) && $error['name'] === 'blank'): ?>を
    <?php if ($input_name == ''): ?>に書き換えてすべてうまくいきました。あと50ページです。
    頑張ります。1週間以上苦戦していました。

    キャンセル

  • 2019/12/31 14:30

    asuchi0819さん、よくわかりました。
    ありがとうございます。

    キャンセル

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

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

関連した質問

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