【问题标题】:Peculiar Search Error in DokuWikiDokuWiki 中的特殊搜索错误
【发布时间】:2011-04-13 18:18:41
【问题描述】:

DokuWiki forums 交叉发布此内容:

因此,我进行了一些修改以允许三件事:页面名称中的大写、侧边栏 ToC 中的自然大小写排序以及不区分大小写的搜索。

请耐心等待,因为我知道这看起来像是文件权限错误。我不相信。

在搜索“nul”及其任何变体(nUl、Nul、nuL 等)时,我收到以下错误消息:

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 365

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 366

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 367

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 368

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 369

Warning: filesize() [function.filesize]: stat failed for C:/Websites/dokuwiki/data/meta/nul.changes in C:\Websites\dokuwiki\inc\changelog.php on line 305

没有也从来没有一个名为“nul”的页面。搜索完成后,它会在 \dokuwiki\data\index\page.idx 中添加一个新行,其内容与我搜索的内容相同(nul、NuL、nUl 等)。将该行添加到 page.idx 后,对字母“n”、“u”或“l”的任何搜索也会导致错误:

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 365

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 366

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 367

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 368

Warning: Cannot unset offset in a non-array variable in C:\Websites\dokuwiki\inc\parserutils.php on line 369

Warning: filectime() [function.filectime]: stat failed for C:/Websites/dokuwiki/data/pages/nul.txt in C:\Websites\dokuwiki\inc\parser\metadata.php on line 46

Warning: filemtime() [function.filemtime]: stat failed for C:/Websites/dokuwiki/data/pages/nul.txt in C:\Websites\dokuwiki\inc\parser\metadata.php on line 72

再一次,页面“nul”在 wiki 上从未存在过,并且在搜索时被写入 page.idx。

以下是我为实现我在帖子开头提到的三件事所做的修改:

/inc/fulltext.php,第 255 和 263 行:我将“strpos”替换为“stripos”。

if ($id !== '' && $cleaned !== '') {
        foreach ($pages as $p_id => $p_title) {
            if ((stripos($in_ns ? $p_id : noNSorNS($p_id), $cleaned) === false) &&
                (!$in_title || (stripos($p_title, $id) === false)) ) {
                unset($pages[$p_id]);
            }
        }
    }
    if (isset($ns)) {
        foreach (array_keys($pages) as $p_id) {
            if (stripos($p_id, $ns) !== 0) {
                unset($pages[$p_id]);
            }
        }
    }

/inc/pageutils.php,删除第 114 行:

//$id = utf8_strtolower($id);

/inc/search.php,第 40 和 41 行:我将“sort”替换为“natcasesort”

natcasesort($files);
natcasesort($dirs);

据我所知,这些都是微小的变化,我没有立即看到任何会导致此问题的明显变化。

有什么想法吗?

更新 -

我还原了所有更改,但错误仍然存​​在。

然后我在一个完全独立的目录中安装了一个新的 DokuWiki(Release 2010-11-07a "Anteater"),错误仍然存​​在。

然后我从 splitbrain.org 安装了夜间快照,但错误仍然存​​在。

有人有什么想法吗?

【问题讨论】:

  • 事实证明,这是由于“NUL”被保留而导致的 Windows 特定错误。我在原始问题中链接的论坛帖子中发布了修复。
  • 您应该将其发布为答案并将其标记为已接受——这是一个令人愉快的边缘案例。
  • 它不会让我再接受我自己的答案两天,但我已经发布了!

标签: php dokuwiki


【解决方案1】:

事实证明,这是由于“NUL”被保留而导致的 Windows 特定错误。根据查尔斯的建议,我将在此处以及在我原始评论中链接的论坛帖子中发布答案。我觉得这是一个笨拙的修复,但我需要让它工作。我只是将“nul”这个词改写为它的 ASCII 字符,然后将其翻译回来以显示在页面和标题中:

\inc\pageutils.php,第 137 行(ish):

if(strtolower($id) == 'nul') {
    for($i=0;$i != strlen($id);$i++) {
        $stupidWindowsFix .= "&#".ord($id[$i]).";";
    }
    $id = $stupidWindowsFix;
}

\inc\template.php,第 876 行:

$name = html_entity_decode($id);

【讨论】:

    猜你喜欢
    • 2015-09-04
    • 2014-06-12
    • 1970-01-01
    • 2016-03-11
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多