予約管理に関するDBテーブル(yoyaku)が(id person email time date)の5つのフィールドで構成されているとします。
ある日付(date)に予約してある人(person)に予約時間(time)をメール(email)で送信するプログラムを書こうとしています。
以下のようなプログラムでメール送信はできるのですが、これだと同じ人が複数の時間に予約しある場合、その数だけメールが届いてしまいます。
1人で同じ日に複数の時間に予約してある場合は全ての時間をまとめてメールで送信したいのです。
どうしたらいいのでしょう。何かアドバイスお願いします。
$sql = "SELECT * FROM yoyaku WHERE date = 'ある日付'";
$rst = mysql_query($sql, $con);
while($col = mysql_fetch_array($rst)){
メール送信プログラム
}
同じ人の場合、配列にデータをためておき、まとめて送信すればいいのではないでしょうか?
$sql = "SELECT * FROM yoyaku WHERE date = 'ある日付' order by person,time";
$rst = mysql_query($sql, $con);
$person = "";
// 配列の初期化
$list = array();
while($col = mysql_fetch_array($rst)){
if ( $person = $col["person"] ) {
// 同じ人なら配列に保存
$list[] = $col;
} else {
// 違う人なら $list の内容を※メール送信プログラム
// 配列の初期化
$list = array();
// 配列に保存
$list[] = $col;
$person = $col["person"]
}
}
// 最後の人用の※メール送信プログラム
※メール送信プログラムでは、
if ( count($list) > 0 ) {
// メール送信
}
全ての時間をまとめてメールで送信したい
「まとめて1通で」でしょうか?
SELECT文に「ORDER BY person」を追加。
SELECT * FROM yoyaku WHERE date = 'ある日付' ORDER BY person
mysql_fetch_arrayで得られるpersonの値を変数で保存しておき、personの値が変わったときに直前のpersonへのメール送信を行うようにすればいいのではないでしょうか?
ご回答ありがとうございます。
やっぱりPHPで解決するしかないみたいですね。
質問の仕方が悪かったのかもしれませんが、
SQLでGROUP BY PERSONなどとしてあるフィールドの値を
配列でそのまま受け取れる方法なんかはないんだろうかと考えていました。
教えていただた方法でとりあえず進めます。
同じ人の場合、配列にデータをためておき、まとめて送信すればいいのではないでしょうか?
$sql = "SELECT * FROM yoyaku WHERE date = 'ある日付' order by person,time";
$rst = mysql_query($sql, $con);
$person = "";
// 配列の初期化
$list = array();
while($col = mysql_fetch_array($rst)){
if ( $person = $col["person"] ) {
// 同じ人なら配列に保存
$list[] = $col;
} else {
// 違う人なら $list の内容を※メール送信プログラム
// 配列の初期化
$list = array();
// 配列に保存
$list[] = $col;
$person = $col["person"]
}
}
// 最後の人用の※メール送信プログラム
※メール送信プログラムでは、
if ( count($list) > 0 ) {
// メール送信
}
ありがとうございます。
わかりやすくコードまで書いて頂き感謝いたします。
SQLでGROUP BYなどとしてあるフィールドだけ配列で返すような
やりかたはやっぱりないんでしょうかね。
(mysql_fetch_arrayの場合は結果的に2次元配列になるような…)
とりあえず教えて頂いた方法で進めてみます。
テーブルの項目名として予約後に引っ掛かりそうな time などは使用しない方がよさそうに思いますが、
それはさておき下記のように処理してはどうでしょうか。
メール送信を id 単位で送るようにいったん変数に格納し、id が変化したタイミングで送るようにしています。
クエリの数が増えますが、id でループを回し、その中で id 単位でクエリをかけても実現できるかと思います。
<?php function メール送信プログラム( $person, $email, $timeArray ) { $body = "本日の予約時間は次の通りです。\n"; for ( $ i = 0; $i < count( $timeArray ); $i++ ) { $body .= $timeArray[$i]."\n"; } // 送信処理・・・ } // クエリ結果を id, time ORDER で取得 $sql = "SELECT * FROM yoyaku WHERE date = 'ある日付' ORDER BY id, time"; $rst = mysql_query($sql, $con); $id=""; $timeArray = Array(); while($col = mysql_fetch_array($rst)){ timeArray[] = $col['time']; if( $id != $col['id'] ) if( $id != "" ) { メール送信プログラム( $person, $email, $timeArray ); array_splice( $timeArray,0); } $id = $col['id']; $person = $col['person']; $email = $col['email']; } } if( count( $timeArray ) > 0 ) { メール送信プログラム( $person, $email, $timeArray ); } ?>
ご回答ありがとうございます。
例にだした項目名は簡易的に書かせて頂いたので、
本当のDBではプリフィックスなどがついています。
私の説明不足が原因なのですが、
idは予約にあたえられたものです。
でも基本的にtimeを配列に格納する方法で
なんとかなりそうです。
ありがとうございます。
わかりやすくコードまで書いて頂き感謝いたします。
SQLでGROUP BYなどとしてあるフィールドだけ配列で返すような
やりかたはやっぱりないんでしょうかね。
(mysql_fetch_arrayの場合は結果的に2次元配列になるような…)
とりあえず教えて頂いた方法で進めてみます。