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

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

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

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

Q&A

解決済

3回答

4886閲覧

PHPで簡易掲示板のログインページについて

Karuma

総合スコア12

PHP

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

0グッド

0クリップ

投稿2016/12/20 06:53

今課題でやっているPHPの記事版ログインページなのですが、たにぐちまことさんのよくわかるPHPの教科書というテキストを読みながらやっています。
その中でログインページを作っているのですが、エラーが出てなかなかまえに進めません。54行目の<?php endif; ?>にエラーが出ているのですが原因はなんなのでしょう?自分で見た限りでは誤字はなさそうなのです。endifについても調べて見たのですが、なかなかヒントがつかめず困っています。何がいけないのか、どなたかご存知の方はおられますでしょうか?

<?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 != snbstr($fileName, -3); if ($ext != 'jpg' && $ext != 'gif') { $error['image'] = 'type'; } } 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'); } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>index.php</title> </head> <body> <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 ($_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 ($error['email'] == 'blank'); ?> <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 ($error['password'] == 'blank'); ?> <p class="error">* パスワードを入力してください</p> <?php endif; ?> <?php if ($error['password'] == 'length'); ?> <p class="error">* パスワードは4文字以上で入力してください</p> <?php endif; ?> </dd> <dt>写真など</dt> <dd> <input type="file" name="image" size="35"> <?php if ($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> </body> </html>

マシンはmac book airを使っています。
環境はATOMでブラウザはgoogle chromeです。
PHP環境はMAMPを使っています。

PHPのスキルは簡単な電卓を作った程度でほぼ初心者です。

どうぞよろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

質問者さんのプログラムをそのまま動かすと、次のようなエラーがでます。

Parse error: syntax error, unexpected 'endif' (T_ENDIF), expecting end of file in PHPファイルのパス on line 54

これは、本来あるべき文字がないときなどプログラムの構文が間違っているときに表示されるエラーです。
今回のプログラムは、HTML中に埋め込んだPHPで行っているif文処理の最後の部分をコロンに変更することで解決できます。
補足

上記のことをすればエラーは回避できますが、Noticeレベルのエラーが出たり、inputタグ内にそのNoticeエラーが表示されてしまったりしていると思うので、そちらについての解決策も記述します。

Notice: Undefined variable: _error in PHPファイルのパス on line 52

まずは上のようなエラー。これは未定義の変数が存在するときに表示されるエラーです。52行目あたりでは_errorという変数が定義されていましたが、これはerrorのタイプミスという扱いで修正します。
すると、今度は上と似たようなエラーがまた表示されます。これは、errorという変数はどこでも定義されていないというエラーなので、errorという配列を定義することでこのエラーは解決するはずです。ちなみに、if文のなかで変数を定義しても、そのif文の中身が実行されない場合その変数は存在しないことになるので、注意が必要です。
また、下のようなエラーが表示されます。

Notice: Undefined index: email in PHPファイルのパス on line 62 Notice: Undefined index: password in PHPファイルのパス on line 71 Notice: Undefined index: password in PHPファイルのパス on line 74 Notice: Undefined index: image in PHPファイルのパス on line 82

$error['email']、$error['password']、$error['image']なんてものは存在しないというエラーです。
これは、$error['email']、$error['password']、$error['image']がHTML中に埋め込んだif文の中で定義されていることが原因です。このエラーが発生している行をみるとHTML中に埋め込んだエラー表示のif文があります。
このエラー表示をする場面は、if文中でエラーメッセージを入れる変数が定義されて、エラーメッセージが代入されたときだけなので、$error['email']、$error['password']、$error['image']が定義されているかどうかを確認することで解決することができます。
また、errorという配列を定義するということを行いましたが、上の修正を行い$error['email']、$error['password']、$error['image']が定義されているかを確認している場合はerrorという配列を定義している箇所を消しても動きます
以上をまとめると、コードは以下のようになります。

PHP

1<?php 2session_start(); 3 4$error = array(); 5if (!empty($_POST)) { 6 7 if ($_POST['name'] == '') { 8 $error['name'] = 'blank'; 9 } 10 if ($_POST['email'] == '') { 11 $error['email'] = 'blank'; 12 } 13 if (strlen($_POST['password']) < 4) { 14 $error['password'] = 'length'; 15 } 16 if ($_POST['password'] == '') { 17 $error['password'] = 'blank'; 18 } 19 20 $fileName = $_FILES['image']['name']; 21 if (!empty($fileName)) { 22 $ext != snbstr($fileName, -3); 23 if ($ext != 'jpg' && $ext != 'gif') { 24 $error['image'] = 'type'; 25 } 26 } 27 28 if (empty($error)) { 29 $image = date('YmdHis') . $_FILES['image']['name']; 30 move_uploaded_file($_FILES['image']['tmp_name'], '../member_picture/' . $image); 31 32 $_SESSION['join'] = $_POST; 33 $_SESSION['join']['image'] = $image; 34 header('Location: check.php'); 35 } 36} 37?> 38<!DOCTYPE html> 39<html lang="ja"> 40<head> 41 <meta charset="utf-8"> 42 <title>index.php</title> 43</head> 44<body> 45<p>次のフォームに必要事項を記入してください。</p> 46<form action="" method="post" enctype="multipart/form-data"> 47 <dl> 48 <dt>ニックネーム<span class="required">必須</span></dt> 49 <dd> 50 <?php if (isset($error['name']) && $error['name'] == 'blank') : ?> 51 <input type="text" name='name' size="35" maxlength="255" 52 value="<?php echo htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8'); ?>"/> 53 <p class="error">* ニックネームを入力してください</p> 54 <?php else: ?> 55 <input type="text" name='name' size="35" maxlength="255" value=""/> 56 <?php endif; ?> 57 </dd> 58 <dt>メールアドレス<span class="required">必須</span></dt> 59 <dd> 60 <?php if (isset($error['email']) && $error['email'] == 'blank') : ?> 61 <input type="text" name="email" size="35" maxlength="255" 62 value="<?php echo htmlspecialchars($_POST['email'], ENT_QUOTES, 'UTF-8'); ?>"/> 63 <p class="error">* メールアドレスを入力してください</p> 64 <?php else:; ?> 65 <input type="text" name="email" size="35" maxlength="255" value=""/> 66 <?php endif; ?> 67 </dd> 68 <dt>パスワード<span class="required">必須</span></dt> 69 <dd> 70 <?php if (isset($error['password']) && $error['password'] == 'blank') : ?> 71 <input type="password" name="password" size="10" maxlength="20" 72 value="<?php echo htmlspecialchars($_POST['password'], ENT_QUOTES, 'UTF-8'); ?>"/> 73 <p class="error">* パスワードを入力してください</p> 74 <?php elseif (isset($error['password']) && $error['password'] == 'length'): ?> 75 <p class="error">* パスワードは4文字以上で入力してください</p> 76 <?php else: ?> 77 <input type="password" name="password" size="10" maxlength="20" value=""/> 78 <?php endif; ?> 79 </dd> 80 <dt>写真など</dt> 81 <dd> 82 <input type="file" name="image" size="35"> 83 <?php if (isset($error['image']) && $error['image'] == 'type'): ?> 84 <p class="error">* 写真などは「.gif」または「.jpg」の画像を指定してください</p> 85 <?php elseif (!empty($error)): ?> 86 <p class="error">* 恐れ入りますが、画像を改めて指定してください</p> 87 <?php endif; ?> 88 </dd> 89 </dl> 90 <div><input type="submit" value="入力内容を確認する"></div> 91</form> 92</body> 93</html>

最後に、22行目あたりに書いてある以下のコードはなんなのでしょうか?
ここも必要であれば適切な形に直さなければいけないと思います。

PHP

1$ext != snbstr($fileName, -3);

投稿2016/12/20 07:46

編集2016/12/20 08:01
s8_chu

総合スコア14731

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

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

Karuma

2016/12/20 10:55

とても丁寧なご説明誠にありがとうございます!とても参考になりました!エラー内容やHTMLまで書き換えてくださったんですね!本当にありがとうございます。
guest

0

ifの最後はセミコロン(;)ではなくコロン(:)です。

php

1<?php if ($_error['name'] == 'blank'): ?> 2<p class="error">* ニックネームを入力してください</p> 3<?php endif; ?>

投稿2016/12/20 07:02

motuo

総合スコア3027

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

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

Karuma

2016/12/20 10:53

ご指摘ありがとうございます。コロンでダメだったので試しにセミコロンでやったままでした。
guest

0

if ($_error['name'] == 'blank');
if ($_error['name'] == 'blank'):
if文の最後をコロンにすればこのエラーは直る。ほかにも問題はあるが

投稿2016/12/20 07:00

date

総合スコア1820

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

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

Karuma

2016/12/20 10:52

ご指摘ありがとうございます。コロンでダメだったので試しにセミコロンでやったままでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問