相关链接可以帮助读者找到他/她感兴趣的内容,今天早上赖在床上不想起,胡思乱想设计了个相关链接,着手做,发现还可以,当然,很多改善的空间,感觉像个十分简易的搜索引擎,写下来分享。效果可见右下面。
设计思想:
首先,建立关键字表 --〉然后,从标题中选出关键字 --〉最后,利用关键字搜索含关键字的标题列表。
关键字表如下:
--
-- Table structure for table `c_keywords`
--
CREATE TABLE IF NOT EXISTS `t_keywords` (
`k_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`k_words` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`k_priority` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;
这里字段“k_priority”定义该关键字的优先级,最高为10,最低为1;
把程序贴在这里:
< ?php
//建立数据库连接,下面是调用连接数据库的类
require_once("require/db.php");
$db = new DB();
$con= $db->connect();
$db_l=$db->sel_db($connection);
//读取相关链接
echo "
< FONT color=#FF0000 > 相关链接< BR>";
//按照优先级由大到小读取关键字
$sql_1="select * from t_keywords order by k_priority desc";
$k_words_1=$db->query($sql_1);
$i=0; //这个数字不仅作为记录计数,在后面也作为跳出循环的判断字
while ( $k_words_r_1 = $db->fetch_object ( $k_words_1 ) ) //第1层循环,按关键字表提取标题中的关键字
{
$sql_2="select k_id, k_words, k_priority from t_keywords where
(select subject from t_th where id = '".$id."')
like '%".$k_words_r_1->k_words."%' and k_words='".$k_words_r_1->k_words."'";
$k_words_2=$db->query($sql_2);
while ( $k_words_r_2 = $db->fetch_object ($k_words_2) ) //第2层循环,按前面“提取的关键字”寻找数据库中含关键字的标题
{
$sql_3="select id, subject from t_th where
t_th.subject like '%".$k_words_r_2->k_words."%' order by id desc";
$th_1=$db->query($sql_3);
while ( $th_r_1 = $db->fetch_object ($th_1) ) //第3层循环,把找到的标题列出来
{
$i = $i + 1;
echo "http://coolder.com/".$th_r_1->id."-1-1\">";
echo " ".$i.". ".$th_r_1->subject."";
echo "
";
} //第3层循环结束
//如果按一个一个的“提取的关键字”找出相关标题列出来,会出现重复现象,为简化计,优先级高的“提取的关键字”能找出相关标题,就结束查询。
if($i>0)
break;
} //第2层循环结束
if($i>0) //同理,结束循环也要跳出
break;
} //第1层循环结束
$db->free_result($k_words_1); //释放数据集
$db->free_result($k_words_2); $db->free_result($k_words_1);
$db->close($con); //关闭数据库连接
? >
考虑到标题可能没含文章的关键字,在t_th表里添了个字段keywords,在SQL语句$sql_2里用concat连字符把标题和文章的关键字连接起来,在$sql_3里,用or把两个判断连接起了,like作模糊查询,%是通配符。 另外,用“!=”,即不等于,将当前这篇文章排除。SQL语句变化如下:
$sql_2="select k_id, k_words, k_priority from t_keywords where (select concat(subject,keywords) from t_th where id = '".$id."')
like '%".$k_words_r_1->k_words."%' and k_words='".$k_words_r_1->k_words."'";
$sql_3="select id, subject from t_th where ((t_th.subject like '%".$k_words_r_2->k_words."%') or (t_th.keywords like "%".$k_words_r_2->k_words."%')) and id != '".$id."' order by id desc";
补充一下,注意括号的用法,并且文章的keywords为空时记录返回为空。印象SQL里可以用判断句,我这里图省事,把keywords字段默认置为0了,有时间再改,否则是个质量隐患。