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

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

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

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

Q&A

解決済

4回答

700閲覧

四則演算機 バリデーションの行い方

nezumi824

総合スコア8

PHP

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

0グッド

2クリップ

投稿2019/08/05 08:25

編集2019/08/06 02:24

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
PHPでフォーム画面を使用した四則演算を行えるプログラムを組んでいますがここからうまくいきません。
問題としてはフォームに数字以外を打ち込んだ際にエラーになるのでその結果をエラーメッセージで表示したい。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

コード```ここに言語を入力 php
```ここに言語名を入力 <?php /*var_dump($_POST["n1"]); exit;*/ /*if(strlen($n1)){ echo "数値を入力してください"; }*/ /*if(isset($_POST["n1"] && $_POST["n2"])){ if(preg_match($_POST["n1"] && $_POST["n2"])){ echo "入力エラー"; }else { echo "入力エラー"; } }*/ if (isset($_POST["operator"])) { switch ($_POST["operator"]) { case "2": $answer = $_POST["n1"] - $_POST["n2"]; break; case "3": $answer = $_POST["n1"] * $_POST["n2"]; break; case "4": $answer = $_POST["n1"] / $_POST["n2"]; break; case "1": $answer = $_POST["n1"] + $_POST["n2"]; break; } } else{ $answer = "計算結果なし"; } ?> <!DOCTYPE html> <html> <head> <title>2</title> </head> <body> <form action="index2.php" method="POST"> <input type="text" name="n1" required > <select name="operator"> <option value="1">+</option> <option value="2">-</option> <option value="3">*</option> <option value="4">/</option> </select> <input type="text" name="n2" required/> <input type="submit" value="計算"> </form> <p><?php echo $answer; ?></p> </body> </html>

試したこと

ここに問題に対して試したことを記載してください。
if(isset($_POST["n1"]) && isset($_POST["n2"])){
if(!is_numeric($_POST["n1"]) || !is_numeric($_POST["n2"])){
echo "数値を入力してください";
}
}

/*if (!is_numeric($_POST["n1"]) || !is_numeric($_POST["n2"])){
echo "エラー"; }
*/

if(isset($_POST["operator"])){
if(is_numeric($_POST["n1"] )&& is_numeric($_POST["n2"])){
switch($_POST["operator"]){
case "1":
$answer=$_POST["n1"] + $_POST["n2"];
break;
case "2":
$answer=$_POST["n1"] - $_POST["n2"];
break;
case "3":
$answer=$_POST["n1"] * $_POST["n2"];
break;
case "4":
if($_POST["n1"] == 0 || $_POST["n2"] == 0){
echo "0での計算はできません。";
} else{
$answer=$_POST["n1"] / $_POST["n2"];
}
}
}
}
?>

<!DOCTYPE html> <html> <head> <title>2</title> </head> <body> <form action="index2.php" method="POST"> <input type="text" name="n1" required > <select name="operator"> <option value="1">+</option> <option value="2">-</option> <option value="3">*</option> <option value="4">/</option>
</select> <input type="text" name="n2" required/> <input type="submit" value="計算">
</form> <p>答え:<?php if(isset($answer)) echo $answer; ?></p> </body> </html> ### 補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2019/08/05 08:28

コードは「ソースコード」の中に入れてください。 「コードブロック」もしくは「マークダウンのcode機能」です。 平で提示されても質問者さんのコードそのままではありません。(行頭などが詰められるため)
nezumi824

2019/08/05 08:31

ご指摘ありがとうございます。 以後気をつけます!
m.ts10806

2019/08/05 08:34

```php //ここにコード ``` で良いですよ。 提示されたコード内に実際のコード以外が入っているとそれはノイズになりますので、 不要な情報は削ってください(質問テンプレート文言とか、項目はなるべく埋めてほしい)
m.ts10806

2019/08/05 08:58

タイトルは修正しておいたほうが良いと思います。 実現したいこと、困っていること、要件としては「バリデーション」が主なので。
m.ts10806

2019/08/06 02:26

コードは全てマークダウンのcode機能適用してくださいね。 自身で選択してコピーしなきゃならなくなると正しく再現できるコードになりません。 要は「回答者の環境で動作確認してもらうためにコードを提示する」ので。
guest

回答4

0

PHPでフォーム画面を使用した四則演算を行えるプログラムを組んでいますがここからうまくいきません。

どうしてもPHPで組まないといけない事情があるのでなければ、JavaScriptで組んだほうがいいかと思います。サーバへの送受信を介さずにリアルタイムで処理できます。

投稿2019/08/05 08:34

maisumakun

総合スコア145121

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

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

nezumi824

2019/08/05 08:51

今回はPHPのみで組みたいのです。
guest

0

数字以外を打ち込んだ際にエラーになるので

要は「バリデーションをしたい」ということでしょうか。
手段は沢山あります。

細々と気になるところ

コメントアウトされている状況から「何かしらやろうとしている」のは分かりますが、
PHPマニュアルをきちんと確認されたほうが良いと思います。

if(isset($_POST["n1"] && $_POST["n2"])){

isset()は変数が定義されているかどうかチェックする関数ではありますが、上記の書き方だと$_POST["n1"] && $_POST["n2"]の結果が定義されているかになりますし、そもそもisset()内に式は書けないので、エラーになります。

php

1var_dump(isset($a && $b)); 2//PHP Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead)

変数を1つ1つ与えましょう。

php

1var_dump(isset($a) && isset($b));

if(preg_match($_POST["n1"] && $_POST["n2"])){

preg_match()の第一引数はpatternです。要は「どういう条件で検索を行うか」ですね。
n1もn2も単に入力するだけの要素ですので、こちらも式を入れてはいけません。

if (isset($_POST["operator"])) {

switch ($_POST["operator"]) {

現在の作りだとoperatorはHTMLをブラウザの開発ツールで改ざんされない限りは必ず投入されて1,2,3,4のいずれかが必ず渡ってきます。

ということは「入力チェックの結果、NGであればこの処理を通さない」という対応が必要になります。

蛇足

<form action="index2.php" method="POST">

自身にフォーム送信するのであればactionの指定は不要だったりします。

蛇足2

過去質問検索してみましょう。

投稿2019/08/05 08:33

編集2019/08/05 08:53
m.ts10806

総合スコア80765

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

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

nezumi824

2019/08/05 08:53

バリデーションを行いたいのですがそのコードが書けず悩んでおります。 他の部分も直していきます。
m.ts10806

2019/08/05 08:54

PHPマニュアルにサンプルコードも載っていますし、 利用する機能が分かれば調べられる範囲も的確になります。
nezumi824

2019/08/05 09:15

サンプルをみて色々試したのですがエラーで止まってしまうのですがどのようにしたらいいでしょうか
m.ts10806

2019/08/06 00:49

試した結果とそのエラーを提示してください。
m.ts10806

2019/08/06 00:50

「試したこと」に書いているコードだけではエラーになりません。 またコードは全てマークダウンのcode機能適用してくださいね。 任意の場所に任意の数設置できるので。
m.ts10806

2019/08/06 00:51

何となく回答の下記を読んで対応してないからじゃないかと思ってますが。 >現在の作りだとoperatorはHTMLをブラウザの開発ツールで改ざんされない限りは必ず投入されて1,2,3,4のいずれかが必ず渡ってきます。 ということは「入力チェックの結果、NGであればこの処理を通さない」という対応が必要になります。
nezumi824

2019/08/06 02:25

投稿をよんで完成させました! 色々ご教授いただきありがとうございます!
m.ts10806

2019/08/06 02:31

今どうこう言っても理解にはつながらないので、 あえて書いてないですが、「採用が望ましい順番」に挙げています。 ・filter_input()でフィルタ(検証フィルタなど)つける ・ctype_digit() ・is_numeric() ・preg_match()で正規表現によるチェック
guest

0

自己解決

コード if(isset($_POST["n1"]) && isset($_POST["n2"])){ if(!is_numeric($_POST["n1"]) || !is_numeric($_POST["n2"])){ echo "数値を入力してください"; } } /*if (!is_numeric($_POST["n1"]) || !is_numeric($_POST["n2"])){ echo "エラー"; } */ if(isset($_POST["operator"])){ if(is_numeric($_POST["n1"] )&& is_numeric($_POST["n2"])){ switch($_POST["operator"]){ case "1": $answer=$_POST["n1"] + $_POST["n2"]; break; case "2": $answer=$_POST["n1"] - $_POST["n2"]; break; case "3": $answer=$_POST["n1"] * $_POST["n2"]; break; case "4": if($_POST["n1"] == 0 || $_POST["n2"] == 0){ echo "0での計算はできません。"; } else{ $answer=$_POST["n1"] / $_POST["n2"]; } } } } ?> <!DOCTYPE html> <html> <head> <title>2</title> </head> <body> <form action="index2.php" method="POST"> <input type="text" name="n1" required > <select name="operator"> <option value="1">+</option> <option value="2">-</option> <option value="3">*</option> <option value="4">/</option> </select> <input type="text" name="n2" required/> <input type="submit" value="計算"> </form> <p>答え:<?php if(isset($answer)) echo $answer; ?></p> </body> </html>

投稿2019/08/06 02:25

nezumi824

総合スコア8

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

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

yambejp

2019/08/06 02:27

$_POSTを直接参照するのはデメリットばかりなのでやめたほうがいいでしょう
m.ts10806

2019/08/06 02:37 編集

同レベルのif文を書くのはさすがに冗長です。 それに<body>外に文言が出力されているのもHTML構文としてはNGです。 エラー文言は変数におさめておいてそのエラーがなければ計算を行い、 あればbody内にエラー出力にしてください。 (あまり他の人に参考にしてほしくないコードになっているので低評価しています) あと細かいところを言うとこの展開で自己解決はあまりよろしくないかと。
guest

0

あまりおすすめはされていませんが、ユーザーからのデータのバリデートがきちんとされていれば
eval的な処理でもできます

PHP

1<?php 2$n1=filter_input(INPUT_POST,"n1",FILTER_VALIDATE_FLOAT); 3$n2=filter_input(INPUT_POST,"n2",FILTER_VALIDATE_FLOAT); 4$operator=filter_input(INPUT_POST,"operator",FILTER_VALIDATE_REGEXP,["options"=>["regexp"=>"@^[-+*/]$@"]]); 5 6if(in_array(null,[$n1,$n2,$operator],true) or 7 in_array(false,[$n1,$n2,$operator],true)){ 8 $answer = "計算結果なし"; 9}else{ 10 $answer ="$n1 $operator $n2 = "; 11 $answer.= eval("return $n1 $operator $n2;"); 12} 13?> 14<form method="POST"> 15<input type="text" name="n1"> 16<select name="operator"> 17<option value="+">+</option> 18<option value="-">-</option> 19<option value="*">*</option> 20<option value="/">/</option> 21</select> 22<input type="text" name="n2"> 23<input type="submit" value="計算"> 24</form> 25<p><?=$answer;?></p>

投稿2019/08/05 10:37

yambejp

総合スコア114583

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問