回答編集履歴

1

解答追記

2016/04/16 03:45

投稿

ItoTomonori
ItoTomonori

スコア1283

test CHANGED
@@ -21,3 +21,185 @@
21
21
  インデントのくずれているプログラムは、たとえ動作したとしても、信頼できません。
22
22
 
23
23
  プログラムを書く人間同士での、最低限のルールです。
24
+
25
+
26
+
27
+ ---
28
+
29
+ 以下追記です。
30
+
31
+ まずは、元のソースを整形しました。
32
+
33
+ ```
34
+
35
+ <?php
36
+
37
+
38
+
39
+ try
40
+
41
+ {
42
+
43
+ //
44
+
45
+ require_once('./function.php');
46
+
47
+ require_once('./config.php');
48
+
49
+
50
+
51
+ //
52
+
53
+ $title = $_POST['title'];
54
+
55
+ $naiyou = $_POST['naiyou'];
56
+
57
+
58
+
59
+ //
60
+
61
+ $dbh = new PDO(DSN,DB_USER,DB_PASSWORD);
62
+
63
+ $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
64
+
65
+ $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
66
+
67
+
68
+
69
+ //
70
+
71
+ $sql = 'select mail from hon_table';
72
+
73
+
74
+
75
+ //
76
+
77
+ print 'メールマガジンの送信登録しました。<br><br>';
78
+
79
+ //
80
+
81
+ print'タイトル';
82
+
83
+ print'<br>';
84
+
85
+ //
86
+
87
+ print $title;
88
+
89
+ print'<br>';
90
+
91
+ print '~内容~<br><br>';
92
+
93
+ print nl2br(h($naiyou));
94
+
95
+
96
+
97
+ //
98
+
99
+ $count = 0;
100
+
101
+
102
+
103
+ foreach ($dbh->query($sql) as $row) {
104
+
105
+ //
106
+
107
+ $honbun = "$naiyou\n\n\n";
108
+
109
+ //
110
+
111
+ $title=$title;
112
+
113
+ $header = 'From:info@hogehoge.com';
114
+
115
+
116
+
117
+ //メールヘッダーインジェクション対策
118
+
119
+ $header = str_replace(array("\r\n", "\r", "\n"), "", $header);
120
+
121
+ $honbun = html_entity_decode($honbun, ENT_QUOTES, 'UTF-8');
122
+
123
+ //
124
+
125
+ mb_language('japanese');
126
+
127
+ mb_internal_encoding('UTF-8');
128
+
129
+ mb_send_mail($row['mail'], $title, $honbun, $header);
130
+
131
+
132
+
133
+ $count++;
134
+
135
+ if ($count > 50 && $count % 50 == 1) { // 51, 101, 151, ... の場合30秒停止
136
+
137
+ sleep(30);
138
+
139
+ }
140
+
141
+
142
+
143
+ $dbh = null;
144
+
145
+ }
146
+
147
+
148
+
149
+ }
150
+
151
+ catch (Exception $e)
152
+
153
+ {
154
+
155
+ print '取得に失敗しました。ただいま障害により大変ご迷惑をお掛けしております。';
156
+
157
+ exit();
158
+
159
+ }
160
+
161
+ ?>
162
+
163
+ ```
164
+
165
+ ---
166
+
167
+ そして、このソースへのコメントです。
168
+
169
+
170
+
171
+ 0. まずそもそもの質問の、「$count」の場所ですが、特に問題ないと思います。
172
+
173
+ もし、foreachのループ内においてしまったら、ループの度に、$count==0になってしまいますので、いつになって、Sleepは実行されません。
174
+
175
+ 0. foreachかwhileかという話ですが、どちらでも結構です。好きな方で。もちろん、明確に使い分けをする必要があるループを構成することもありますが、この処理ではどちらでもかまわないかと思います。
176
+
177
+
178
+
179
+ ---
180
+
181
+ なお、このソースの指摘で動作しないんだけど?と言われても困りますので(というか、申し訳ないですがたぶん動きません。)、以下に、このソースが動かない可能性を指摘します。
182
+
183
+
184
+
185
+ 0. require_onceで、2つのファイルを取り込んでいますが、内容がわからないため、影響などがわかりません。
186
+
187
+ 0. $title,$naiyouについて、POST以外でアクセスされた場合、$_POSTがnullになりエラーとなる可能性があります。
188
+
189
+ 0. PDOの操作をしておりますが、ターゲットのDBの種類や、そもそもスキーマがわかりませんので、動作するかどうかわかりません。
190
+
191
+ 0. printで、いろいろ出力されていますが、HTMLヘッダとかが存在しないのか、他で定義されているのか?わかりません。
192
+
193
+ 0. $title=$title;の行、この行の操作の意味がわかりません。
194
+
195
+ 0. mb_関連関数を利用されていますが、mb_stringがPHPに導入されているかどうかわかりません(大半の国内レンサバなら大丈夫ですが、自前環境などだと入っていないことも)。
196
+
197
+ 0. mb_sendmailを使っていますが、SMTP関連の設定状況がわかりませんので、無事に送信されるかどうかわかりません。
198
+
199
+ 0. sleep(30)となっているようで、30秒の待ちが50メール送信毎に発生するようですが、メールの数が多い場合には、クライアント側でタイムアウトしてしまう可能性があります。
200
+
201
+ 0. $dbh = null;としてしまっていますので、ループの2回目で、$dbhが無くなってしまい、エラーになりそうです。
202
+
203
+
204
+
205
+ 以上、がんばってください。