- PR -

【PHP】Fatal error: Cannot redeclare

投稿者投稿内容
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2006-12-11 17:40
#連想配列の定義しかやっていないのに・・

4.4.1→4.4.2での修正箇所はこんな感じですけどねぇ・・
http://eth.jp/hiki.cgi?PHP-Changes-4.4.2

定義自体は16行目なんですよね。この定義時点でエラーになっているのですが、「前回の定義」は同じincファイルの18行目だった・・ということになってます(previously declared in /export/home/u/hoge-test.co.jp/public_html/agency/lib/config.inc:18)。このエラーメッセージ(incファイル名と行数)は間違いないですよね?(念のため確認)

(追記)
ひょっとして(ソースの改行位置が推測できないのですが)18行目は「"main" => "main_{{PAGE}}_01.tmpl",」でしょうか?そうすると「PAGE」というのが気になります。

#complexの二重括りは縁がないのでよくわからないですが(汗

[ メッセージ編集済み 編集者: shimix 編集日時 2006-12-11 18:01 ]
kumapoo
ベテラン
会議室デビュー日: 2003/11/21
投稿数: 59
お住まい・勤務地: 住まいも、勤務も東京の品川あたり
投稿日時: 2006-12-11 18:42
shimixさん、すいません。

コピペでソースを貼り付けたところ、@IT会議室の仕様なのか、下記「※」部分で改行されてしまいました。ですので、エラーの部分はやはり、「function configuration_data() {」になります。

1 <?php
2 /* *** Define *** */
3 define(PAR_DIR, ROT_DIR."/agency");
4 define(TMP_DIR, PAR_DIR."/template");
5 define(INC_DIR, PAR_DIR."/include");
6 define(AGC_NAM, preg_replace("/^.*\/([^\/]+)\/[^\/]*$/","$1",$_SERVER["REQUEST_URI"]));※
7 define(AGC_DIR, ROT_DIR."/".AGC_NAM);
8 define(CMN_CSV, PAR_DIR."/csv/default.csv");
9 define(AGC_CSV, AGC_DIR."/csv/config.csv");
10 define(IMG_DIR, "../agency/img");
11 define(BNR_DIR, "../agency/banner");
12 /* *** /Define *** */
13 ?>
14 <?php
15 /* *** Configuration *** */
16 function configuration_data() {
17 $template_list = array(
18 "header" => "header_01.tmpl",
19 "main" => "main_{{PAGE}}_01.tmpl",
20 "sub" => "sub_01.tmpl",
21 "footer" => "footer_01.tmpl",
22 "fork" => "fork_01.tmpl",
23 "redirect" => "redirect_01.tmpl",
24 );
25 return $template_list;
26 }
27 /* *** /Configuration *** */
28 ?>
29 <?php
30 /* *** Include *** */
31 require_once PAR_DIR."/lib/class.inc";
32 /* *** /Include *** */
33 ?>

引用:

定義自体は16行目なんですよね。この定義時点でエラーになっているのですが、「前回の定義」は同じincファイルの18行目だった・・ということになってます(previously declared in /export/home/u/hoge-test.co.jp/public_html/agency/lib/config.inc:18)。このエラーメッセージ(incファイル名と行数)は間違いないですよね?(念のため確認)


はい、間違いないです。今ブラウザを叩いたら、同様のエラーが出ました。改行部分について、行番号をつけましたので、参考にして頂ければと。


[ メッセージ編集済み 編集者: kumapoo 編集日時 2006-12-11 19:01 ]

[ メッセージ編集済み 編集者: kumapoo 編集日時 2006-12-11 19:01 ]
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2006-12-11 19:05
引用:

kumapooさんの書き込み (2006-12-11 18:42) より:
コピペでソースを貼り付けたところ、@IT会議室の仕様なのか、下記「※」部分で改行されてしまいました。ですので、エラーの部分はやはり、「function configuration_data() {」になります。


あ、いや16行目は(その前の改行がなかっただろうことは推測できたので)functionだとは認識しています。問題は18行目「(previously declared in /export/home/u/hoge-test.co.jp/public_html/agency/lib/config.inc:18)」という部分です。
引用:

"header" => "header_01.tmpl",


この行が「以前の定義(宣言)」になっているので、アレ?と思ったのです。連想配列は重複しても問題ないハズなのですが、もし1行下の「PAGE」を使っているのが18行目なら何か潜んでいるのかなと。

#でもここは19行目なんですよね?

(追記)
あ、でもエラー行としてはどちらを表示するかなぁ・・。うーん、PAGEというのはどこかでdefineされてますかね。どういう内容でしょうか?

[ メッセージ編集済み 編集者: shimix 編集日時 2006-12-11 19:14 ]
kumapoo
ベテラン
会議室デビュー日: 2003/11/21
投稿数: 59
お住まい・勤務地: 住まいも、勤務も東京の品川あたり
投稿日時: 2006-12-11 19:20
shimixさん、たびたび回答ありがとうございます。
ちょっと、ソースを終えない自分が情けないです。

grepしてみました。

$ grep -R PAGE *
agency/lib/class.inc: $_file = preg_replace("/{{PAGE}}/",$this->page,$_file);
agency/lib/config.inc: "main" => "main_{{PAGE}}_01.tmpl",

$ grep -R define *
agency/lib/config.inc:define(PAR_DIR, ROT_DIR."/agency");
agency/lib/config.inc:define(TMP_DIR, PAR_DIR."/template");
agency/lib/config.inc:define(INC_DIR, PAR_DIR."/include");
agency/lib/config.inc:define(AGC_NAM, preg_replace("/^.*\/([^\/]+)\/[^\/]*$/","$1",$_SERVER["REQUEST_URI"]));
agency/lib/config.inc:define(AGC_DIR, ROT_DIR."/".AGC_NAM);
agency/lib/config.inc:define(CMN_CSV, PAR_DIR."/csv/default.csv");
agency/lib/config.inc:define(AGC_CSV, AGC_DIR."/csv/config.csv");
agency/lib/config.inc:define(IMG_DIR, "../agency/img");
agency/lib/config.inc:define(BNR_DIR, "../agency/banner");
agency/lib/fork.php:define(ROT_DIR, $_SERVER["DOCUMENT_ROOT"]);
agency/lib/lib.php:define(ROT_DIR, $_SERVER["DOCUMENT_ROOT"]);
common/js/default.js:CheckString.prototype.objundef = function(obj) { return (typeof(obj) == "undefined"); };
common/js/default.js:function isUndefined(obj) { return chkstr1.objundef(obj); }
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2006-12-11 19:34
引用:

kumapooさんの書き込み (2006-12-11 19:20) より:
$ grep -R PAGE *
agency/lib/class.inc: $_file = preg_replace("/{{PAGE}}/",$this->page,$_file);
agency/lib/config.inc: "main" => "main_{{PAGE}}_01.tmpl",


ひょっとしてclass.incでconfig.inc内の{{PAGE}}を$this->pageに置換しているんですかねぇ。そうなると
コード:
        "main"     => "main_$this->page_01.tmpl",


という定義を連想配列に入れようとしていると思うんですが、これって大丈夫なんだろうか(というかこれが4.4.2だとOKなんですかね・・)。ページごとのテンプレートをセットしたいようではあるんですが、
コード:
function configuration_data() { 
    $currentpage = {{PAGE}};  ← この行追加
    $template_list = array( 
        "header" => "header_01.tmpl", 
        "main" => "main_$currentpage_01.tmpl",   ← 書替え


とかだとマズイんでしょうか?

#ざくっと書いてるので未検証なのはあしからず・・

kumapoo
ベテラン
会議室デビュー日: 2003/11/21
投稿数: 59
お住まい・勤務地: 住まいも、勤務も東京の品川あたり
投稿日時: 2006-12-11 21:23
shimixさん

ずいぶんお付き合い頂き申し訳ありません。

やはり、4.4.1と4.4.2では出来ることが違うのでしょうか???
ちなみに、PHP/4.1.2でも動いているとの情報を得ました。

shimixさんのご指摘通り、ソースを修正して、ブラウザから実行してみました。
-----
Parse error: parse error, unexpected '{' in /export/home/u/mitsui-direct-B-g/public_html/agency/lib/config.inc on line 17
-----
代入の仕方が間違っているみたいです。

修正したソースを念のため貼り付けます。



1 <?php
2 /* *** Define *** */
3 define(PAR_DIR, ROT_DIR."/agency");
4 define(TMP_DIR, PAR_DIR."/template");
5 define(INC_DIR, PAR_DIR."/include");
6 define(AGC_NAM, preg_replace("/^.*\/([^\/]+)\/[^\/]*$/","$1",$_SERVER["REQUEST_URI"]));
7 define(AGC_DIR, ROT_DIR."/".AGC_NAM);
8 define(CMN_CSV, PAR_DIR."/csv/default.csv");
9 define(AGC_CSV, AGC_DIR."/csv/config.csv");
10 define(IMG_DIR, "../agency/img");
11 define(BNR_DIR, "../agency/banner");
12 /* *** /Define *** */
13 ?>
14 <?php
15 /* *** Configuration *** */
16 function configuration_data() {
17 $currentpage = {{PAGE}};
18 $template_list = array(
19 "header" => "header_01.tmpl",
20 "main" => "main_$currentpage_01.tmpl",
21 "sub" => "sub_01.tmpl",
22 "footer" => "footer_01.tmpl",
23 "fork" => "fork_01.tmpl",
24 "redirect" => "redirect_01.tmpl",
25 );
26 return $template_list;
27 }
28 /* *** /Configuration *** */
29 ?>
30 <?php
31 /* *** Include *** */
32 require_once PAR_DIR."/lib/class.inc";
33 /* *** /Include *** */
34 ?>
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2006-12-11 22:45
あ、すみません。class.incでの置換対象は"/{{PAGE}}/"ですね。そうなると{{PAGE}}というのが謎です。どういう値を期待しているのやら。

他に{{PAGE}}が出てくるソースはないですよね?うーん・・ひょっとして私の知らない設定があるのか(汗)。とりあえずphpinfo()の内容を動作している4.1.2/4.4.2のものと比較してみるのが早いかもしれません。configurationのあたりで動作している環境でenableになっているものが4.4.1環境で全部enableかどうかをチェックしてみてください。
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2006-12-12 16:54
もしかして

auto_append_file
auto_prepend_file

が有効になっていたりしないですよね?

スキルアップ/キャリアアップ(JOB@IT)