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

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

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

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

Q&A

解決済

2回答

1210閲覧

PHPのformからうまく値を反映できません。

GeekTK

総合スコア14

PHP

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

0グッド

0クリップ

投稿2018/05/13 21:05

多分PHPのformからうまく値を反映できていないので、phpファイルの$denom = 2.0 * $this->a;の部分がdevision by zero というエラーが出ます。全然何をすれば良いか分からずもがいています。回答お願いします。

PHP

1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <title> Answer </title> 5 <meta charset="utf-8"/> 6 <style> 7 </style> 8 </head> 9 10<body> 11 12<?php 13class Equation{ 14 private $a; 15 private $b; 16 private $c; 17 18 public function __construct($a, $b, $c){ 19 $this->a = (int)$a; 20 $this->b = (int)$b; 21 $this->c = (int)$c; 22 } 23 24 public function determination(){ 25 $root_part = sqrt($this->b * $this->b - 4.0 * $this->a * $this->c); 26 if ($root_part>0){ 27 return 2; 28 }elseif($root_part==0){ 29 return 1; 30 }else{ 31 return 0; 32 } 33 } 34 35 public function posans(){ 36 $root_part = sqrt($this->b * $this->b - 4.0 * $this->a * $this->c); 37 $denom = 2.0 * $this->a; 38 $pos = (-$this->b + $root_part) / $denom; 39 return $pos; 40 } 41 public function negans(){ 42 $root_part = sqrt($this->b * $this->b - 4.0 * $this->a * $this->c); 43 $denom = 2.0 * $this->a; 44 $neg = (-$this->b - $root_part) / $denom; 45 return $neg; 46 } 47 } 48 49 50 51function Equation(){ 52 $a = $_GET["a"]; 53 $b = $_GET["b"]; 54 $c = $_GET["c"]; 55 56 $denom1 = 2.0 * $a; 57 if (($b * $b - 4.0 * $a * $c)>=0){ 58 $root_part1 = round(sqrt($b * $b) - 4.0 * $a * $c,2); 59 }else{ 60 $root_part1 = round(sqrt(abs($b * $b)) - 4.0 * $a * $c,2); 61 } 62 63 $fomula = new Equation(a, b, c); 64 $ans1 = $fomula->posans(); 65 $ans2 = $fomula->negans(); 66 67 if ($fomula->determination() === 2){ 68 printf($ans1 , $ans2); 69 }elseif($fomula->determination() === 1){ 70 printf($ans1); 71 }elseif($fomula->determination() === 0){ 72 printf(-$b / $denom1, "+", $root_part1 / $denom1, "i"); 73 printf(-$b / $denom1, "-", $root_part1 / $denom1, "i"); 74 printf("Imaginary parts are rounded off to two decial place"); 75 } 76} 77 78Equation(); 79 80?> 81</body> 82</html> 83

HTML

1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <title> Quadratic Equation Solver </title> 5 <meta charset="utf-8"/> 6 </head> 7<form action="quadratic.php" method="get"> 8 <body> 9 <h1> Quadratic Equation Solver </h1> 10 11 <p> 12 This program calculates quadratic equation. First I need some data. 13 </p> 14 15 <h2>Throw Parameters</h2> 16 17 <div class="in_block"> 18 19 <p> 20 Quadratic Equation<br /> 21 ax<sup>2</sup>+bx+c=0 22 </p> 23 24 25 <p><input type="text" name="a" /></p> 26 <p><input type="text" name="b" /></p> 27 <p><input type="text" name="c" /></p> 28 <p><input type="submit" value="calculates" /></p> 29 30</div> 31</form> 32 33 34 </body> 35</html> 36

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

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

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

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

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

m.ts10806

2018/05/13 21:57

Equation()の冒頭でvar_dump($_GET);した結果を教えてください。想定通りの情報がきていますか?また、Equationクラスをnewするときの引数が変数ではなく定数になっています。クラスと関数を別々に作った理由がよく分かりませんが、同名にするのはあまり良くありません。クラス内にまとめるか、別名にした方が良いでしょう。
guest

回答2

0

このコードの問題はそもそも変数をキャストして扱っていることにあります。
下記、コンストラクタ部分。

php

1 public function __construct($a, $b, $c){ 2 $this->a = (int)$a; 3 $this->b = (int)$b; 4 $this->c = (int)$c; 5 }

なぜキャストが問題かというと「どんな情報も数値として扱わせてしまう」からです。

例として、下記は全て出力結果は「0」となります。

php

1$a = "a"; 2echo (int)$a; 3$b = "あ"; 4echo (int)$b; 5$c = null; 6echo (int)$c; 7$d = array(); 8echo (int)$d;

※$d つまり配列の場合は何か値が設定されていれば「1」となります

luckerさんの回答と私のコメントでも指摘しているように、
引数で変数を渡していないことは問題として1つあるのですが、
本来は存在しないはずの定数a,b,cがそのまま素通りされているのは
キャストしているからというのもあります。

値が定義されていない変数の値はnullなので上記の検証コード上では「0」となります。
0のまま扱われるので今回の現象が起きています。

あと定数を定義せずに利用しているのでNoticeレベルのエラーが出ているはずです。
はじめの内(または開発途中段階)はエラー表示はOnにしておきましょう。

入力値が0だったり、数字以外の文字列が入ってきた場合も全て「0」として扱われます。

つまり、キャストして変換するのではなく、入力値によってその後の処理を行うかどうかの入力値検証をされた方が、コードとしては理想かなと思います。
今回の場合ですと、数値ではないもの・数値であっても0であれば入力エラーとする 形ですね。

ご検討ください。

投稿2018/05/14 00:24

編集2018/05/14 00:31
m.ts10806

総合スコア80854

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

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

0

ベストアンサー

かなかなー?

PHP

1      : 2 $fomula = new Equation($a, $b, $c); // ←ここ、$が抜けてる 3 $ans1 = $fomula->posans(); 4 $ans2 = $fomula->negans(); 5      : 6

投稿2018/05/13 22:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問