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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1772閲覧

PHPでのお問い合わせフォームについて

usuba

総合スコア11

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/03/01 20:50

WEBサイト制作初心者です。
htmlだけではメールフォームを作れないことを知り、昨日からPHPを学習しています。
WEB上でprogateのPHPを最低限やった程度です。

配列を使って、まとまったデータを自分のGmailで受信したいです。

以下のようなメールフォームを作りましたが、textareaしか受信されません。

**index.html **

   <form method="post" action="sent.php"> ご用件<span>※</span><br> <label><div class="purpose">           <input type="radio" name="contact" value="お申し込み" checked/>教室・講座のお申し込み</div>          </label> <label><div class="purpose">           <input type="radio" name="contact" value="体験のお申し込み" />体験のお申し込み</div>          </label> <label><div class="purpose">            <input type="radio" name="contact" value="お問い合わせ" checked/>お問い合わせ</div>          </label> 教室名<span>※</span><br>  <div class="classroom">            <input type="checkbox" name="cource" value="A" />A教室</div>  <div class="classroom">            <input type="checkbox" name="cource" value="B" />B教室</div>  <div class="classroom">            <input type="checkbox" name="cource" value="C" />C教室</div>  <div class="classroom">            <input type="checkbox" name="cource" value="D" />D教室</div> お名前<span>※</span><br>  <div class="form-item">            <input type="text" name="name"/></div> ふりがな<span>※</span><br>  <div class="form-item">            <input type="text" name="name"/></div> 性別<span>※</span><br>  <label><div class="form-item">            <input type="radio" name="gender" value="female" checked/>女性</div></label>  <label><div class="form-item">            <input type="radio" name="gender" value="male" />男性</div></label> 電話番号<span>※</span><br>  <div class="phone">            <input type="text" name="phone number"/></div> Eメール<span>※</span><br>  <div class="mail">            <input type="email" name="email" /></div> ご希望・ご質問など  <div class="form-item">   <textarea name="message" placeholder="確認のお電話のご希望時間がある場合はお知らせください。" rows="6">            </textarea></div> <ul class="actions"> <li><input type="submit" value="送信" /></li> </ul>    </form>

sent.php

<!DOCTYPE HTML> <html> <head> <title>WEBサイトタイトル</title> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <!--[if lte IE 8]><script src="assets/js/ie/html5shiv.js"></script><![endif]--> <link rel="stylesheet" href="assets/css/main.css" /> <!--[if lte IE 8]><link rel="stylesheet" href="assets/css/ie8.css" /><![endif]--> <!--[if lte IE 9]><link rel="stylesheet" href="assets/css/ie9.css" /><![endif]--> </head> <body> <?php $user = $_POST['user']; if (!mb_send_mail("自分の@gmail.com", $_POST["user"],)) { exit("error"); } print('ご用件 :'.$user['contact'].'<br>'); print('教室名 :'.$user['course'].'<br>'); print('お名前 :'.$user['name'].'<br>'); print('ふりがな :'.$user['callme'].'<br>'); print('性別 :'.$user['gender'].'<br>'); print('電話番号 :'.$user['phonenumber'].'<br>'); print('Eメール :'.$user['email'].'<br>'); if (isset($_POST["message"])) { $message = $_POST["message"]; if( get_magic_quotes_gpc() ) { $message = stripslashes("$message"); } $message = htmlspecialchars ($message); $message = mb_strimwidth ($message, 0, 200, "", "UTF-8"); $message = str_replace("¥r¥n", "¥r", $message); $message = str_replace("¥r", "¥n", $message); $message = str_replace("¥n", "<br>", $message); print $message; exit("error"); } ?> </body> </html>

やはりPHPの最初の部分の
$user = $_POST['user'];
がおかしいんでしょうか?

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

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

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

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

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

guest

回答2

0

お問い合わせフォームって、要素技術のそれぞれが結構難関なので、実働に耐えるレベルのものを作ろうとすると、初心者では厳しいです。

・フォーム投稿からのデータ受信
・入力値確認
・DB 登録
・メール送信

あたりの技術が必要になります。

で、それぞれが、セキュリティ機能を十分に実装していないと、他者に迷惑をかけるため、実装ハードルが上がります。

今回のケースは、そもそも変数の取扱と、関数の理解が足りていないので、開発環境を整えるところから始めたほうが良いです。

初学者に必要なのは
・そこそこ新しい実行環境
・入力補助/Syntax 確認程度ができるエディタ
・デバッグ環境
で、上記があると学習がはかどります。

上記の環境構築の記載がある学習書で、まず学んでみては?
基礎を押さえることが重要です。

html 側も少しおかしいところがあります。
デバッグする中で気が付くとおもいますが、フォーム投稿は、サーバサイドとの連携の基本なので、キチンと抑えたほうが良いです。

もし急ぎで、実装が必要なのであれば、google フォームを適切に使うことで、要件をある程度満たせると思います。

投稿2018/03/02 00:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

usuba

2018/03/02 00:41

そうですね……まさかフォーム作成がこんなに難しいとは思ってもみませんでした。 付け焼刃なのが丸見えでお恥ずかしいです… ちゃんと時間をかけてひとつずつ理解していけば、楽しくなりそうですね。 自分のレベルでできることをやってみようと思います!
guest

0

ベストアンサー

$_POSTはform内にある情報を配列で受け取れるスーパーグローバル変数ですが、
form内にあるそれぞれの入力コントロールのnameがそのままキーとして設定されます。
valueがその値として設定されます。
form内のnameに存在しない情報はもちろん設定されません。

「user」というnameはありませんよね?
$_POSTをvar_dump()で出力して内容を確認してみてください。
そこから「message」と同様に$_POST[{任意のname}]の形で任意の情報を取り出すこととなります。

mb_send_mailを書かれていますが、引数など色々と足りていないと思います(userが存在しないというのもありますが)
マニュアルと、参考になりそうな記事です。読んでやってみてください。

余談:
改行コードから改行タグの変換はnl2br()というのがあります。

投稿2018/03/01 21:44

編集2018/03/01 21:53
m.ts10806

総合スコア80765

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

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

m.ts10806

2018/03/01 21:46

回答とは違うのでこちらに書きますが、 まだmail送信部分は書いてないですよね?
usuba

2018/03/01 23:38

回答ありがとうございます! mail()のルールが少しわかったようなわかってないような…… 試しに、配列でくくるのをやめて、nameをそれぞれ作り直してみています。 送信部分は
usuba

2018/03/01 23:40

mail送信部分はEnd Of Messageというものを使ってみようかと思っています。
usuba

2018/03/01 23:47

>$_POSTはform内にある情報を配列で受け取れるスーパーグローバル変数 ということは、name を指定するとデータがまとめて受け取れる、ということなのでしょうか?
m.ts10806

2018/03/02 00:08

例えば同名にすると最下部の1つだけが送信されます。 1つ1つ取り出してやる必要があります。 例: $contact = $_POST["contact"]; $message = $_POST["message"]; $name = $_POST["name"]; そもそも$_POST自体が配列なので、「まとめて送信される」と言った方が正しいですね。 ただ、既に書いたように同名ではなくそれぞれきちんと名前をつけて送信します。今のHTMLで問題はほぼないと思います。 「同名では(NULLでない)最後の1つが送信される」原則からチェックボックスは今のやり方では2つ以上チェックした場合に最下部しか送信できないので、nameの後ろに[]をつけて配列にしてやる必要があります。 <input type="checkbox" name="cource[]" value="A" /> <input type="checkbox" name="cource[]" value="B" /> <input type="checkbox" name="cource[]" value="C" /> phpでは echo $_POST["cource"][0] ; // A echo $_POST["cource"][1] ; // B echo $_POST["cource"][2] ; // C 1つずつ取り出すのが面倒であればforeachを使うと良いでしょう。 勘違いしていてはいけないので注意をしておきますと、 HTMLの状態がそのままメールとなって送信できるわけではありません。 メールを送る文章を考えて、そこに入力フォームから送られてきた値をセットしてメール文とする必要があります。(mb_send_mail()の第2引数がメールタイトル、第3引数がメール本文です) まずはメール文章を考え、どこに入力した情報の何が入る、というのを考えてから作ったほうが良いです。(あと配列や変数、入力フォームの送信POST,GETについてもう少し学んでからメール送信に入ることを強くすすめます。あと余裕があればセキュリティ対策)
m.ts10806

2018/03/02 00:15 編集

あれ?そういえば最初の質問で幾つか参考サイトのURLを貼りましたがあまりそれが参考にされてないような・・・ 基本はまず同じようにやってみて、できてから自身のやりたい方向にカスタマイズしていきましょう。いきなり応用はできませんし、自身がどこまで理解できていて、何が理解できていないのか不鮮明のままとなり、身につきません。
usuba

2018/03/02 00:22

わかりやすいです!ありがとうございます……!! ひとつずつ取り出して、$contact = $_POST['contact']; $course = $_POST['course']; $name = $_POST['name']; $callme = $_POST['callme']; $gender = $_POST['gender']; $phonenumber = $_POST['phonenumber']; $email = $_POST['email']; $message = $_POST['message']; としてみました。頭の中でなにかがやっと合致しました……。
m.ts10806

2018/03/02 00:27

そうですね。あとはどのようにメールタイトル・メール本文を作っていくか考えて、mb_send_mail()関数の引数にそれぞれ当てはめるだけです。 ※注意点としては、実際のメール送信はきちんと設定されたWebサーバを通す必要があります。ローカル環境では設定をしないとメールは送られませんのでご注意を。  もしローカルPCで作られているのなら「PHP ローカルPC メール送信」などで検索してでてきた記事を参考にやってみてください。
m.ts10806

2018/03/02 00:32

te2jiさんも書かれていますが、「やりたい」が先行して基本を疎かにしていると必ず近いうちに手詰まりになります。 まずは基礎をきっちり押さえてください。progate使ったことがないので分かりませんが、「最低限やった程度」では本来、作ろうとしているPHPメールフォームはまだまだ手をつける段階ではない、というのが実際のところではないでしょうか。
usuba

2018/03/02 00:33

貼って頂いたURLも読ませていただいたのですが、作りたいお問い合わせフォームの形がすでに決まっていて、それをどう当てはめてよいのかわからなかったのです… ラジオボタンもチェックボックスもあったので、 >「同名では(NULLでない)最後の1つが送信される」原則からチェックボックスは今のやり方では2つ以上チェックした場合に最下部しか送信できないので、nameの後ろに[]をつけて配列にしてやる必要があります。 []をつけることで配列になるんですね…! 配列自体のしくみを勘違いしていたみたいです。。
m.ts10806

2018/03/02 00:42

チェックボックスを受け取ること自体は下記の記事ですかね。 https://qiita.com/4cres/items/26154314959dcccbfd34 まず「メールを送信する」ということだけにフォーカスをあてて、それが本当に実現できるかどうかを試す必要があります。 いきなり自分がやりたいことからやるのは基本を無視していることになります。 メール送信が確認できたら「入力した情報がきちんと受け取れるか」をひとつひとつ確かめます。text,radio,checkbox,select,textarea,hidden・・・色々あるのでそれぞれきちんと受け取る記述が書けるように。 その後にようやく自分が作りたい入力フォームに入れるようになります。 どのtypeがどのように送信されて、受け取れるかが分かっていればあとは装飾の問題です。装飾は一番最後です。 土台をかためるところから始めてください。理解が浅いままコピペコードを利用していても、やりたいことの近道にはならず、むしろ遠回りになります。
usuba

2018/03/02 00:59

>理解が浅いままコピペコードを利用していても、やりたいことの近道にはならず、むしろ遠回りになります。 その通りでした、そもそものHTML,CSS,PHPが身についてないままにとりあえずのアップロードしていたので、???でした。 自分のできる範囲で一つずつやってみたいと思います。 ちゃんと理解できて思い通りに操作できたら面白そうな世界です。 そして今回は、悔しいんですがどこかの業者に作成依頼しようかとも思います… 費用もまあそうですがそれより、自分の思ってたものを自分で作ってみたかったー…… 遠回りになりすぎました(;_;) とりあえずは自分でも、まずはおっしゃる通り、送信と受け取りを集中してやってみたいと思います。
usuba

2018/03/02 01:01

上記のURLの記事、とってもわかりやすいです。 ありがとうございました!
m.ts10806

2018/03/02 01:01

なるほど。実働にたえるレベルものが必要で、更に期限もありましたか。 Web制作初心者ということであれば簡単ではないかもしれませんね。 ある程度できているのにこれでお金を使うのは勿体無いような気がしますが、 事情があるのであれば仕方がないかもしれませんね。
usuba

2018/03/02 01:18

>実働にたえるレベルものが必要で、更に期限もありましたか。 あっ、そういうことなんです… なんでも見抜けてしまうのですね( ;∀;) 興味のある分野なので、以前からやってみたく、人からお声かけ頂いたというタイミングもあり、… どういうレベルのものかもわからず、こちらからいろいろ提案までしてしまいました( T-T) ある程度って今どのくらいできているのでしょう…!!希望を持ってしまいます! ゴールがみえてこない。。。ですがここまできたら不格好でもやってみたいと思います まあ、報酬があるわけでもないんですが。笑 単に自己満足です ただ、完成までにどのくらい時間がかかるか見当がつかないんです。 そしてどのくらい費用がかかっちゃうのかガクブルです( ;∀;) 自分の浅はかさを殴りたいです( ;∀;)
m.ts10806

2018/03/02 01:25

どれくらいできているか、あとどれくらいかかるか、というのを簡単に言ってしまうと余計な希望を持たせてしまうことになってしまうのでここでは割愛させてください。 あくまで「一応フォームから値を受け取るところを理解しつつある」という段階での「ある程度」です。 既に書いたようにもう少し基本から、もっといえば「HelloWorld」くらいから、変数や配列についてきちんと学んでいくべきところではあります。 私の回答もそうですが、te2jiさんがあげられている項目についてきちんと理解できて、プログラムに還元できるようになれば「まずは達成」と言えるのではないでしょうか。 デザイン的なところをどこまで見るかによりますが、メール送信であればありふれているのでそこまでかかるものではないと思います。(もちろん利用する業者によります) 仕組みだけでよければ無料配布しているようなPHPメールフォームやCMSを利用するのも手ですし、te2jiさんがあげられているgoogle フォームも1つの手です。
usuba

2018/03/02 02:24

mts10806様 このような素人感丸出しな私へ、とても丁寧にアドバイスしてくださりありがとうございます。 ものすごく初歩的なことばかりで、面倒な説明をたくさんしていただいたと思います…… 教えてくださったおかげで、このところ悶々としていたものが少し晴れました。 問題のお問い合わせフォームは、教えていただいたgoogleフォームでとっても簡単にできました( ;∀;) なので、お願いされた方へはこちらをお渡しして、個別に自分でじっくりやってみます。手作りをhelloworldからやってみます。
m.ts10806

2018/03/02 02:27

誰もが始めは初心者です。 そしてだいたい同じところでつまずきます。 つまずいたところを共有して、またはフォローしあって、成長が見込めるのがteratailのようなQAサイトのいいところだと思います。
m.ts10806

2018/03/02 02:29 編集

Googleフォームで解決できたのであれば、 その名前を提示し・他にも具体的に必要な技術を提示してくださっているte2jiさんの方にベストアンサーをあげてほしいな、と個人的には思います。(選ぶのは質問者さんなので強制はできませんが)
usuba

2018/03/02 03:06

ベストアンサーをte2ji様にもmts10806様にもたくさん押したいのですが 一人しかできないので、すみません! というか、質問を別で立てればそれぞれに押せましたね… このサイトは私のようなものにとっては神のようです。本当に救われました(;_;) また進めてみて、どうしてもわからなくなったらまた質問させていただきます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問