質問編集履歴

2

追記

2019/04/27 12:45

投稿

WeilSpinor
WeilSpinor

スコア170

test CHANGED
File without changes
test CHANGED
@@ -195,3 +195,21 @@
195
195
 
196
196
 
197
197
  謎です。
198
+
199
+
200
+
201
+ ###追記
202
+
203
+ 解答者様のご指摘により解決しました。
204
+
205
+ header関数実行後にすぐにプログラムの処理を終了してページをジャンプするには、終了したい地点にexit()の記述が必要だったようです。
206
+
207
+
208
+
209
+ 写経した書籍の公式サイト調べたら、正誤表があって、
210
+
211
+ 「exitが抜けていた」
212
+
213
+ とおっしゃっていました。
214
+
215
+ 環境によっては期待した挙動を示すこともあるようですが、私の環境の場合は駄目だったようです。

1

追記

2019/04/27 12:45

投稿

WeilSpinor
WeilSpinor

スコア170

test CHANGED
File without changes
test CHANGED
@@ -145,3 +145,53 @@
145
145
  <\body>
146
146
 
147
147
  ```
148
+
149
+
150
+
151
+ ###試したこと
152
+
153
+
154
+
155
+ このコードは、2013年に書かれたあるphpの本のコードをそのまま写経したものですが、
156
+
157
+ 「もしかして、この本が書かれた後にPHPやHTTPの仕様に変更があったのではないか?」
158
+
159
+ と思い、マニュアルを見てみました。
160
+
161
+
162
+
163
+ すると、2006年発表のPHP5.1.2の改訂内容に「header関数」がありました。内容は以下のとおりです:
164
+
165
+
166
+
167
+ header この関数は一度に複数のヘッダを送信できないようになりました。 これは、ヘッダインジェクション攻撃への対策です。
168
+
169
+
170
+
171
+ 仮にこれの意味するところが「一つのphpプログラム内で一つのheader関数しか使えない」という意味ならば、本に書かれたコードはそれに反していることになりますが、上記以上の詳細は書いておらず、こまりました 。
172
+
173
+ 今回起きた「期待と異なる挙動」と照らし合わせると、おそらく、正確には以下のような内容と思われます:
174
+
175
+
176
+
177
+ 「もし一つのphpプログラムに2つ以上のheader関数が書かれた場合、最後のheader関数のみが実行され、ほかのheader関数は無視される」
178
+
179
+
180
+
181
+
182
+
183
+ しかし、
184
+
185
+ ・実行後になんのnoticeもエラーメッセージを出さないのは不自然。
186
+
187
+ ・仕様書にちゃんとした断りが書いていない。
188
+
189
+ ・7年も前の仕様変更を見落として本を書くのはさすがに著者がうかつすぎる。
190
+
191
+
192
+
193
+ といった理由から、その線は薄いと思われます。
194
+
195
+
196
+
197
+ 謎です。