需求:开发一个搜索文章记录关键词的功能,要求记录下用户的搜索关键词,如果存在则+1,如果不存在则存储下来。附关键词描红的相关代码!

记录表结构

-- 定义表结构
DROP TABLE IF EXISTS `article_search`;
CREATE TABLE `article_search`(
`id` INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '主键id',
`keyword` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '搜索的关键字',
`search_count` MEDIUMINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '搜索次数',
UNIQUE KEY keyword(keyword)
)ENGINE=INNODB CHARSET utf8 COMMENT '搜索关键词记录';

存储过程

-- 定义存储过程
DELIMITER $
DROP PROCEDURE calcKeywordCounts$
TRUNCATE TABLE `article_search`$
CREATE DEFINER="root"@"localhost" PROCEDURE calcKeywordCounts(IN word VARCHAR(20))
BEGIN
    DECLARE idExists INT DEFAULT 0;
    -- 查询是否已经存在
    SELECT id INTO idExists FROM `article_search` WHERE `keyword` = word;

    IF idExists = 0 THEN -- 不存在 新增
        INSERT INTO `article_search` VALUES (NULL,word,1);
    ELSE -- 存在 search_count+1
        UPDATE `article_search` SET `search_count`=`search_count`+1 WHERE `keyword` = word;
    END IF;

END$

DELIMITER ;

调用测试

CALL calcKeywordCounts('你好');

CALL calcKeywordCounts("美国");

ThinkPHP代码内的调用

 if($list['data']){ // 如果存在文章则记录下来
	$procedure = sprintf(' call calcKeywordCounts("%s") ',$keyword);
	$res = M('')->procedure($procedure);  // 调用存储过程 计算关键词搜索次数 不存在insert 存在 +1
}

踩到的坑问题

  1. 开始的时候使用 query() 方法调用无法达到目的,翻看 \Think\Model.class.php 找到 procedure() 方法。

  2. 解决完上面的问题,在本地测试可以正常使用。但在服务器上无法使用,于是找到MySQL的配置文件将 'DB_TYPE'=> 'mysqli' ,完成。

附关键词描红代码

/* 关键词描红 */
function SearchReplaceKw($string,$sokw='',$useSafe=false)  {
	if($useSafe) $sokw = SafeStrip($sokw);
	if(empty($sokw) || empty($string)) return $string;
	$sokw = preg_replace('/\s+/','|',$sokw);

	return preg_replace("/($sokw)/i",'<font color="red">\\1</font>',$string);
}

/* 去除特殊字符,不包括空格 */
function SafeStrip($kw)  {
	if(strlen($kw) == 0) return '';
	$badString = '~!@#$%^&*()_+|-=\\{}[];\':",./<>?';
	$length = strlen($badString);
	$pos = 0;
	while($pos < $length){
		$kw = str_replace($badString{$pos},'',$kw);
		$pos++;
	}
	return preg_replace('/([\r\n\t]+)/','',$kw);
}

最后编辑: 于 3年前

标签

评论列表(0)

    暂无评论