• 谈天说地
  • 【搜索增强】问下站长这条语句如果放到程序里应该是怎么写呢

@admin 

select a.title from hy_thread as a,hy_post as b where a.id=b.tid and (a.title like '%关键字%' or b.content like '%关键字%');

问下站长这条语句如果放到程序里应该是怎么写呢,难道只能用这个sql吗,我打算做一个搜索增强插件,可以搜索标题和内容的

结果 = S("Plugin")->query(SQL语句);

较为复杂的多表查询 最好使用 原生查询 使用数据库引擎的多表查询结构 会更复杂..


QQ截图20160815135536.jpg

@admin:回复 #1 结果=S("Plugin")->query(SQL语句);较为复杂的多表查询最好使用原生查询使用数据库引擎的多表查询结构会更复杂..
好的,对了 你看下,我研究hy_sql的时候,发现第339行,select_context方法的第三个参数前面有一个&,这个是什么意思?

@admin:回复 #1 结果=S("Plugin")->query(SQL语句);较为复杂的多表查询最好使用原生查询使用数据库引擎的多表查询结构会更复杂..
 另外如果我使用

结果 = S("Plugin")->query(SQL语句);
这个的话,是不是要另外写个过滤关键字的方法,还是程序里面有单独的过滤关键字的方法

@admin:回复 #1 结果=S("Plugin")->query(SQL语句);较为复杂的多表查询最好使用原生查询使用数据库引擎的多表查询结构会更复杂..
 指针……谢谢指导

@admin:回复 #1 结果=S("Plugin")->query(SQL语句);较为复杂的多表查询最好使用原生查询使用数据库引擎的多表查询结构会更复杂..
 好的,谢谢

补充一下

引擎用的是 PDO 所以你使用query方法 会返回对象 并不会返回查询结果

http://php.net/manual/zh/class.pdostatement.php

比如你现在要的 多表查询

$data = S("Plugin")->query("select hy_thread.title from hy_thread,hy_post where hy_thread.id=hy_post.tid and (hy_thread.title like '%a%' or hy_post.content like '%a%')")->fetchAll(\PDO::FETCH_ASSOC); //注意后面的->fetchAll(\PDO::FETCH_ASSOC);

//print_r $data; 

->fetchAll(\PDO::FETCH_ASSOC);


@admin:回复 #1 结果=S("Plugin")->query(SQL语句);较为复杂的多表查询最好使用原生查询使用数据库引擎的多表查询结构会更复杂..
 刚刚在忙,我研究下谢谢

@admin:回复 #1 结果=S("Plugin")->query(SQL语句);较为复杂的多表查询最好使用原生查询使用数据库引擎的多表查询结构会更复杂..

 有个问题我想请问一下,我写完后发现这样搜索会连同原本内容里面的html代码也算在搜索范围,虽然影响不是很大,但靠匹配正则表达式或其他方法有可能过滤掉这部分搜索吗

@admin:回复 #1 结果=S("Plugin")->query(SQL语句);较为复杂的多表查询最好使用原生查询使用数据库引擎的多表查询结构会更复杂..
 我的想法是把搜索出来的结果的content字段用正则表达式过滤一遍,然后在这些结果内进行二次搜索,不过这样的话感觉得不偿失

@admin 

还有我发现一个小BUG,搜索页面即使没结果也可以点击下一页

确实 因为输出搜索结果还需要得出页数 会第一句SQL 所以就省略了

@admin:回复 #3 确实因为输出搜索结果还需要得出页数会第一句SQL所以就省略了
 

我想到一个办法不执行sql

        {hook a_search_index_2}
        
        
        $Thread = M("Thread");
        $data=array();
        $data = $Thread->search_list($pageid,$this->conf['searchlist'],$key);
        $Thread->format($data);
        {hook a_search_index_3}
//这部分
        $count = $this->_count['thread'];
        $count = (!$count)?1:$count;
        $page_count = ($count % $this->conf['searchlist'] != 0)?(intval($count/$this->conf['searchlist'])+1) : intval($count/$this->conf['searchlist']);
//修改
        $t=$key;
        foreach ($data as &$v) {
            $v['title'] = str_replace($key,'<font color="red">'.$key.'</font>',$v['title']);
            
        }

        {hook a_search_index_v}
        $this->v("pageid",$pageid);
        $this->v("page_count",$page_count);
        $this->v("data",$data);
        $this->v("top_list",array());
        $this->display('search_index');

改成

        {hook a_search_index_2}
        
        
        $Thread = M("Thread");
        $data=array();
        $data = $Thread->search_list($pageid,$this->conf['searchlist'],$key);
        $Thread->format($data);
        {hook a_search_index_3}
//这部分
        $count = count($data);
        if($count<$this->conf['searchlist'])
          $page_count = $pageid;//因为view文件里是要判断他们相等才不让点
        else
          $page_count = $pageid+1;//永远不相等
//修改
        $t=$key;
        foreach ($data as &$v) {
            $v['title'] = str_replace($key,'<font color="red">'.$key.'</font>',$v['title']);
            
        }

        {hook a_search_index_v}
        $this->v("pageid",$pageid);
        $this->v("page_count",$page_count);
        $this->v("data",$data);
        $this->v("top_list",array());
        $this->display('search_index');


唯一的缺点就是当

$count的值和$this->conf['searchlist']一样时,也是会让点下一页的