1

我正在将基于片段的内容管理系统实施到我当前的项目中。片段可以通过完整网址的完全匹配回退到部分网址上的通配符匹配或最后一个默认片段与页面相关联。

为了实现这一点,我创建了一个带有通配符标志的页面关联表,系统首先根据非通配符关联检查当前 url,如果找不到匹配项,它会检查设置通配符标志的部分 url .

为了实现这一点,我从数据库中获取所有部分 url 并将它们放入一个数组中,然后遍历数组以检查与当前 url 的匹配:

protected function _check_wildcard($url = NULL)
{
    if($url)
    {
        $q = $this->db->where('wildcard' ,'Y')
                ->from('content')
                ->get();
        $wildcards = $q->result_array();

        foreach($wildcards AS $wildcard)
        {
            if(strpos($url,$wildcard['url']) !== FALSE )
            {
                return $wildcard['snippet_id'];
            }
        }
    }
    else
    {
        return NULL;
    }
}

任何人都可以建议一种更好的方法来做到这一点 - 最好是不需要每次加载页面时都必须不断下载所有通配符的完整列表,因为我担心这会对可扩展性产生负面影响系统下线?

4

1 回答 1

1

您可以直接查询数据库,而不是加载所有通配符。假设MySQL,此查询检查给定 URL 字符串中的通配符 URL。前任 :

// Keeping your current wildcard = 'Y' condition and adding the wildcard check.
$where = "wildcard = 'Y' AND INSTR('" . $url . "', url) > 0 ";
$this->db->where($where)->from('content')->get();

您可以检查您的数据库的文档以查看它是否支持 INSTR 或类似功能。

如果此查询没有返回任何行,则可以返回NULL,如果有行,则可以返回第一个snippet_id

希望这可以帮助!

于 2012-11-07T13:17:24.773 回答