* PHP5.0.5でFatal error [#mb63d60d] - ページ: [[BugTrack2]] - 投稿者: [[kawa]] - 優先順位: 重要 - 状態: 提案 - カテゴリー: 本体バグ - 投稿日: 2005-09-08 (木) 17:22:43 - バージョン: 1.4.5_1 ** メッセージ [#lc1fa850] WindowsServer2003 & PHP 5.0.5 の環境で以下のエラーが出ます。5.0.4に戻すと正常動作します。 Fatal error: Only variables can be passed by reference in ~/rules.ini.php on line 26 -------- - こっちのが詳しく書いてくれてた[[org:質問箱3/183]] -- &new{2005-09-08 (木) 19:49:16}; - 質問箱の方には書き忘れましたが、OS は RHEL4 と RH9 で再現させました。 でも、PHP 5.0.5 のリリースノートにあるように、PHP の「正しい動作」の問題のようなので、OS によらないと思われます。 -- [[Kimi]] &new{2005-09-09 (金) 13:14:25}; - 4,5個のファイルを少し直すだけでした。array_pop(explode('/', $vars['page'])) みたいに、参照を引数に取る関数に関数の戻りを渡しているところで、関数の戻り値を一時変数に一度とっておき、それを引数として使うと正しく動作します。パッチを作ろうとしたらミスしました(x_x;) -- [[hiro@coop]] &new{2005-09-13 (火) 02:31:24}; - [[../82]]と同じですかね。 -- [[よっちい]] &new{2005-09-13 (火) 16:45:47}; - http://www.php.net/release_4_4_0.php によると "If references were used in a wrong way, PHP would often create memory corruptions which would not always surface or be visible." とあるのでエラーの発生に関らずリファレンス引数を取る部分に式を置くのはまずいようです((私かなりやってますが)) -- [[Cue]] &new{2005-09-13 (火) 22:44:05}; - 具体的にどうされたのか伺おうかと(オープンな場所で進めさせてもらおうと)思っていたのですが、どのへんをミスりましたか? -- [[henoheno]] &new{2005-09-13 (火) 23:38:38}; - PHP5.1.0RC1 で 1.4.6RC に対するパッチですが、こんな感じです: -- [[kawai]] &new{2005-09-28 (水) 18:47:46}; diff -ur pukiwiki-1.4.6_rc/lib/file.php pukiwiki-1.4.6_rc_mod/lib/file.php --- pukiwiki-1.4.6_rc/lib/file.php Wed Sep 28 18:42:04 2005 +++ pukiwiki-1.4.6_rc_mod/lib/file.php Wed Sep 28 18:42:15 2005 @@ -264,7 +264,8 @@ set_file_buffer($fp, 0); flock($fp, LOCK_EX); rewind($fp); - foreach (array_splice(array_keys($recent_pages), 0, $maxshow) as $page) { + $tmp=array_keys($recent_pages); + foreach (array_splice($tmp, 0, $maxshow) as $page) { $time = $recent_pages[$page]; $s_lastmod = htmlspecialchars(format_date($time)); $s_page = htmlspecialchars($page); diff -ur pukiwiki-1.4.6_rc/lib/html.php pukiwiki-1.4.6_rc_mod/lib/html.php --- pukiwiki-1.4.6_rc/lib/html.php Wed Sep 28 18:42:04 2005 +++ pukiwiki-1.4.6_rc_mod/lib/html.php Wed Sep 28 18:42:15 2005 @@ -119,9 +119,9 @@ if ($search_word_color && isset($vars['word'])) { $body = '<div class="small">' . $_msg_word . htmlspecialchars($vars['word']) . '</div>' . $hr . "\n" . $body; - $words = array_flip(array_splice( - preg_split('/\s+/', $vars['word'], -1, PREG_SPLIT_NO_EMPTY), - 0, 10)); + $tmp = preg_split('/\s+/', $vars['word'], -1, PREG_SPLIT_NO_EMPTY); + $tmp = array_splice($tmp, 0, 10); + $words = array_flip($tmp); $keys = array(); foreach ($words as $word=>$id) $keys[$word] = strlen($word); arsort($keys, SORT_NUMERIC); Only in pukiwiki-1.4.6_rc_mod: phpinfo.php diff -ur pukiwiki-1.4.6_rc/plugin/recent.inc.php pukiwiki-1.4.6_rc_mod/plugin/recent.inc.php --- pukiwiki-1.4.6_rc/plugin/recent.inc.php Wed Sep 28 18:42:05 2005 +++ pukiwiki-1.4.6_rc_mod/plugin/recent.inc.php Wed Sep 28 18:42:16 2005 @@ -39,7 +39,8 @@ // Get latest N changes if (file_exists(PLUGIN_RECENT_CACHE)) { - $lines = array_splice(file(PLUGIN_RECENT_CACHE), 0, $recent_lines); + $tmp=file(PLUGIN_RECENT_CACHE); + $lines = array_splice($tmp, 0, $recent_lines); } else { return '#recent(): Cache file of RecentChanges not found' . '<br />'; } diff -ur pukiwiki-1.4.6_rc/plugin/rss.inc.php pukiwiki-1.4.6_rc_mod/plugin/rss.inc.php --- pukiwiki-1.4.6_rc/plugin/rss.inc.php Wed Sep 28 18:42:05 2005 +++ pukiwiki-1.4.6_rc_mod/plugin/rss.inc.php Wed Sep 28 18:42:16 2005 @@ -35,7 +35,8 @@ // Creating <item> $items = $rdf_li = ''; - foreach (array_splice(file($recent), 0, $rss_max) as $line) { + $tmp=file($recent); + foreach (array_splice($tmp, 0, $rss_max) as $line) { list($time, $page) = explode("\t", rtrim($line)); $r_page = rawurlencode($page); $title = mb_convert_encoding($page, 'UTF-8', SOURCE_ENCODING); diff -ur pukiwiki-1.4.6_rc/rules.ini.php pukiwiki-1.4.6_rc_mod/rules.ini.php --- pukiwiki-1.4.6_rc/rules.ini.php Wed Sep 28 18:42:06 2005 +++ pukiwiki-1.4.6_rc_mod/rules.ini.php Wed Sep 28 18:42:18 2005 @@ -25,6 +25,7 @@ // 前後に必ず / を含めてください。行頭指定は ^ を頭に。 // 行末指定は $ を後ろに。 // +$page_tmp=explode('/',$vars['page']); $str_rules = array( 'now\?' => format_date(UTIME), 'date\?' => get_date($date_format), @@ -32,7 +33,7 @@ '&now;' => format_date(UTIME), '&date;' => get_date($date_format), '&time;' => get_date($time_format), - '&page;' => array_pop(explode('/', $vars['page'])), + '&page;' => array_pop($page_tmp), '&fpage;' => $vars['page'], '&t;' => "\t", ); #comment