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

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

ただいまの
回答率

88.34%

php7 エラーメッセージが表示されるので、何とかしたいです。

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 431

前提・実現したいこと

php7エラーが発生しました。調べても対処方法が得られません。教えてもらえないでしょうか?

発生している問題・

エラーメッセージ Notice: A non well formed numeric value encountered in (プログラムアドレス)

該当のソースコード

ソースコード


<HTML>
<form method="post">
質問1 <br>
<input type="radio" name="Q1" value=1000;>①yes<br>
<input type="radio" name="Q1" value=2000;>②no<br>
質問2 <br>
<input type="radio" name="Q2" value=100;>①yes<br>
<input type="radio" name="Q2" value=200;>②no<br>
<br>
<input type="submit">
</form>
PHP
<?php
$qtq = 10;
$value1 = 0;
$value2 = 0;
if(isset($_POST['Q1'])){
echo $_POST['Q1'];
$value1=$_POST['Q1'];
}
if(isset($_POST['Q2'])){
echo $_POST['Q2'];
$value2=$_POST['Q2'];
}

$qtq=$value1+$value2;
echo $qtq;
?>

試したこと

「Notice: A non well formed numeric value encountered in」で、検索 
ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

$value1=$_POST['Q1']; 変数のタイプが違っているのでエラーまでは、突き止めました。
問題は、変数のタイプを合わせる事が出来るのか?
または、$_POST['Q1']中身から、変数が取り出されるのか?
あたまのなかがごっちゃになっているので、説明が分からなくなりまっした。ごめんなさい。
要は、どのようにして$value1に代数を入力できますか?

ちなみに、エラーメッセージの下に計算された答えは表示されているみたい出す。
ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2020/01/08 09:16

    マークダウンのcodeが正しく使えていないので質問編集して調整してください。

    キャンセル

  • m.ts10806

    2020/01/08 09:17

    あと、調べるだけでは不十分で、ご自身でもいろいろ試す必要はあります。

    キャンセル

回答 3

checkベストアンサー

+3

<html>
<head>
  <meta charset="UTF-8" />
</head>
<body>
  <form method="POST">
    <p>質問1 <br />
    <input type="radio" name="Q1" value="1000" />①yes<br />
    <input type="radio" name="Q1" value="2000" />②no<br />
    </p>
    <p>質問2 <br />
    <input type="radio" name="Q2" value="100" />①yes<br />
    <input type="radio" name="Q2" value="200" />②no<br />
    </p>
    <p><input type="submit" /></p>
  </form>
</body>
</html>
<?php

function h($s) {
  return htmlspecialchars($s, ENT_QUOTES, "UTF-8");
}

$qtq = 10;
$value1 = 0;
$value2 = 0;

if (isset($_POST['Q1'])) {
  $value1 = $_POST['Q1'];
  echo h($value1);
}
else {
  echo '質問1を選択してください。';
}

if (isset($_POST['Q2'])) {
  $value2 = $_POST['Q2'];
  echo h($value2);
}
else {
  echo '質問2を選択してください。';
}

if (is_numeric($value1) && is_numeric($value2)) {
  $qtq = intval($value1) + intval($value2);
  echo h($qtq);
} else {
  echo '...';
}


$_POST[~]で受信したものはすべて文字列として扱われます。
文字列と文字列を「+」演算子にて処理する際、
数値でないものを処理すると、示されたようなエラーメッセージが表示されます。
そのため、intval()で加工したり、あるいは(int)$value1などと型キャストを明示します。

それと、今は想像がつかないかもしれないけど、$_POST[~]で受信したデータは、
細工すればHTMLフォームに書いていないデータを送り込むことも容易にできるため、
悪意を持ってhtmlやjavascriptを含むものを送り込まれたら、
そのままwebブラウザに出力してしまうecho $_POST['Q1']というのはやってはいけないです。
それを回避するために、htmlspecialchars()があります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

<form method="post">
質問1 <br>
<input type="radio" name="Q1" value=1000>①yes<br>
<input type="radio" name="Q1" value=2000>②no<br>
質問2 <br>
<input type="radio" name="Q2" value=100>①yes<br>
<input type="radio" name="Q2" value=200>②no<br>
<br>
<input type="submit">
</form>

少なくとも、;は整数ではないので削除する必要があります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/08 09:18

    そこだけクォートで囲まれてないのは不自然ですね。
    送信されるのはどうあがいても文字列なのに。

    キャンセル

  • 2020/01/08 14:30

    HTMLの記述ミスだけで、PHPのエラーメッセージは出ないと思うんだが。
    (言いたいことは回答として投稿しました。)

    キャンセル

  • 2020/01/08 14:38

    「;」があるということに囚われていました。確かにそうでしたご指摘ありがとうございます。

    キャンセル

+2

回答はすでにされている通りですが、他に気になる点。

・入力された文字列をそのまま出力してはいけない
⇒ 「クロスサイトスクリプティング脆弱性(XSS脆弱性)」について学びましょう。
これは実用ではなく、練習問題としてページを作っただけだと思いますが、学習目的であればなおさら、最初からウェブページ作成の基本をきちんとやったほうがいいです。

・タグの属性値は引用符で囲んだ方が良い
⇒今回のように数字をそのまま書くようなケースは問題ないですが、これも基本をきちんとという意味で。

あと、なぜセミコロンを書いてしまったのかの原因を掘り下げておいた方が良いです。
間違いから学ばない人は成長しません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る