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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

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

Q&A

1回答

607閲覧

PHP:WEBフォーム作成

xxx0_0xxx

総合スコア9

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

PHP

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

0グッド

0クリップ

投稿2021/05/19 13:03

try{ // 「最大積載量」:空チェック if(empty($box)){ $error=$error.'最大積載量を入力してください。<br>'; //整数・文字数チェック }elseif(!filter_input(INPUT_GET, $maxcapa> 20 || !ctype_digit($maxcapa)){ }elseif($box = filter_input(INPUT_GET, 'get-maxcapa', FILTER_VALIDATE_INT, ["options" => ["min_range" =>1, "max_range" => 20]]) === false){ $error = $error.'最大積載量は整数「1~20」以内で入力してください。<br>'; } // 「荷物名」:空チェック if(empty($item_name)){ $error=$error.'荷物名を入力してください。<br>'; // 文字数チェック }elseif(mb_strlen($item_name) >= 11){ $error = $error.'荷物名は「11文字」以内で入力してください。<br>'; } // 「積載量」:空チェック if(empty($item_weight)){ $error = $error.'積載量を入力してください。<br>'; // 整数・文字数チェック }elseif($item_weight = filter_input(INPUT_GET, 'get-item_weight', FILTER_VALIDATE_INT, ["options" => ["min_range" =>1, "max_range" => 20]]) === false){ $error = $error.'積載量は整数「1~20」以内で入力してください。<br>'; } // 「走行距離」:空チェック if(empty($mil)){ $error = $error.'走行距離を入力してください。<br>'; // 数値チェック }elseif($mil = filter_input(INPUT_GET, 'get-mil', FILTER_VALIDATE_FLOAT) === false){ $error = $error."走行距離を数値で入力してください。<br>"; } if($error <> ""){ throw new Exception($error); }else{ $r_truck = new Truck($box); echo "<br>".'「荷物を乗せる」'."<br>"; $r_truck->load($item_name , $item_weight); echo "<br>".'「走る」'."<br>"; $r_truck->drive($mil); echo "<br>".'「荷物を下す」'."<br>"; $r_truck->unload(); } }catch(Exception $errorm){ echo $errorm -> getMessage(); }

ここに質問の内容を詳しく書いてください。
PHPで、webフォームのGET/POSTのボックスにそれぞれ値を入力し、送信ボタンを押して情報を取得する実装を行っています。
最大積載量・走行距離に数値を入力したのですが、下記表示になってしまいます。
デバックを確認したところ、エラーが違うところに飛んでいたため、
関数の指定が間違っていると考えられるのですが、原因を突き止められません。

表示された情報

最大積載量が数字以外で入力されています。// 最大積載量:数字で表示したい
「荷物を乗せる」
りんごを積んだ >
「走る」
数値以外が入力されました。 // 走行距離:数値で表示したい
「荷物を下す」
停車 > りんごを下ろした
車種[]
走行距離[]

こちらがそれぞれの引数を代入したコードです

$box = $_GET['get-maxcapa']??''; $item_name = $_GET['get-item']??''; $item_weight = $_GET['get-capa']??''; $mil = $_GET['get-mil']??''; echo "<br>".'「GETエラー」'."<br>"; // 値が入っているかを確認 var_dump($box); var_dump($item_name); var_dump($item_weight); var_dump($mil);

別ファイルにてクラス情報を記載しています。

<?php // 親クラス(車) class Car { protected $type; //車のタイプ(タクシー or トラック) protected $mileage; //走行距離(入力値(m) 表示値(km)) // コンストラクタ(走行距離=0) public function __construct($type,$mileage) { $this->mileage = 0; } // 走る(加算) public function drive($distance){ try { if(!is_numeric($distance)){ throw new Exception("数値以外が入力されました。"); } $this->mileage = $this->mileage + $distance; echo($this->mileage/1000 . "km" . " 走行中" . " > "); } catch (Exception $th) { echo $th->getMessage(); } } // 止まる public function stop(){ echo("停車" . " > "); } // 車両情報表示 public function getInfo(){ return $prof = [ "車種" => $this->type, "走行距離" => $this->mileage ]; } } // トラック class Truck extends Car { private $maxcapa; private $bagname; // コンストラクタ(車種=トラック、荷物=空、最大積載量=引数) public function __construct($box) { try { if(!is_int($box)){ throw new Exception("最大積載量が数字以外で入力されています。"); } $this->type = "トラック"; $this->bagname = "空"; $this->maxcapa = $box; } catch (Exception $th) { echo $th->getMessage(); } } // 荷物を積む(引数1=>荷物名、最大積載量を超えた場合は空に戻す。) public function load($item_name , $item_weight) { try { $this->bagname = $item_name; if($this->maxcapa >= $item_weight){ echo $this->bagname . "を積んだ > "; }else{ $this->bagname = "空"; throw new Exception("積載量を超過する荷物の為、積載不可 > "); } } catch (Exception $th) { echo $th->getMessage(); } } // 荷物を下ろす(荷物名を表示、荷物名=空、車両情報を表示) public function unload() { $this->stop(); if($this->bagname == "空"){ echo "下ろす荷物がない<br>"; }else{ echo $this->bagname . "を下ろした<br>"; } $this->bagname = "空"; $ary = $this->getInfo(); foreach($ary as $key => $value){ echo $key . "[" . $value . "] <br>"; } } } function runTruck($maxcapa,$capa,$item,$mil){ $r_truck = new Truck($maxcapa); $r_truck->load($item,$capa); $r_truck->drive($mil); $r_truck->unload(); } ?>

補足情報

VScode使用
大変長々と申し訳ございません。
一人ではどうしても解決できず、こちらに投稿させていただきました。
初心者のため、コードの見づらさあると思いますが、どうかご教授ください。

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

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

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

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

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

m.ts10806

2021/05/19 14:31

細かいですが 「ご教授」→「ご教示」
AbeTakashi

2021/05/19 16:21

「表示された情報」というのが何を意味しているのか非常に分かりにくいです。キャプチャ画像を貼り付けたら質問を見た人もイメージがつかめるのではないでしょうか? m.ts10806さんの指摘と合わせて質問文を編集してみてください。
takasima20

2021/05/19 23:15

とりあえず、try catch の乱用は止めた方がいいんじゃないかなあ。
guest

回答1

0

最大積載量が数字以外で入力されています。// 最大積載量:数字で表示したい
数値以外が入力されました。 // 走行距離:数値で表示したい

どちらも、elseifの条件式に問題があると思います。

たとえば走行距離の場合、条件式は

php

1}elseif($mil = filter_input(INPUT_GET, 'get-mil', FILTER_VALIDATE_FLOAT) === false){

となってますね。

おそらく、このコードの意図は、「$milfilter_input()の結果を代入し、$milfalseを比較する」だと思いますが、実際は、代入よりも先に比較が行われます。

仮に、get-milパラメータに'3.8'のような文字列が指定されたとしましょう。

まず、filter_input(INPUT_GET, 'get-mil', FILTER_VALIDATE_FLOAT)は、3.8を返します。
次に、3.8 === falseの比較式が評価されますが、比較結果は「偽」ですね。
よって、$milには、falseが代入されます。
その結果、elseifの分岐には入りません。
分岐に入らないのは期待通りですが、$milfalseになってしまうのは誤算ですね。

その後、$r_truck->drive($mil)しますが、$milfalseなので「数値以外が入力されました。」が出力されます。

var_dump()はご存知のようなので、うまく行かないときは、片っ端からvar_dump()を仕込んでみることをオススメします。

投稿2021/05/19 23:15

gpsoft

総合スコア1323

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問