2012-05-01 21 views
1

我正在编写一些脚本,我想创建搜索。我的项目基于CodeIgniter,我的愿望是让所有代码内容与它兼容。CodeIgniter - 搜索结果 - 如何创建好的查询和URI?

所以,我已经在寻找查询,但它不好,因为它不支持更多的单词。因此,如果我在搜索表单中输入单词“test”(假设测试单词在数据库中的某个字段中),那么结果会很少,但如果我输入单词“test test test”(再假设测试单词是在其中一个字段中的数据库中)将不会有任何结果。

我当前的查询:

$this->db->select('title, content, date, hyperlink')->or_like(array('title' => $query, 'content' => $query))->order_by('id_article', 'desc')->get('news');

下一个问题是URI,因为如果我搜索“的一些文章,今天是晴天”有是逗号和在其他情况下可能与其他不允许的字符问题太。我在那里读了其他几个问题,但是我发现的所有内容都是$this->uri->uri_to_assoc(),在我的案例中,我认为这是行不通的,因为我的项目中没有使用英语。

这两个问题的最佳解决方案是什么?

+0

尝试放入先前创建的查询 – ZiTAL

+0

对于初学者,我认为你应该将'or_like'改为'like'。如果你真的想在标题或内容中搜索,你应该把它们分成两个:'$ this-> like('title',$ query) - > or_like('content',$ query)'。 – Zombaya

+0

另外,如果在执行查询后执行'$ this-> db-> last_query();',您可以在此报告您的有效mysql查询的样子。 – Zombaya

回答

1

要解决搜索问题,您应该将查询分解为多个部分。

$query = 'test test 2 test3'; 
$parts = explode(' ', $query); 

然后遍历零件并添加or_like条件。

foreach ($parts as $q) 
{ 
    $this->db->or_like(array('title' => $q, 'content' => $q)); 
} 

现在它检查任何单词。

您可能还希望允许将引用的值视为一个单词,以便“测试2”将搜索序列测试2而不仅仅是测试和2.您需要调整如何获得零件,可能是像正则表达式:

preg_match_all('/"(?:\\\\.|[^\\\\"])*"|\S+/', $query, $parts); 

至于URI中的无效字符,通过进行urlencode通过在一端上的串然后urldecode另一方。

$uri = urlencode('some article, today is sunny'); 
+0

爆炸词的想法是好的,但是这是在某种程度上好,在其他没有。目前是我的功能类似: '函数show_results_news($查询) \t { \t \t $ shwresnws = $这个 - > DB->选择( '标题,内容,日期,超链接') - > or_like(阵列( 'title'=> $ query,'content'=> $ query)) - > order_by('id_article','desc') - > get('news'); \t \t return $ shwresnws; \t}' 在我现在需要用foreach来改变它吗? 我也在用urlencode尝试,但结果是:'一些+文章%2C +今天+是+阳光'也有不允许的字符,它不起作用。 – user1257255