teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

解答追記

2016/04/16 03:45

投稿

ItoTomonori
ItoTomonori

スコア1283

answer CHANGED
@@ -9,4 +9,95 @@
9
9
  あと、ついでに、苦言となってしまいますが、
10
10
  プログラムの、インデントをきちんと、守ってください。
11
11
  インデントのくずれているプログラムは、たとえ動作したとしても、信頼できません。
12
- プログラムを書く人間同士での、最低限のルールです。
12
+ プログラムを書く人間同士での、最低限のルールです。
13
+
14
+ ---
15
+ 以下追記です。
16
+ まずは、元のソースを整形しました。
17
+ ```
18
+ <?php
19
+
20
+ try
21
+ {
22
+ //
23
+ require_once('./function.php');
24
+ require_once('./config.php');
25
+
26
+ //
27
+ $title = $_POST['title'];
28
+ $naiyou = $_POST['naiyou'];
29
+
30
+ //
31
+ $dbh = new PDO(DSN,DB_USER,DB_PASSWORD);
32
+ $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
33
+ $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
34
+
35
+ //
36
+ $sql = 'select mail from hon_table';
37
+
38
+ //
39
+ print 'メールマガジンの送信登録しました。<br><br>';
40
+ //
41
+ print'タイトル';
42
+ print'<br>';
43
+ //
44
+ print $title;
45
+ print'<br>';
46
+ print '~内容~<br><br>';
47
+ print nl2br(h($naiyou));
48
+
49
+ //
50
+ $count = 0;
51
+
52
+ foreach ($dbh->query($sql) as $row) {
53
+ //
54
+ $honbun = "$naiyou\n\n\n";
55
+ //
56
+ $title=$title;
57
+ $header = 'From:info@hogehoge.com';
58
+
59
+ //メールヘッダーインジェクション対策
60
+ $header = str_replace(array("\r\n", "\r", "\n"), "", $header);
61
+ $honbun = html_entity_decode($honbun, ENT_QUOTES, 'UTF-8');
62
+ //
63
+ mb_language('japanese');
64
+ mb_internal_encoding('UTF-8');
65
+ mb_send_mail($row['mail'], $title, $honbun, $header);
66
+
67
+ $count++;
68
+ if ($count > 50 && $count % 50 == 1) { // 51, 101, 151, ... の場合30秒停止
69
+ sleep(30);
70
+ }
71
+
72
+ $dbh = null;
73
+ }
74
+
75
+ }
76
+ catch (Exception $e)
77
+ {
78
+ print '取得に失敗しました。ただいま障害により大変ご迷惑をお掛けしております。';
79
+ exit();
80
+ }
81
+ ?>
82
+ ```
83
+ ---
84
+ そして、このソースへのコメントです。
85
+
86
+ 0. まずそもそもの質問の、「$count」の場所ですが、特に問題ないと思います。
87
+ もし、foreachのループ内においてしまったら、ループの度に、$count==0になってしまいますので、いつになって、Sleepは実行されません。
88
+ 0. foreachかwhileかという話ですが、どちらでも結構です。好きな方で。もちろん、明確に使い分けをする必要があるループを構成することもありますが、この処理ではどちらでもかまわないかと思います。
89
+
90
+ ---
91
+ なお、このソースの指摘で動作しないんだけど?と言われても困りますので(というか、申し訳ないですがたぶん動きません。)、以下に、このソースが動かない可能性を指摘します。
92
+
93
+ 0. require_onceで、2つのファイルを取り込んでいますが、内容がわからないため、影響などがわかりません。
94
+ 0. $title,$naiyouについて、POST以外でアクセスされた場合、$_POSTがnullになりエラーとなる可能性があります。
95
+ 0. PDOの操作をしておりますが、ターゲットのDBの種類や、そもそもスキーマがわかりませんので、動作するかどうかわかりません。
96
+ 0. printで、いろいろ出力されていますが、HTMLヘッダとかが存在しないのか、他で定義されているのか?わかりません。
97
+ 0. $title=$title;の行、この行の操作の意味がわかりません。
98
+ 0. mb_関連関数を利用されていますが、mb_stringがPHPに導入されているかどうかわかりません(大半の国内レンサバなら大丈夫ですが、自前環境などだと入っていないことも)。
99
+ 0. mb_sendmailを使っていますが、SMTP関連の設定状況がわかりませんので、無事に送信されるかどうかわかりません。
100
+ 0. sleep(30)となっているようで、30秒の待ちが50メール送信毎に発生するようですが、メールの数が多い場合には、クライアント側でタイムアウトしてしまう可能性があります。
101
+ 0. $dbh = null;としてしまっていますので、ループの2回目で、$dbhが無くなってしまい、エラーになりそうです。
102
+
103
+ 以上、がんばってください。