• ベストアンサー

セッションで保存した内容を全てメールで送る

お世話になります。 プログラミング初心者の者です。 webサイトで6ページに渡りフォームで解答してもらった内容を、自分のメールアドレスに送付したいと考えています。 色々調べてみたのですが、セッションに格納した内容をすべてメールの本文に出力させるにはどういったプログラミングを書くべきか分かりませんでした。 どのようにしてプログラムを組めば実現できるのか教えて頂きたいです。 不躾な質問だとは思いますが、時間がないため何卒よろしくお願い致します。

  • PHP
  • 回答数6
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.6

ちょっと考察してみました(汗 セッションIDの変更などはしていないので、一度だけsession_start()が通ればCookieのセットは無問題ですね(この点についてはc1.php~c6.phpのどれもダメなんですが)。 あるいはphpの設定でバッファリングが有効になっていて、全部の処理が終わるまで出力を停止している可能性もあります(でも他の環境だとアウトなので、修正しておくべき)。 いずれにしても「こちらでキチンと動作する状態」に修正したソースでは、c3.phpやc4.phpで入力した内容もセッション変数から取得出来ています。

maikosmos
質問者

お礼

shimix様 本当にありがとうございました。 教えて頂いたとおりに修正したら、改善されました。 また、前回の質問から何度もご迷惑をおかけして申し訳ありませんでした。 shimix様が根気強く教えてくださったおかげで、無事にWEBサイトを完成させることができました。 本当にありがとうございました。

その他の回答 (5)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.5

えっと・・・。これ動いてます?一部どころか全部のセッション変数が取得不可でもおかしくないのですが(汗 session_start() はスクリプトの先頭に書いてください。DOCTYPEだろうが何だろうが、ブラウザに1バイトでも返したらその時点でHTTPレスポンスヘッダ(Content-type: text/html)が返ることになっています。ヘッダに続いて何バイトかのデータが送信された状態では、session_startによるsetcookieヘッダが送信出来ません。 c2.php~c6.phpのスクリプトの先頭に <?php session_start() ?> を書いて(それ以降にあるsession_start()は削除して)動作確認した限りでは、問題ないように思えます。 メール送信の環境作るのが手間だったので、代わりに echo "mail send ok"; exit;  ↓ ↓ ↓ ↓ ↓ ↓ echo "mail send ok<hr>"; echo nl2br($mailbody); exit; と書き替えて試しました。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.4

セッション変数の一部だけメール本文へのセットをスキップするようなことはしていません(汗 当初の質問では >セッションに格納した内容をすべてメールの本文に出力させる ということでしたので、それ以外はほとんど気にしていませんでした。メール送信もセッション関係以外は出来ていると思ってましたし、セッション変数への格納状態は最後のページで echo "<pre>"; var_dump($_SESSION); echo "</pre>"; で「チェック済みである」という前提で回答しました。 途中のデータが「セッション変数に格納されていない」のか「格納していない」のかはソースを追いかけてみないことには何とも言えません(もちろん99.99…%の確率で後者ですけど)。すべてのファイルをZIPで固めてどこかに置いてもらうと助かります。 #というかそろそろ「業者に頼め」ってレベルになってきてますけど(汗

maikosmos
質問者

補足

そうですよね…すいません…。 業者に頼みたいところなのですが、その時間もないんです‥ ご厚意に甘えてしまっている形になって大変申し訳ないです… http://str-cosme.girly.jp/cos.zip zipファイルアップロードさせていただきました。 申し訳ないですが、何卒よろしくお願い致します。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.3

>送付するメールアドレスは、どこに書くと良いのでしょうか? 失礼。「メールを送る」こと自体は問題なく出来ていて(その上で)メール本文にセッション変数の内容を展開するだけだと思っていました。 mb_send_mail(http://php.net/manual/ja/function.mb-send-mail.php)が使えるならば <?php session_start(); mb_language('ja'); mb_internal_encoding('utf-8'); $mail_to = 'receiver@example.com'; $mailbody = "以下の内容が入力されました\r\n--------------------------------------------------\r\n"; $mailbody .= get_array($_SESSION); if (mb_send_mail($mail_to, 'メールのタイトル', $mailbody) === false) { die('send abort'); } echo "mail send ok"; exit; function get_array($array, $prefix = '') { $ret = ''; foreach ($array as $key=>$val) { if (is_array($val)) { $ret .= get_array($val, ($prefix === "") ? $key : $prefix . ":" . $key); } else { $ret .= sprintf("%s%s = %s\r\n", ($prefix === "") ? $prefix : $prefix . ":", $key, $val); } } return $ret; } mb_send_mailの第4引数、第5引数をどうするかは環境次第なので、とりあえずは上記だけで試してどうなるかチェックしてください。

maikosmos
質問者

補足

このコードでメールを送れるには送れるんですが、なぜか真ん中の数値だけがっぽり抜けていました… 私のWEBページは全部で6ページあるのですが、 ・1ページめ…年齢と肌質[全2問] ・2ページめ…化粧に対する頻度と態度[全16問] →3ページめ…架空の化粧品(ファンデーションについて回答)[全17問] →4ページめ…架空の化粧品(チークについて回答)[全17問] ・5ページめ…架空の化粧品(口紅について回答)[全17問] ・6ページめ…回答のお礼とメール送信のphp 以上の構成で、セッションへの格納はそれぞれの回答の次のページで行っています。「→」で示している3・4ページめの回答内容が全くメールに書かれていませんでした。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

ANo.1です。 表示方法を多少手直ししてみました(汗 session_start(); $mailbody = "セッションの内容\r\n"; $mailbody .= get_array($_SESSION); function get_array($array, $prefix = '') { $ret = ''; foreach ($array as $key=>$val) { if (is_array($val)) { $ret .= get_array($val, ($prefix === "") ? $key : $prefix . ":" . $key); } else { $ret .= sprintf("%s%s = %s\r\n", ($prefix === "") ? $prefix : $prefix . ":", $key, $val); } } return $ret; }

maikosmos
質問者

補足

二度目も拾っていただいてありがとうございます…! とてもとてもありがたいです…!!! 上記のコードについて質問です。 送付するメールアドレスは、どこに書くと良いのでしょうか?

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

セッション配列が一次元配列なら($_SESSION['key']しか使っていないなら)ごく単純に session_start(); $mailbody = "セッションの内容\r\n--------------------------------------------------\r\n"; foreach ($_SESSION as $key=>$val) { $mailbody .= $key . ":" . $val . "\r\n"; } とすればいいと思います。セッション変数が二次元配列以上になっているなら関数にして再帰呼び出しすることになるかと思います。 session_start(); $mailbody = "セッションの内容\r\n--------------------------------------------------\r\n"; $mailbody .= get_array($_SESSION); function get_array($array, $prefix = '') { $ret = ''; $prefix .= '*'; foreach ($array as $key=>$val) { if (is_array($val)) { $ret .= sprintf("%s %s:[array]\r\n", $prefix, $key); $ret .= get_array($val, $prefix); } else { $ret .= sprintf("%s %s:%s\r\n", $prefix, $key, $val); } } return $ret; }

関連するQ&A

  • WEBサイトの回答内容をメールで送信する

    私は現在、卒業論文でwebサイトを使った類似性の研究をしています。 そこで、4ページにわたるWEBページで、ラジオボタンやプルダウンメニュー、フォームを用いて回答してもらった内容を自分のメールアドレスに送信するという仕組みを作りたいのですが、HTMLやプログラミングの知識が全くないため、調べながら試してみてもうまくできませんでした。 そこで、どのように書いていけば思う通りにwebが動いてくれるのかを教えて頂きたいです。不躾な質問であるとは思うのですが、何卒宜しくお願い致します。

  • sessionとcookieの設定内容の区別

    セッションとクッキーの使い分け方法を教えていただけないでしょうか? 簡単に言えばセッションがサーバサイド、クッキーがクライアントサイド、 セッション内容はブラウザ切れば消える(残すことも出来る)、クッキーはブラウザに残る、 と言うことは分かっているのですが、実装の仕方が分かりません。 例えばログインフォームでは$_SESSION['name']、$_SESSION['password']を回す・・・というのは分かります。 認証が終われば$_SESSION['name']、$_SESSION['password']は破棄して$_SESSION['login']=TRUE等を使うのではないかと思っております。 (そうではなくて、認証後は全て$_COOKIEで処理するのでしょうか?) で、$_COOKIEにはsessionIDが入っていると。 しかしながら、ブラウザ切っても暫くしてまたサイトを訪れたときにログイン状態が続くようにするにはどのようにすればいいのでしょうか? $_COOKIEにその情報を格納するのだと思うのですが、例えば$_COOKIE内にユーザidやlogin=OKのような文字を入れているとブラウザから見えてしまいます。 勿論ハッシュ化をして簡単には把握できないでしょうが、ここにはどんな情報が格納されているのか見当も付きません。 具体的な$_SESSION、$_COOKIEに入れるものと、サイトでの各々の実装法を教えていただけないでしょうか?

    • ベストアンサー
    • PHP
  • JSP&サーブレットのセッション変数の定義について

    フォームから入力された件数をセッション変数に格納しておき、 この内容をタグファイルに引き渡す定義方法をお教え下さい。

  • セッションにpostで受け取ったデータを格納する

    お世話になります。 プログラミング初心者の者です。 初歩的な質問で非常に恥ずかしいのですが、幾ら調べてもPHPを用いてフォームで入力されたデータ(postで次のページに送信)を、セッションに追加するためのコードをどう書けば良いのかわかりませんでした…… どなたかお助けください…… よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPのセッションについて。

    <?php if(isset($_POST['cmdSubmit'])){ session_start(); $user = $_POST['user_name']; $_SESSION['user_name'] = $user;  header('Location:./test.php'); } ?> アンケートフォームの内容をセッションに入れて 別ページで <?echo $_SESSION['user_name'];?> という感じで出力させたいのですがうまく行きません。 セッションに登録されているかチェックするために 移動する前にecho $_SESSION['user_name']; で内容が表示されるかどうか確認したのですが そのときは問題なく内容が表示されるので、 headerで他のページに移動する前までは問題なさそうだと思います。 なにかアドバイスいただけたらとおもいます。 よろしくおねがいします。

    • ベストアンサー
    • PHP
  • PHPの入力フォームのセッションによる値の受け渡し

    PHPの入力フォームに関するフォームの 値の受け渡しについての質問です フォームのフィールドの値の名前はtitleです で$_POSTで値を受け取って$_SESSIONに値を 格納、変数で出力という感じにしたいと思い こう書きました <?php session_start(); $_POST['title']=$_SESSION['tit']; $_SESSION['tit']=$title; ?> <html> <head> <title>test</title> </head> <body> <?php echo $title; ?> </body> </html> こう書いたのですが、値が表示されません 画面が真っ白になってなにも見えないです なにがおかしいのか教えてください issetはあえて使わず書いたのですが それがいけなかったのでしょうか?

    • 締切済み
    • PHP
  • インラインフレーム内のセッション

    通常のHTMLファイルのインラインフレーム内に、別サーバーからPHPファイルを取得して表示しています。 そのPHP自体は簡単なアンケート(フォーム→入力内容確認→送信)なんですが、このフォーム→入力内容確認の遷移がうまくいきません。 セッションでフォーム内の値と送信ボタンの値(sub)を保持し、確認のファイルに if(@$_SESSION['sub']!=TRUE){ header("location:form.php"); exit(); }else{ (以下略) } と記述することで、もしURL直打ちの場合はフォームの入力画面に飛ばされるようにしてあるのですが、インラインフレームの中でフォームに入力して送信ボタンを押すと、強制的に同じ画面に戻ってしまうのです。 直接ブラウザで該当のPHPを見たときは、何の問題もなく動くので、プログラム自体にエラーがあるわけではないと思うのですが・・・。 どうも確認ファイルのif(@$_SESSION['sub']!=TRUE)で、セッションがうまく保持されていないためにheaderで飛ばされてしまっているらしいのですが、インラインフレーム内でセッションを利用するときはどうすればいいのでしょうか?

    • ベストアンサー
    • PHP
  • C# Session情報からのキャストについて。

    キャストについて質問させて下さい。 C# FormViewでWebフォームを開発しております。 フォームに「カテゴリ」というDropDownListの項目があります。 入力画面を開いた際に、以下のようにSession情報から「カテゴリ」をデフォルト選択状態にしたいです。 ------ protected void Page_PreRenderComplete(object sender, EventArgs e) {    if (Session["Session_Category"] != null)    {       int Session_Category = (int)Session["Session_Category"];       ((DropDownList)FormView1.FindControl("CategoryDropDownList")).SelectedIndex = Session_Category;    } } ------ しかし実行すると、 「int Session_Category = (int)Session["Session_Category"];」の部分で 「指定されたキャストは有効ではありません。」とエラーが出ます。 キャストという事で、大変初歩的なエラーかと恐縮ではありますが、 対処方法をアドバイス頂けないでしょうか? わたくは、SessionとはObject型と認識しておりますが、 どうやったらInt型に変換できるでしょうか? 混乱してきました。 ちなみに、 ・Session["Session_Category"]の値は、必ず1,2,3,4のいずれかの数値が格納されております。 ・「using System.Web.SessionState;」は挿入しております。

  • phpのセッションについて質問です

    現在、phpのセッションについて学習しています。 開発環境はxamppでMySQLデータベースにPDOで接続しています。 セッションについていくつか質問があります。 セッションを使った認証の流れですが、 ログインフォーム画面で、session_start()し、ログインの認証が成功したらsession_regenerate_idで新しいセッションを発行⇒ログインが必要な画面でセッションの有無を確認 という流れで良いのでしょうか? セッションハイジャック対策にsession_regenerate_idをするようですが、 これは全てのページで毎回行ったほうが良いのでしょうか? セッションIDの受け渡しはcookieに保存する方法とURLに含む方法があり、 セッションハイジャック対策について記述しているサイトではcookieが推奨されている雰囲気ですが、 PHPマニュアル(http://php.net/manual/ja/session.idpassing.php)では信頼性がないとあります。 どちらを使うのが良いのでしょうか? セッションの有無のチェックはsession_start()を記述するだけでサーバーが行ってくれるのでしょうか? $SESSIONにセッションIDを保存してissetで調べるといった記述が必要なのでしょうか? メールアドレスとパスワードでのログイン認証を実装したいのですが、 その場合、マイページでユーザー情報を表示したい際、ログイン時に入力したメールアドレスを$SESSION[email]に格納し、マイページのphpプログラムにて、$SESSION[email]に格納されたメールアドレスを検索条件にしてSELECTで他の情報を取得したら良いのでしょうか? メールアドレスを$SESSION変数で受け渡しするのはセキュリティ上危険でしょうか?(危険であれば内部管理用のユーザーIDを$SESSIONに格納してデータを取得しようと思います。) 基本的なセッションの知識がないため、質問の数が多くなってしまいましたが、 答えられる範囲で良いのでご回答頂けると有難いです。

    • ベストアンサー
    • PHP
  • PHPでSESSIONによる変数の引き継ぎ

    PHPで問い合わせフォームを作ろうと勉強し始め、とりあえず簡単なものをと思っているのですが、入力フォームを作り次にチェックフォームへ移動した段階で以下の記述を入れています。 <?php session_start(); $_SESSION['name'] = $_POST['name']; echo htmlspecialchars($_SESSION['name']); ?> そしてチェックフォームの次のページで内容をメールで送るつもりなのですが、 チェックフォームから次のメールを送るページに移動した段階で <?php session_start(); echo htmlspecialchars($_SESSION['name']); ?> と記述しても、作成しているMacbookair2014では表示されているのですが、 スマホやWindowsでは表示されません。 どの環境でもチェックフォームまでは表示されているので、最後の引き継ぎがきちんと出来ていないだけだと思うのですが、何が足りないのでしょうか? 分かりにくい文章で申し訳ありませんが、どなたかお分かりの方ご回答よろしくお願いします。 情報が足りなくて分からない場合はすぐに答えます。

    • 締切済み
    • PHP

専門家に質問してみよう