人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQLおよびPHPに関する質問です。
予約管理に関する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)){
メール送信プログラム
}


●質問者: shinwa-tokyo
●カテゴリ:インターネット ウェブ制作
✍キーワード:DB PHP SELECT SQL Time
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● chuken_kenkou
●26ポイント

全ての時間をまとめてメールで送信したい

「まとめて1通で」でしょうか?

SELECT文に「ORDER BY person」を追加。

SELECT * FROM yoyaku WHERE date = 'ある日付'
 ORDER BY person

mysql_fetch_arrayで得られるpersonの値を変数で保存しておき、personの値が変わったときに直前のpersonへのメール送信を行うようにすればいいのではないでしょうか?

◎質問者からの返答

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

やっぱりPHPで解決するしかないみたいですね。

質問の仕方が悪かったのかもしれませんが、

SQLでGROUP BY PERSONなどとしてあるフィールドの値を

配列でそのまま受け取れる方法なんかはないんだろうかと考えていました。

教えていただた方法でとりあえず進めます。


2 ● ycyc
●28ポイント ベストアンサー

同じ人の場合、配列にデータをためておき、まとめて送信すればいいのではないでしょうか?

$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次元配列になるような…)

とりあえず教えて頂いた方法で進めてみます。


3 ● Mook
●26ポイント

テーブルの項目名として予約後に引っ掛かりそうな 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を配列に格納する方法で

なんとかなりそうです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ