こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

お世話になります。
プログラミング初心者の者です。

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

投稿日時 - 2017-10-08 11:58:24

QNo.9383415

すぐに回答ほしいです

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

ちょっと考察してみました(汗

セッションIDの変更などはしていないので、一度だけsession_start()が通ればCookieのセットは無問題ですね(この点についてはc1.php~c6.phpのどれもダメなんですが)。

あるいはphpの設定でバッファリングが有効になっていて、全部の処理が終わるまで出力を停止している可能性もあります(でも他の環境だとアウトなので、修正しておくべき)。

いずれにしても「こちらでキチンと動作する状態」に修正したソースでは、c3.phpやc4.phpで入力した内容もセッション変数から取得出来ています。

投稿日時 - 2017-10-10 15:49:54

お礼

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

投稿日時 - 2017-10-10 20:10:34

ANo.6

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.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;

と書き替えて試しました。

投稿日時 - 2017-10-10 15:21:41

ANo.4

セッション変数の一部だけメール本文へのセットをスキップするようなことはしていません(汗

当初の質問では

>セッションに格納した内容をすべてメールの本文に出力させる

ということでしたので、それ以外はほとんど気にしていませんでした。メール送信もセッション関係以外は出来ていると思ってましたし、セッション変数への格納状態は最後のページで

echo "<pre>";
var_dump($_SESSION);
echo "</pre>";

で「チェック済みである」という前提で回答しました。

途中のデータが「セッション変数に格納されていない」のか「格納していない」のかはソースを追いかけてみないことには何とも言えません(もちろん99.99…%の確率で後者ですけど)。すべてのファイルをZIPで固めてどこかに置いてもらうと助かります。

#というかそろそろ「業者に頼め」ってレベルになってきてますけど(汗

投稿日時 - 2017-10-10 13:17:01

補足

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

投稿日時 - 2017-10-10 14:06:33

ANo.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引数をどうするかは環境次第なので、とりあえずは上記だけで試してどうなるかチェックしてください。

投稿日時 - 2017-10-09 19:35:24

補足

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

投稿日時 - 2017-10-10 12:12:45

ANo.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;
}

投稿日時 - 2017-10-09 10:15:26

補足

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

投稿日時 - 2017-10-09 12:02:46

ANo.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;
}

投稿日時 - 2017-10-08 17:51:13

あなたにオススメの質問