0

我注意到在 Croogo 的 NodesController::search() 中搜索带有一些非 ascii 字符的单词时存在错误,例如“üäö”。如果我搜索“Steuergeräte”(德语),即使我应该搜索,我也没有得到任何结果。如果我搜索“Steuergerate”(德语拼写错误),我会得到想要的结果。这太奇怪了。

我工作正常的数据库上的直接查询:

"SELECT * FROM i18n WHERE content LIKE '%Steuergeräte%';"

它返回预期的记录。

但这不是 unicode-chars 的普遍问题,例如,搜索日语单词按预期工作。所以这只影响一些字符。

Cakephp:2.4.0,克鲁戈:1.4.5

4

1 回答 1

0

好的,我找到了问题的原因。

在搜索视图中,要搜索的字符串被清理为:

     $q = Sanitize::clean($this->request->params['named']['q']);

'encode' => true当设置(默认)时,默认情况下在字符串上运行 html_entities 。这将变成例如ö然后ö搜索带有 html-entities 的单词。

我通过以下方式得到了解决方法:

     $q = $this->request->params['named']['q'];
     // Use encode=false on Sanitize::clean to prevent äüöß etc. getting
     // replaced by html entities. And strip tags manually first to prevent
     // html injected strings.
     $q = strip_tags($q);
     $q = Sanitize::clean($q, array('encode' => false));

注意:如果像我的情况一样,设置 TinyMCE,'entity_encoding' => 'raw'则节点表中的 body 字段也将包含 äöü 而不是 htmlentities,IMO 是用 htmlentities 替换它们的更好做法。虽然默认情况下,tinymce 用 htmlentities 替换字符,因此 body 字段将与 Croogo/Cakephp 的默认搜索行为一起使用。但是,例如,在标题字段中搜索不会。

更新

好的,正如标记评论所建议的,消毒和使用蛋糕的分页方法是不必要的,因此可以跳过消毒部分。我还发现使用 htmlspecialchars 作为strip_tags 更好,因为strip_tags 不会处理例如'&',而在body 上,tinyMCE 将它们保存为html_entities。所以更新后的代码如下所示:

     $q = htmlspecialchars($this->request->params['named']['q']);
     // go on with searching for nodes on paginate-method
于 2013-04-24T13:38:29.080 回答