ECshop--搜索模块细究

本文详细解析了Ecshop电子商务平台的搜索功能实现流程,从用户界面的搜索表单提交到后台的数据查询处理,再到结果展示的过程。重点介绍了如何通过关键词进行AND、OR逻辑运算,并解释了SQL查询语句的构造方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ecshop细究


今天看了下ecshop搜索这块,前台数据一直到后台查询再返回前台。 大致是这么个过程,首先,在index.dwt文件内,body下面引入了
<!-- #BeginLibraryItem "/library/page_header.lbi" --><!-- #EndLibraryItem -->

即可重用的搜索模块代码,拼接在body下面,我们可以进入这个文件看看,在50行左右

<div class="serach-box">
      <form id="searchForm" name="searchForm" method="get" action="search.php" onSubmit="return checkSearchForm()" class="f_r">
        <table width="100%" border="0" cellspacing="0" cellpadding="0">
          <tr>
            <td width="135"><input name="keywords" type="text" id="keyword" value="{$search_keywords|escape}" class="B_input"  /></td>
            <td><input name="imageField" type="submit" value="搜索" class="go" style="cursor:pointer;" /></td>
          </tr>
        </table>
      </form>
</div>

这样就很清楚了,url对应的是根目录下php,文本框里面设置

<span style="font-size:18px;">value="{$search_keywords|escape}"</span>

即保留搜索值,form表单里面的action指向php,但是在检索之前,也即表单提交的同时,通过checkSearchForm()验证输入合法,然后我们到根目录下search.php中看看,代码非常多,需要检索的东西有点复杂,但可以找到通过表单提交过来的keywords

/* 初始化搜索条件 */
    $keywords  = '';
    $tag_where = '';
    if (!empty($_REQUEST['keywords']))
    {
        $arr = array();
        if (stristr($_REQUEST['keywords'], ' AND ') !== false)
        {
            /* 检查关键字中是否有AND,如果存在就是并 */
            $arr        = explode('AND', $_REQUEST['keywords']);
            $operator   = " AND ";
        }
        elseif (stristr($_REQUEST['keywords'], ' OR ') !== false)
        {
            /* 检查关键字中是否有OR,如果存在就是或 */
            $arr        = explode('OR', $_REQUEST['keywords']);
            $operator   = " OR ";
        }
        elseif (stristr($_REQUEST['keywords'], ' + ') !== false)
        {
            /* 检查关键字中是否有加号,如果存在就是或 */
            $arr        = explode('+', $_REQUEST['keywords']);
            $operator   = " OR ";
        }
        else
        {
            /* 检查关键字中是否有空格,如果存在就是并 */
            $arr        = explode(' ', $_REQUEST['keywords']);
            $operator   = " AND ";
        }

        $keywords = 'AND (';
        $goods_ids = array();
        foreach ($arr AS $key => $val)
        {
            if ($key > 0 && $key < count($arr) && count($arr) > 1)
            {
                $keywords .= $operator;
            }
            $val        = mysql_like_quote(trim($val));
            $sc_dsad    = $_REQUEST['sc_ds'] ? " OR goods_desc LIKE '%$val%'" : '';
            $keywords  .= "(goods_name LIKE '%$val%' OR goods_sn LIKE '%$val%' OR keywords LIKE '%$val%' $sc_dsad)";

            $sql = 'SELECT DISTINCT goods_id FROM ' . $ecs->table('tag') . " WHERE tag_words LIKE '%$val%' ";
            $res = $db->query($sql);
            while ($row = $db->FetchRow($res))
            {
                $goods_ids[] = $row['goods_id'];
            }

            $db->autoReplace($ecs->table('keywords'), array('date' => local_date('Y-m-d'),
                'searchengine' => 'ecshop', 'keyword' => addslashes(str_replace('%', '', $val)), 'count' => 1), array('count' => 1));
        }
        $keywords .= ')';

        $goods_ids = array_unique($goods_ids);
        $tag_where = implode(',', $goods_ids);
        if (!empty($tag_where))
        {
            $tag_where = 'OR g.goods_id ' . db_create_in($tag_where);
        }
    }

在上面的代码中通过

<span style="font-size:18px;">$_REQUEST['keywords']</span>

来获取关键值,之后进行一些其他处理,然后拼接sql语句,查询返回的结果通过

$smarty->assign('goods_list', $arr);
注入值,最后在search.dwt文件中还原整个页面

<span style="font-size:18px;"><!-- {if $action eq "form"} --></span>

这里我也不是太清楚,网上搜了下,没有相关的回答,大体上就是这样注入数据,仔细看看会发现嵌套使用蛮多的,search.dwt文件里面表单也会调用search.php文件,然后不断循环,我就感觉这样很复杂,模块化并不好。

转载于:https://www.cnblogs.com/yefengCrazy/p/5636616.html

安装说明: 1. 复制search 目录到网站根目录,请不要修改此文件夹的名称 2. 初次安装, 访问: 域名/search/baseline.php 例如:你的域名是www.ahuoo.com, 那么请访问 www.ahuoo.com/search/baseline.php 3. 修改代码 1.先备份网站根目录的search.php,然后用插件里面的替换掉 2.在模版中找到商品搜索页中的商品名称显示语句,有些模版在library/search_goods_list.lbi文件中,如果没有search_goods_list.lbi文件那就在search.dwt文件中。 语句如: <a href="{$goods.url}" title="{$goods.goods_name|escape:html}" class="name">{$goods.goods_name}</a> 将其中的{$goods.goods_name}改为{$goods.new_goods_name} 3. 在admin\goods.php文件中找到如下代码: sys_msg($is_insert ? $_LANG['add_goods_ok'] : $_LANG['edit_goods_ok'], 0, $link); 在此代码上一行前添加如下代码: require_once ('../search/delta.php'); //ahuoo 4. 在admin\category.php文件中找到如下代码: sys_msg($_LANG['catedit_succed'], 0, $link); 在此代码上一行前添加如下代码: require_once ('../search/delta.php'); //ahuoo 4. 如果需要添加自定义关键词可访问: 域名/search/add_word.php 一般情况下是不需要的。 插件原理: Ecshop默认情况下搜索是根据数据库按搜索的字符串去匹配,不能自动根据需要去自动分词。 例如:你搜索“李宁安踏” 标题里面必须要有“李宁安踏”才能出来, 如果某个商品标题只有“李宁”是不会出来的,这样对于普通的用户是不友好的。 本插件提供的功能: 1.提供一种强大的分词搜索,用户可以不用空格某几个分词,随便打一个句子就可以搜索出对应的结果 2.可以自定义分词。 3.搜索结果自动按照相关度排序,相关度越相关,越排在最前面。 插件为试用版,如果正式使用可以联系作者购买,当前只索引了商品的标题和分类信息,如果需要索引商品详情可以定制化开发,shopex也会有对应的版本。 插件作者 :阿虎 QQ:1976468723 演示地址: 前台:http://ahuoo.com/ec/search.php?encode=YTo0OntzOjg6ImNhdGVnb3J5IjtzOjE6IjAiO3M6ODoia2V5d29yZHMiO3M6MTI6IuiBlOmAmuS4ieaYnyI7czoxMDoiaW1hZ2VGaWVsZCI7czowOiIiO3M6MTg6InNlYXJjaF9lbmNvZGVfdGltZSI7aToxNDQ5MDYxNTAzO30= 后台: http://ahuoo.com/ec/admin 用户名/密码:test/test123
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值