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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

Q&A

解決済

4回答

3338閲覧

PHPで簡易電卓作成中。エラーメッセージがうまく表示されない

sepi-0401

総合スコア10

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

0グッド

0クリップ

投稿2016/09/27 10:23

編集2016/09/27 10:26

###前提・実現したいこと
PHPで簡易電卓(四則計算のみ)を作っています。
htmlの画面で数字を入力しなかった場合のエラーメッセージが表示されません。

記号のみ選択した場合や記号と数字を片方だけ入力した場合、エラーメッセージが表示されません。何も選択せずに「計算」を押すと記号に対してのみエラーが表示されます。

###該当のソースコード

HTML

1<!DOCTYPE html> 2 <html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>calc.html</title> 6 </head> 7 <body> 8 <form action="calc0927-5.php" method="post"> 9 <input type= "number" name="left" size=3> 10 11 <select name="symbol" size=1> 12 <option value="">選択してください</option> 13 <option value="+">+</option> 14 <option value="-">-</option> 15 <option value="×">×</option> 16 <option value="÷">÷</option> 17 </select> 18 19 <input type="number" name="right" size=3> =? 20 <br> 21 <input type="submit" value="計算"> 22 <input type="reset" value="クリア"> 23 24 </form> 25 </body> 26</html>

###該当のソースコード

php

1<?php 2 3if(isset($_POST['left']) and isset($_POST['right'])){ 4 echo htmlspecialchars($_POST['left'], ENT_QUOTES, 'UTF-8'); 5 echo '<br>'; 6 echo htmlspecialchars($_POST['right'], ENT_QUOTES, 'UTF-8'); 7 echo '<br>'; 8 9 if(isset($_POST['symbol'])){ 10 $symbol = $_POST['symbol']; 11 12 switch($symbol){ 13 case "": 14 $answer='error'; 15 echo '<p>エラー</p>'; 16 echo '計算記号を選択してください'; 17 echo '<br>'; 18 19 case "+": 20 $answer=$_POST['left']+$_POST['right']; 21 break; 22 23 case "-": 24 $answer=$_POST['left']-$_POST['right']; 25 break; 26 27 case "×": 28 $answer=$_POST['left']*$_POST['right']; 29 break; 30 31 case "÷": 32 33 if($_POST['right']==0 and $_POST['symbol']=='÷'){ 34 $answer='error'; 35 echo '<p>エラー</p>'; 36 echo '0以外の数字を入れてください'; 37 echo "<br>"; 38 39 }else{ 40 $answer=$_POST['left']/$_POST['right']; 41 42 }break; 43 default: 44 } 45 //計算結果を表示 46 echo ($_POST['left'].' '.$_POST['symbol'].' '.$_POST['right'].' '.'='.' '.$answer); 47 48 }else{ 49 $answer='error'; 50 echo '<p>エラー</p>'; 51 echo '計算記号を選択してください'; 52 echo '<br>'; 53 } 54}else{ 55 $answer='error'; 56 echo '<p>エラー</p>'; 57 echo '値を入力してください'; 58 echo '<br>'; 59} 60?>

###試したこと
htmlspecialchars関数の使いどころが間違っているのかもしれません。しかし、そもそもこの関数の使いどころがいまいち理解しきれちないです。悪質な書き込みを防ぐためだというのはわかるのですが…
用意してある四つのエラーメッセージのうち残りの三つはきちんと動きました。

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

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

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

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

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

guest

回答4

0

PHP

1<?php 2 3if(isset($_POST['left']) and isset($_POST['right'])){ 4 echo htmlspecialchars($_POST['left'], ENT_QUOTES, 'UTF-8'); 5 echo '<br>'; 6 echo htmlspecialchars($_POST['right'], ENT_QUOTES, 'UTF-8'); 7 echo '<br>'; 8 9 if(isset($_POST['symbol'])){ 10 $symbol = $_POST['symbol']; 11 12 switch($symbol){ 13 case "": 14 $answer='error'; 15 echo '<p>エラー</p>'; 16 echo '計算記号を選択してください'; 17 echo '<br>'; 18 19 case "+": 20 $answer=$_POST['left']+$_POST['right']; 21 break; 22 23 case "-": 24 $answer=$_POST['left']-$_POST['right']; 25 break; 26 27 case "×": 28 $answer=$_POST['left']*$_POST['right']; 29 break; 30 31 case "÷": 32 33 if($_POST['right']==0 and $_POST['symbol']=='÷'){ 34 $answer='error'; 35 echo '<p>エラー</p>'; 36 echo '0以外の数字を入れてください'; 37 echo "<br>"; 38 39 }else{ 40 $answer=$_POST['left']/$_POST['right']; 41 42 }break; 43 default: 44 } 45 //値のどちらかが何も入ってないときこれを表示することにした。 46 if($_POST['right']== ''|| $_POST['right']==''){ 47 echo '<p>エラー</p>'; 48 echo '値を入力してください'; 49 echo '<br>'; 50 return;} 51 //計算結果を表示 52 echo ($_POST['left'].' '.$_POST['symbol'].' '.$_POST['right'].' '.'='.' '.$answer); 53 //ここから下の$answer='error'はいらないのでは疑惑 54 }else{ 55 $answer='error'; 56 echo '<p>エラー</p>'; 57 echo '計算記号を選択してください'; 58 echo '<br>'; 59 } 60}else{ 61 $answer='error'; 62 echo '<p>エラー</p>'; 63 echo '値を入力してください'; 64 echo '<br>'; 65} 66?>

これを追加すればいいんじゃないかなという点と素朴な疑問を入れておきました。

追加:htmlspecialchars関数について
自分もあまり詳しくないので説明が間違ってる可能性があります。そのときはごめんなさい。
例えば、文字を入れるtextの場合などに>や&を別のユーザーさんが書き込むときがあります。
そのときにそのまま受け取ってしまうとまずいときになることがあります。
そのため>はHTMLの>に変換され&は&に変換して安全な形に変更しておき
出力するときは同じ形でもどします。
なので今回のようなinput type= "number"ならば、数字限定なのでおそらく必要ないんじゃないかなと思われます。きっとこれを読んで間違ってたら誰かが訂正してくれることを願ってます。
htmlspecialchars

投稿2016/09/27 12:14

編集2016/09/27 12:34
toutou

総合スコア2050

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

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

rana_kualu

2016/09/27 16:07

> input type= "number"ならば、数字限定なのでおそらく必要ないんじゃないかなと思われます だめです。必須です。 typeはブラウザの機能なので簡単に回避可能です。 エスケープは「PHPからPHP以外に出力するところ」に設置します。 参考: http://qiita.com/rana_kualu/items/11cd41de5f0364ba2ee8
guest

0

phpの1行目、issetは変数が有効かどうかなので、値の中身をみるならこんな感じになりますね。

if(!empty($_POST['left']) && !empty($_POST['right'])){

$_POST['left']、$_POST['right']は常に有効なのでtrueになります。

投稿2016/09/27 11:08

fromageblanc

総合スコア2724

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

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

kei344

2016/09/27 12:23

!emptyなら「0」も弾かれませんか?
fromageblanc

2016/09/27 14:28

おー、0弾いちゃいますね。 ご指摘ありがとうございます。
guest

0

こんな感じですか?
※ ロジック部分は自信ないです(笑)

php

1<?php 2$result = []; 3$filter_option_symbol = [ 4 'options' => [ 5 'default' => '', 6 'regexp' => '/\A[+-×÷]\z/u', 7 ], 8]; 9$left = preg_replace( '/\A[+-]\z/u', '', filter_input( INPUT_POST, 'left', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ) ); 10$right = preg_replace( '/\A[+-]\z/u', '', filter_input( INPUT_POST, 'right', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ) ); 11$symbol = filter_input( INPUT_POST, 'symbol', FILTER_VALIDATE_REGEXP, $filter_option_symbol ); 12 13if ( '' === $left || '' === $right ) { 14 $result[] = '数値'; 15} else { 16 $left = (int) $left; 17 $right = (int) $right; 18} 19 20if ( '' === $symbol ) { 21 $result[] = '記号'; 22} 23 24if ( ! empty( $result ) ) { 25 $result = implode( 'と', $result ) . 'を入力してください。'; 26} else { 27 switch ( $symbol ) { 28 case '+': 29 $result = $left + $right; 30 break; 31 case '-': 32 $result = $left - $right; 33 break; 34 case '×': 35 $result = $left * $right; 36 break; 37 case '÷': 38 if ( 0 === $right ) { 39 $result = 'ゼロ除算はできません。'; 40 } else { 41 $result = $left / $right; 42 } 43 break; 44 } 45} 46 47echo htmlspecialchars( $result, ENT_QUOTES, 'UTF-8' );

投稿2016/09/27 14:05

編集2016/09/27 14:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

記号のみ選択した場合や記号と数字を片方だけ入力した場合、エラーメッセージが表示されません

とのことですので、最初のif文分岐が正しく行われていないことがわかります。
(本来ならelseに入ってほしい)

PHP

1<?php 2//ここのif文の判定がうまくいっていないと思われる 3if(isset($_POST['left']) and isset($_POST['right'])){ 4 echo htmlspecialchars($_POST['left'], ENT_QUOTES, 'UTF-8'); 5 6//--省略-- 7 8}else{ 9 $answer='error'; 10 echo '<p>エラー</p>'; 11 echo '値を入力してください'; 12 echo '<br>'; 13} 14?> 15

つまり、未入力の場合にissetで判定できていないということになります。

PHP

1<?php 2//修正個所 3if($_POST['left'] === '' and $_POST['right'] === ''){ 4 echo htmlspecialchars($_POST['left'], ENT_QUOTES, 'UTF-8'); 5 6//--省略-- 7 8}else{ 9 $answer='error'; 10 echo '<p>エラー</p>'; 11 echo '値を入力してください'; 12 echo '<br>'; 13} 14?> 15

例えば上記のように修正してみてはどうでしょうか。
他にもあるかもしれませんが、とりあえず参考になれば幸いです。

投稿2016/09/27 11:17

SASAHARA

総合スコア247

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問