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

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

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

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

Q&A

解決済

2回答

7081閲覧

syntax error, unexpected token "}" のエラー表示が出るのですが、原因が不明です。

genkimitsu

総合スコア2

PHP

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

0グッド

0クリップ

投稿2021/10/05 10:50

下記のコードで以下のようなエラーが出てしまいます。

input.php

PHP

1<?php 2 3session_start(); 4 5require 'validation.php'; 6 7header('X-FRAME-OPTIONS:DENY'); 8 9// スーパーグローバル変数 php 9種類 10// 連想配列 11if(!empty($_POST)){ 12 echo '<pre>'; 13 var_dump($_POST) ; 14 echo '</pre>'; 15} 16 17function h($str) 18{ 19 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 20} 21 22 23// 入力、確認、完了 input.php, confirm.php, thanks.php 24// CSRF 偽物のinput.php->悪意のあるページ 25// input.php 26 27$pageFlag = 0; 28$errors=validation($_POST); 29 30if(!empty($_POST['btn_confirm']) && empty($errors)){ 31 $pageFlag = 1; 32} 33if(!empty($_POST['btn_submit'])){ 34 $pageFlag = 2; 35} 36 37 38?> 39 40<!DOCTYPE html> 41<meta charset="utf-8"> 42<head></head> 43<body> 44 45 46<?php if($pageFlag === 1 ) : ?> 47<?php if($_POST['csrf'] === $_SESSION['csrfToken']) :?> 48<form method="POST" action="input.php"> 49氏名 50<?php echo h($_POST['your_name']) ;?> 51<br> 52メールアドレス 53<?php echo h($_POST['email']) ;?> 54<br> 55ホームページ 56<?php echo h($_POST['url']) ;?> 57<br> 58性別 59<?php 60 if($_POST['gender'] === '0'){ echo '男性'; } 61 if($_POST['gender'] === '1'){ echo '女性'; } 62?> 63<br> 64年齢 65<?php 66 if($_POST['age'] === '1'){ echo '〜19歳' ;} 67 if($_POST['age'] === '2'){ echo '20歳〜29歳' ;} 68 if($_POST['age'] === '3'){ echo '30歳〜39歳' ;} 69 if($_POST['age'] === '4'){ echo '40歳〜49歳' ;} 70 if($_POST['age'] === '5'){ echo '50歳〜59歳' ;} 71 if($_POST['age'] === '6'){ echo '60歳〜' ;} 72?> 73 74<br> 75お問い合わせ内容 76<?php echo h($_POST['contact']) ;?> 77<br> 78 79<input type="submit" name="back" value="戻る"> 80<input type="submit" name="btn_submit" value="送信する"> 81<input type="hidden" name="your_name" value="<?php echo h($_POST['your_name']) ;?>"> 82<input type="hidden" name="email" value="<?php echo h($_POST['email']) ;?>"> 83<input type="hidden" name="url" value="<?php echo h($_POST['url']) ;?>"> 84<input type="hidden" name="gender" value="<?php echo h($_POST['gender']) ;?>"> 85<input type="hidden" name="age" value="<?php echo h($_POST['age']) ;?>"> 86<input type="hidden" name="contact" value="<?php echo h($_POST['contact']) ;?>"> 87<input type="hidden" name="csrf" value="<?php echo h($_POST['csrf']) ;?>"> 88</form> 89 90<?php endif; ?> 91 92<?php endif; ?> 93 94<?php if($pageFlag === 2 ) : ?> 95<?php if($_POST['csrf'] === $_SESSION['csrfToken']) :?> 96送信が完了しました。 97 98<?php unset($_SESSION['csrfToken']); ?> 99<?php endif; ?> 100<?php endif; ?> 101 102 103<?php if($pageFlag === 0 ) : ?> 104<?php 105if(!isset($_SESSION['csrfToken'])){ 106 $csrfToken = bin2hex(random_bytes(32)); 107 $_SESSION['csrfToken'] = $csrfToken; 108} 109$token = $_SESSION['csrfToken']; 110?> 111 112<?php if(!empty($errors) && !empty($_POST['btn_confirm'])) :?> 113<?php echo '<ul>';?> 114<?php 115 foreach($errors as $error){ 116 echo '<li>'.$error.'</li>'; 117 } 118?> 119<?php echo '</ul>';?> 120 121<?php endif; ?> 122 123<form method="POST" action="input.php"> 124氏名 125<input type="text" name="your_name" value="<?php if(!empty($_POST['your_name'])){echo h($_POST['your_name']) ;} ?>"> 126<br> 127メールアドレス 128<input type="email" name="email" value="<?php if(!empty($_POST['email'])){echo h($_POST['email']) ;} ?>"> 129<br> 130ホームページ 131<input type="url" name="url" value="<?php if(!empty($_POST['url'])){echo h($_POST['url']) ;} ?>"> 132<br> 133性別 134<input type="radio" name="gender" value="0" 135<?php if(isset($_POST['gender']) && $_POST['gender'] === '0' ) 136{ echo 'checked'; } ?>>男性 137<input type="radio" name="gender" value="1" 138<?php if(isset($_POST['gender']) && $_POST['gender'] === '1' ) 139{ echo 'checked'; } ?>>女性 140<br> 141年齢 142<select name="age"> 143 <option value="">選択してください</option> 144 <option value="1">〜19歳</option> 145 <option value="2">20歳〜29歳</option> 146 <option value="3">30歳〜39歳</option> 147 <option value="4">40歳〜49歳</option> 148 <option value="5">50歳〜59歳</option> 149 <option value="6">60歳〜</option> 150</select> 151<br> 152お問い合わせ内容 153<textarea name="contact"> 154<?php if(!empty($_POST['contact'])){echo h($_POST['contact']) ;} ?> 155</textarea> 156<br> 157<input type="checkbox" name="caution" value="1">注意事項にチェックする 158<br> 159 160<input type="submit" name="btn_confirm" value="確認する"> 161<input type="hidden" name="csrf" value="<?php echo $token; ?>"> 162</form> 163<?php endif; ?> 164 165</body> 166</html> 167

validation.php

php

1<?php 2 3 4function validation($request){ 5 6 $errors=[]; 7 8 if(empty($request['your_name']) || 20<mb_strlen($request['your_name'])){ 9 $errors[]='氏名は必須です。20文字以内で入力してください。'; 10 } 11 12 if(empty($request['email']) || !filter_var($request['email'], FILTER_VALIDATE_EMAIL)){ 13 $errors[]='「メールアドレスは必須です。正しい形式で入力してください。'; 14 } 15 16 17 18 if(!empty($request['url'])){ 19 if(!filter_var($request['url'],FILTER_VALIDATE_URL)){ 20 $errors[]='「ホームページ」は正しい形式で入力してください。'; 21 } 22 } 23 24 if(!isset($request)['gender'])){ 25 $errors[]='「性別」は必須です。'; 26 } 27 28 if(empty($request['age']) || 6<$request['age']){ 29 $errors[]='「年齢」は必須です。'; 30 } 31 32 if(empty($request['contact']) || 200<mb_strlen($request['contact'])){ 33 $errors[]='お問い合わせ内容は必須です。200文字以内で入力してください。'; 34 } 35 36 if(empty($request['caution'])){ 37 $errors[]='「注意事項」をご確認ください。'; 38 } 39 40 return $errors; 41} 42 ?> 43

・エラー名
Parse error: syntax error, unexpected token "}" in C:\Users\bikek\Desktop\xamp\htdocs\train\validation.php on line 14

そしてvalisation.phpの正解サンプルが存在するのですが、この正解サンプルと自分が書いたコードに違いは無いように見えます。
以下がvalidaion.phpの正解サンプルです。

php

1<?php 2 3function validation($request){ //$_POST連想配列 4 5 $errors = []; 6 7 if(empty($request['your_name']) || 20 < mb_strlen($request['your_name']) ){ 8 $errors[] = '「氏名」は必須です。20文字以内で入力してください。'; 9 } 10 11 if(empty($request['email']) || !filter_var($request['email'], FILTER_VALIDATE_EMAIL)){ 12 $errors[] = '「メールアドレス]は必須です。正しい形式で入力してください。'; 13 } 14 15 if(!empty($request['url'])){ 16 if(!filter_var($request['url'], FILTER_VALIDATE_URL)){ 17 $errors[] = '「ホームページ」は正しい形式で入力してください。'; 18 } 19 } 20 21 if(!isset($request['gender'])){ 22 $errors[] = '「性別」は必須です。'; 23 } 24 25 if(empty($request['age']) || 6 < $request['age']){ 26 $errors[] = '「年齢」は必須です。' ; 27 } 28 29 30 if(empty($request['contact']) || 200 < mb_strlen($request['contact']) ){ 31 $errors[] = '「お問い合わせ内容」は必須です。200文字以内で入力してください。'; 32 } 33 34 if(empty($request['caution'])){ 35 $errors[] = '「注意事項」をご確認ください。'; 36 } 37 38 return $errors; 39} 40 41?>

特に14行目あたりで、コードの間違いがないように見えるのですが、なぜエラーが発生するのかが分かりません。
この理由をご回答頂ければ幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

コードの間違いがないように見えるのですが

人間の目(もしくは「手動」)が一番信用できません。
目でなく機械的に確認してください。

左が質問者さんのコードです。
イメージ説明
上記は「WinMerge」というツールを使っていますが、だいぶ違います。
改行はもちろん、スペース1個でも違えば別のものです。

問題の14行目も、機械的に見れば明らかに間違っているコードです。

イメージ説明

コードフォーマットや構文チェック機能のついたエディタを使いましょう。

例えばIDEの1つであるEclipseだとこうなります。

イメージ説明

14行目だけ直しても別のエラーで動かないのは明白です。

投稿2021/10/05 11:01

編集2021/10/05 11:01
m.ts10806

総合スコア80875

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

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

genkimitsu

2021/10/05 11:06

ご指摘して頂き、ありがとうございます。空白でエラーが出るのが初めてのケースであり、このような形のエラーもあるのだと知ることができました。また、アドバイス頂けたように機械的に構文ミスをチェックできるツールを利用してみます。
m.ts10806

2021/10/05 11:07

適切な開発環境を整えるのもいわゆる「環境構築」の一環と言えます。 それだけで効率が全然違ってきますからね。
genkimitsu

2021/10/05 11:45

参考に致します。ありがとうございました。
guest

0

そのカッコの前に全角空白入ってますよ。

投稿2021/10/05 11:00

y_waiwai

総合スコア88042

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

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

genkimitsu

2021/10/05 11:02

指摘ありがとうございます!助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問