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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

4回答

987閲覧

PHPに複数のformのvalueをsubmitするときに生じる問題

WeilSpinor

総合スコア170

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

1グッド

2クリップ

投稿2019/03/26 13:22

PHPに複数のformのvalueをsubmitするときに生じる問題

htmlとphpで『PHPの型の相互変換学習プログラム』を作りました。
Noticeエラーが発生するという不完全部分があるので、質問させていただきます。

仕様、問題点、ソースコード

htmlのテキストボックスに入力した値を、
boolean、integer型、float型、string型に型変換を施すと何の値に変換されるか、
を確認する学習プログラムです。
(ファイル名は、それぞれtypeTrans.htmlとtypeTrans.phpです。)

今回はString型とinteger型のみで、
それぞれのテキストボックスとsubmitボタンを用意しました。

問題点は、

一方のフォームのsubmitボタンを押すと、
もう一方のフォームの情報が送られないため、
対応するスーパーグローバル変数がundefinedになり、
Noticeの発生を避けられないことです。
(line 21とline 39/ typeTrans.php)

エラー回避の良い方法、及び、もっと根本的によい設計はありますか?
ご回答宜しくお願いします。

html

1<!DOCTYPE html> 2<!--このファイルのファイル名は、typeTrans.htmlです--> 3<html lang="ja" dir="ltr"> 4 <head> 5 <meta charset="utf-8"> 6 <title>typeTrans</title> 7 </head> 8 <body> 9 <h1>型の相互変換 等の学習</h1> 10 <form class="" action="typeTrans.php" method="post"> 11 <h2>文字列の型変換</h2> 12 型を調べたい文字列を入力 13 <input type="text" name="inputStr" value=""> 14 <input type="submit" name="" value="送信"><br> 15 </form> 16 【注意】 17 <ul>・PHPプログラムに(POSTなどで)送られたフォームの入力情報は、全て文字列として(スーパーグローバル変数$_POST)渡される。 18 </ul> 19 <ul>・文字列のブール型への変換で、 20 <ul>nullとなるのは、空文字列と"0"のみ。</ul> 21 <ul>false(=0)となるのは、ない</ul> 22 <ul>それ以外は全部true(=1)。</ul> 23 </ul> 24 25 <ul> 26 ・文字列の整数型への変換で、 27 <ul>"1"or1からはじまる文字列は、1となる。</ul> 28 <ul>"任意の数字n"or任意の数字nから始まる文字列は、nとなる。</ul> 29 <ul>それ以外("0"や空""を含む)は全部0。</ul> 30 </ul> 31 <form class="" action="typeTrans.php" method="post"> 32 <h2>整数値の型変換</h2> 33 型を調べたい整数値を入力(絶対に整数値のみを入力!) 34 <input type="text" name="inputInt" value=""> 35 <input type="submit" name="" value="送信"><br> 36 </form> 37 </body> 38</html> 39

php

1<?php 2//このファイルのファイル名は、typeTrans.phpです 3echo "<h1>前提事項</h1>"; 4echo "フォームから受け取ったデータは、文字列型として$_POSTに格納される<br>"; 5 6 7echo "<h1>文字列について</h1>"; 8if(isset($_POST['inputStr'])){ 9 if($_POST['inputStr'] === ""){//未入力(入力が空文字列)の場合 10 $inputStr = $_POST['inputStr'];//to int 11 echo "未入力(入力が空文字列'')なので、$_POST['inputStr']のString型へのキャストは、".$inputStr."である。"; 12 }else{ 13 $inputStr = $_POST['inputStr'];//as it is 14 echo "$_POST['inputStr'] の中身「".$inputStr."」の型:".gettype($inputStr); 15 echo "<br><br>文字列「".$inputStr."」のbool型への変換:".(bool)$inputStr; 16 echo "<br>文字列「".$inputStr."」のint型への変換:".(int)$inputStr; 17 echo "<br>文字列「".$inputStr."」のfloat型への変換:".(float)$inputStr; 18 echo "<br>文字列「".$inputStr."」のstring型への変換:".(string)$inputStr; 19} 20}else{ 21 $inputStr = $_POST['inputStr'];//存在しないもの(undefined)を代入している 22 echo "別のsubmitボタンを押してしまったので、$_POST['inputStr'])がundefined。よって、$_POST['inputStr']のString型へのキャストは、".$inputStr."である。"; 23}; 24 25echo "<h1>整数値について</h1>"; 26if(isset($_POST['inputInt'])){ 27 if($_POST['inputInt'] === ""){//未入力(入力が空文字列)の場合 28 $inputInt = (int)$_POST['inputInt'];//to int 29 echo "未入力(入力が空文字列'')なので、$_POST['inputInt']のint型へのキャストは、".$inputInt."である。"; 30 }else{ 31 $inputInt = (int)$_POST['inputInt'];//to int 32 echo "$_POST['inputStr'] の中身「".$inputInt."」の型:".gettype($inputInt); 33 echo "<br><br>int値「".$inputInt."」のbool型への変換:".(bool)$inputInt; 34 echo "<br>int値「".$inputInt."」のint型への変換:".(int)$inputInt; 35 echo "<br>int値「".$inputInt."」のfloat型への変換:".(float)$inputInt; 36 echo "<br>int値「".$inputInt."」のstring型への変換:".(string)$inputInt; 37 }; 38}else{ 39 $inputInt = (int)$_POST['inputInt'];//存在しないもの(undefined)を代入している 40 echo "別のsubmitボタンを押してしまったので、$_POST['inputInt'])がundefined。よって、$_POST['inputInt']のint型へのキャストは、".$inputInt."になる。"; 41}; 42 43/*追加用のecho達*/ 44echo "<br>"; 45echo "<br><br>"; 46echo "<br>"; 47echo "<br>"; 48 49?> 50
DrqYuto👍を押しています

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

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

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

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

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

guest

回答4

0

設計

送られたフォームを識別して処理をかえるつもりがないなら一つのフォームでよいのでは?

投稿2019/03/26 21:37

papinianus

総合スコア12705

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

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

WeilSpinor

2019/03/26 22:29

でも、側に送信ボタンがないと分かりづらくないですか? 一個だと入力した後上とかしたにスクロールしないといけないですから…
papinianus

2019/03/27 01:44

それは、ボタンがフロートしてスクロールに追従すればよいだけでしょう? そこまでできないなら、1フォームに2つsubmitをおけばいいだけ。 質問者様は自分で作っているからそういうことをしないのでしょうが、この2つあるinputに「あ」「1」と入れて、「文字列」のそばのボタンを押したときに、別のボタンを押したとか、undefinedだとか、キャストして0になったとかっていう表示が出てくるのは、内部構造を知りたくもないユーザに分かりづらくないですか? 入れてないとしても、入れなかった値について云々されるなんて、余計なおせわでしかないです。 どちらにしても、スクロールするのとかわらない程度にユーザ体験は悪いと思います。
papinianus

2019/03/27 01:45

参考程度ですが、2つsubmitを置いても、単にnameをかえるだけで、どちらのsubmitを押されたか識別できるので、提示の状況でformを分けることのメリットが全く理解できないです。
m.ts10806

2019/03/27 07:56

UIもUXも仕様も設計も破綻してるところを突っ込んで良いか小一時間悩む内容ですね(この質問者さんがそこを理解できるか、聞き入れるかも含めて) HTMLで出力する以上、Webブラウザでアクセスすること、使うのは一般のユーザーであることを忘れちゃいけないと思います。
WeilSpinor

2019/03/27 09:59

ご返信ありがとうございます。 >それは、ボタンがフロートしてスクロールに追従すればよいだけでしょう? それは良いアイデアですね。 >内部構造を知りたくもないユーザに分かりづらくないですか? そういった、フォームとPHPの通信の仕様などのことも含めて『学習者向け』という考えです。 そこは学習しなくて良い人にとっては、煩わしいかもしれませんね。 >1フォームに2つsubmitをおけばいいだけ。 それは私も思いました。 >2つsubmitを置いても、単にnameをかえるだけで、どちらのsubmitを押されたか識別できるので、提示の状況でformを分けることのメリットが全く理解できないです。 そうなんですね。是非試してみたいと思います。 あるhtmlのサイトでは、「違う内容を扱う際はフォームは分けるべき」と言っていたので、そのつもりで考えていたら、このような設計になりました。
papinianus

2019/03/30 18:32

> 「違う内容を扱う際はフォームは分けるべき」 に準拠しているとして、送信されたinputと送信されていないinputでほぼほぼ同じコード書いて、かつ一回のポストで両方動作したら、「違う内容」ではないです。 違う内容は、「数字」「文字」「日付」ではないですよ? teratailで言うなら、「回答」か「回答へのコメント」か「質問へのコメント」か(全部複数行文字列という同じ型のデータ)の区別が、「違う」ということの意味です
guest

0

PHP

1// $inputStr = $_POST['inputStr'];//存在しないもの(undefined)を代入している 2// ↓ 3 $inputStr = '';

PHP

1// $inputInt = (int)$_POST['inputInt'];//存在しないもの(undefined)を代入している 2// ↓ 3 $inputInt = 0;

投稿2019/03/26 14:20

kei344

総合スコア69364

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

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

0

isset()で存在チェックしている変数をelseで参照しようとすること自体おかしいです。

投稿2019/03/26 13:45

編集2019/03/27 01:33
m.ts10806

総合スコア80765

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

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

m.ts10806

2019/03/27 01:33

この回答への低評価はどういった理由からでしょうか。 コメント願います。
guest

0

自己解決

すぐには理解できませんが、

formについてのマニュアルを読み込む、
DOMの理解、
htmlの構造、

といったもっと基本的なところの理解を掘り下げようと思います。

ご回答ありがとうございました。

投稿2019/03/30 14:55

WeilSpinor

総合スコア170

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

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

m.ts10806

2019/03/30 21:47 編集

理解できてないのに解決済みにするから思い違いから意味不明の質問に至るんですよ。 手に追えないことに手を出さないように。手を出したなら責任もって完全解決させるように。 でないと、あなたに手をさしのべようと思う人はいなくなります。逆の立場になってみれば良いです。 あと、万が一同じ問題を抱えた人がいて、この質問を見たときこれが解決回答だったときの落胆は相当ですよね。 teratailの使い方から覚えてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問