🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

解決済

1回答

1982閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2019/12/31 03:43

「よくわかる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

1<?php 2 require('../dbconnect.php'); 3 4 session_start(); 5 6 if (!empty($_POST)) { 7 8 // エラー項目の確認 9 if ($_POST['name'] == '') { 10 $error['name'] = 'blank'; 11 } 12 if ($_POST['email'] == '') { 13 $error['email'] = 'blank'; 14 } 15 if (strlen($_POST['password']) < 4) { 16 $error['password'] = 'length'; 17 } 18 if ($_POST['password'] == '') { 19 $error['password'] = 'blank'; 20 } 21 22 $fileName = $_FILES['image']['name']; 23 24 if (!empty($fileName)) { 25 26 $ext = substr($fileName, -3); 27 28 if ($ext != 'jpg' && $ext != 'gif') { 29 $error['image'] = 'type'; 30 } 31 } 32 33 // 重複アカウントのチェック 34 if (empty($error)) { 35 $sql = sprintf('SELECT COUNT(*) AS cnt FROM members WHERE email="%s"', 36 mysqli_real_escape_string($db, $_POST['email']) 37 ); 38 $record = mysqli_query($db, $sql) or die(mysqli_error($db)); 39 40 $table = mysqli_fetch_assoc($record); 41 42 if ($table['cnt'] > 0) { 43 $error['email'] = 'duplicate'; 44 } 45 } 46 47 if (empty($error)) { 48 49 // 画像をアップロードする  50 $image = date('YmdHis') . $_FILES['image']['name']; 51 52 move_uploaded_file($_FILES['image']['tmp_name'], '../member_picture/' . $image); 53 54 $_SESSION['join'] = $_POST; 55 56 $_SESSION['join']['image'] = $image; 57 58 header('Location: check.php'); 59 exit(); 60 } 61 } 62 63 // 書き直し 64 if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'rewrite'){ 65 $_POST = $_SESSION['join']; 66 $error['rewrite'] = true; 67 } 68?> 69 70<!DOCTYPE> 71<html> 72<head> 73 <meta charset="UTF-8" /> 74 <link rel="stylesheet" type="text/css" href="../style.css" /> 75 <title>会員登録</title> 76</head> 77 78<body> 79<div id="wrap"> 80 <div id="head"> 81 <h1>会員登録</h1> 82 </div> 83 84 <div id="content"> 85 86 <p>次のフォームに必要事項をご記入ください。</p> 87 88 <form action="" method="post" enctype="multipart/form-data"> 89 <dl> 90 <dt>ニックネーム<span class="required">必須</span></dt> 91 <dd> 92 <input type="text" name="name" size="35" maxlength="255" 93 value="<?php echo htmlspecialchars($_POST['name'], 94 ENT_QUOTES, 'UTF-8'); ?>" /> 95 <?php if (isset($error['name']) && $error['name'] == 'blank'): ?> 96 <p class="error">* ニックネームを入力してください</p> 97 <?php endif; ?> 98 </dd> 99 100 <dt>メールアドレス<span class="required">必須</span></dt> 101 <dd> 102 <input type="text" name="email" size="35" maxlength="255" 103 value="<?php echo htmlspecialchars($_POST['email'], 104 ENT_QUOTES, 'UTF-8'); ?>" /> 105 <?php if (isset($error['email']) && $error['email'] == 'blank'): ?> 106 <p class="error">* メールアドレスを入力してください</p> 107 <?php endif; ?> 108 109 <?php if (isset($error['email']) && $error['email'] == 'duplicate'): ?> 110 <p class="error">* 指定されたメールアドレスはすでに登録されています</p> 111 <?php endif; ?> 112 </dd> 113 114 <dt>パスワード<span class="required">必須</span></dt> 115 <dd> 116 <input type="password" name="password" size="10" maxlength="20" 117 value="<?php echo htmlspecialchars($_POST['password'], 118 ENT_QUOTES, 'UTF-8'); ?>" /> 119 <?php if (isset($error['password']) && $error['password'] == 'blank'): ?> 120 <p class="error">* パスワードを入力してください</p> 121 <?php endif; ?> 122 123 <?php if (isset($error['password']) && $error['password'] == 'length'): ?> 124 <p class="error">* パスワードは4文字以上で入力してください</p> 125 <?php endif; ?> 126 </dd> 127 128 <dt>写真など</dt> 129 <dd> 130 <input type="file" name="image" size="35" value="test" /> 131 132 <?php if (isset($error['image']) && $error['image'] == 'type'):?> 133 <p class="error">* 写真などは「.gif」または「.jpg」の画像を指定してください</p> 134 <?php endif; ?> 135 136 <?php if (!empty($error)): ?> 137 <p class="error">* 恐れ入りますが、画像を改めて指定してください</p> 138 <?php endif; ?> 139 </dd> 140 </dl> 141 <div><input type="submit" value="入力内容を確認する" /></div> 142 </form> 143 </div> 144 145 <div id="foot"> 146 <p><img src="../images/txt_copyright.png" width="136" height="15" alt="(C) H2O SPACE, Mynavi" /></p> 147 </div> 148 149</div> 150</body> 151</html> 152

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

php

1$input_name = ""; 2if(array_key_exists('name',$_POST)){ 3 $input_name = $_POST['name']; 4} 5 6// バリデーション 7 8// 表示 9

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

php

1$input_name = filter_input(INPUT_POST, 'name'); 2 3//バリデーション 4 5?> 6//中略 7<input type="text" name="name" size="35" maxlength="255" 8 value="<?php echo htmlspecialchars($input_name, 9 ENT_QUOTES, 'UTF-8'); ?>" />

投稿2019/12/31 03:52

編集2019/12/31 03:56
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/12/31 04:38

いつもお世話になっております。 できました。もうひとつ教えてほしいのですが、コードの中の <?php if (isset($error['name']) && $error['name'] == 'blank'): ?>は参考書では <?php if ($error['name'] == 'blank'): ?>となっていたものを私が編集しなおしたものです。このままでいいでしょうか。<?php if (isset($error['name']) && $error['name'] === 'blank'): ?>としたほうがいいようなことが、ネットでありましたが、違いがあるのでしょうか。
kyoya0819

2019/12/31 04:44 編集

横から失礼します =の数についてですが ==だと、文字の型が違くてもTRUEを出すことができます。 ===だと、文字の型が違うとFALSEになります。 例として 5==5 : TRUE 5=='5' : TRUE 5==='5' : FALSE 5===5 : TRUE です。 ===の方が推奨されるのは、==だと型の相互変換などを行う必要性があるからです。その影響で実行スピードが速くなります。(他にも利点があったら教えて教えていただきたく 詳しくは、こちらをご覧ください。 https://www.php.net/manual/ja/language.operators.comparison.php
m.ts10806

2019/12/31 04:46

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

退会済みユーザー

2019/12/31 05:28

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

退会済みユーザー

2019/12/31 05:30

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問