Menu目录

静态站点如何实现站内搜索

作者:Carl Zhang | 更新时间:2017-02-13 | 分类:科技

17.04.17更新:关于SQL注入问题,请看:简单地避免SQL注入式攻击

其实一开始是不想写自己的站内搜索的,想想“百度/360”提供的站内搜索用用就好了,但是自从强制开启https以后,这两个搜索引擎中我的站点收录量直线下滑,导致他们提供的站内搜索直接没内容了。。。但是作为一个网站开发的初学者,整个站点都是静态页面,都不需要数据库,这咋写站内搜索啊!各种查资料,花了两天时间,做了数据库表,同时利用PHP实现了站内搜索。

创建数据库表有很多种方法,一种是自己写,但是我很懒!虽然站点目前的文章不是很多,我还是不想自己写。还有就是利用爬虫生成一张数据库!这个是我喜欢的方法。虽然爬虫也不是这么好操作的。。。

本来我是想自己写一个爬虫的,但是后来发现好像难度有点大,毕竟是零基础。后来上网查的时候发现了一个好玩的东西,叫PySpider的东西。具体的安装方法请看:https://moshuqi.github.io/2016/08/12/Python爬虫-PySpider框架/。教程里面用的是Mac系统,我这里用的是Ubuntu系统,至于Windows能不能用,那就得你们自己去研究了。

安装完以后就可以开始运行了,完全按照上面那个教程来就好了,真的非常的方便。放几张图:

PySpider

PySpider

PySpider

PySpider

上面这张图是最后生成的results,右上角有三个选项,根据你们的数据库来,我下的是中间那个“URL-JSON”,因为这个保存的是txt文档,方便导入到excel中对数据进行删改,有些不需要的就直接可以删掉了,而且它这个保存下来是带引号的,这个实际上没有必要,所以就可以利用excel的替换功能直接删掉。最后另存为CSV格式,因为MySql可以直接上传CSV(UTF-8)格式的数据表。

至于数据库的操作什么的,大家根据自己服务器上的数据库自行研究啦~接下来着重讲一下利用php如何来实现数据库的检索。

本来想,用的不是独立服务器,而是虚拟空间,没法安装中文分词怎么办,但是想想,用MySql的LIKE语句就好了,虽然效率不高,但是我们数据量也不大嘛,还是挺快的。

首先先创建一个form来存放文本输入框和搜索按钮,这个自行研究,不多解释。如下:

form

代码如下:(想换格式的都随意,我只是举个例子而已,我首页的那个是重新写的。)

<!--代码片作者:Carl Zhang,转载请注明。--> 
<form name="form_search" method="post" action="search.php" >
<table width="100%">
<tr>
<td style="width: 80%;">
<input type="text" name="keyword" style="width: 100%;"/>
</td>

<td style="width: 20%;">
</input type="submit" name="Submit" value="搜索" />
</td>
</tr>
</table>
</form>

接下来创建一个search.php(文件名随便,反正是php文件就行,放哪也随你,反正上图中按钮那边的action自己记得改路径好就行了)文件,传入一个变量keyword给php文件。

首先先检测是否有输入keyword,还是说用户只是单纯的想调戏一下这个输入框:

<?php 
//代码片作者:Carl Zhang,转载请注明。

//获取搜索关键字
@$keyword=trim($_POST["keyword"]);
//@的作用是为了避免keyword为空而报错,导致物理地址泄露。

//检查是否为空
if($keyword==""){
echo "<p style='text-align: center;'>您要搜索的关键字不能为空</p>";

//返回按钮帮助用户返回原界面进行修改。
echo "<div style='text-align: center;'>";
echo "<input type='submit' name='Back' onclick='history.back()' value='返回' />";
echo "</div>";

//结束程序
exit;
}
?>

接下来就是读取数据库,代码后面基本都带注释了,自己看吧~

<?php 
//代码片作者:Carl Zhang,转载请注明。

//获取搜索关键字
@$keyword=trim($_POST["keyword"]);
//@的作用是为了避免keyword为空而报错,导致物理地址泄露。

//检查是否为空
if($keyword==""){
echo "<p style='text-align: center;'>您要搜索的关键字不能为空</p>";

//返回按钮帮助用户返回原界面进行修改。
echo "<div style='text-align: center;'>";
echo "<input type='submit' name='Back' onclick='history.back()' value='返回' />";
echo "</div>";

//结束程序
exit;
}

define ('HOSTNAME', '数据库主机名');
define ('USERNAME', '数据库用户名');
define ('PASSWORD', '数据库用户登录密码');
define ('DATABASE_NAME', '需要查询的数据库');

$link = mysql_connect(HOSTNAME, USERNAME, PASSWORD) or die('连接数据库失败,请稍后重试。');

$sql = "SELECT * FROM `表格名字` WHERE `summary` LIKE '%$keyword%' OR `title` LIKE '%$keyword%'";
$retval = mysql_query( $sql, $link );
if(! $retval )
{
die('未找到相关文章。');
}

mysql_select_db(DATABASE_NAME) or die('连接数据库失败,请稍后重试。');
?>

挑几句解释一下:
$sql = "SELECT * FROM `表格名字` WHERE `summary` LIKE '%$keyword%' OR `title` LIKE '%$keyword%'";
这句话就是在“表格名字”这个表格中选取所有列,然后在列summary或者列title中匹配刚刚传入的关键词keyword。

接下来显示匹配到的内容:while为循环,懂编程的反正都看得懂,内容显示用echo语句就可以了。下方为php部分的完整代码。

<?php 
//代码片作者:Carl Zhang,转载请注明。

//获取搜索关键字
@$keyword=trim($_POST["keyword"]);
//@的作用是为了避免keyword为空而报错,导致物理地址泄露。

//检查是否为空
if($keyword==""){
echo "<p style='text-align: center;'>您要搜索的关键字不能为空</p>";

//返回按钮帮助用户返回原界面进行修改。
echo "<div style='text-align: center;'>";
echo "<input type='submit' name='Back' onclick='history.back()' value='返回' />";
echo "</div>";

//结束程序
exit;
}

define ('HOSTNAME', '数据库主机名');
define ('USERNAME', '数据库用户名');
define ('PASSWORD', '数据库用户登录密码');
define ('DATABASE_NAME', '需要查询的数据库');

$link = mysql_connect(HOSTNAME, USERNAME, PASSWORD) or die('连接数据库失败,请稍后重试。');

$sql = "SELECT * FROM `表格名字` WHERE `summary` LIKE '%$keyword%' OR `title` LIKE '%$keyword%'";
$retval = mysql_query( $sql, $link );

// 检测查询是合法,并能够被服务器执行。
if(! $retval ){
die('出了点故障,请移步“About关于”页面联系管理员');
}

mysql_select_db(DATABASE_NAME) or die('连接数据库失败,请稍后重试。');

while ($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
$title = $row['title'];
$url = $row['url'];
$summary = $row['summary'];

echo $title;
echo $url;
echo $summary;

//php是可以和html混编的,网页样式可以用echo来写,这里就不展示了。
}

//完成显示以后,释放变量中的值
mysql_free_result($retval);
mysql_close($link);
?>

php是可以和html混编的,所以网页样式什么的,大家都懂了吧~

当数据库中匹配不到用户输入的内容时,可以用下方这个代码来提示用户:

<?php 
// 代码片作者:Carl Zhang,转载请注明。

// 利用mysql_num_rows获取结果集中行的数量来判断内容是否为空。
if (mysql_num_rows($retval))
{
$sql_count = 1;
}
else
{
$sql_count = 0;
}
//echo $sql_count;

if ($sql_count == 0)
{
echo "<p style='text-align: center;'>您要搜索文章作者还没写出来呢</p>";

// 返回按钮帮助用户返回原界面进行修改。
echo "<div style='text-align: center;'>";
echo "<input type='submit' name='Back' onclick='history.back()' value='返回' />";
echo "</div>";

// 结束程序
exit;
}
?>

让我们来看看最终的效果(手机端方便截图,电脑端结果是一样的):

效果

效果

(本文为作者原创。转载请注明:转自carlzhang.xyz

作者注:首页搜索按钮以及返回按钮所用样式来自于:Buttons - 一个高度可定制的按钮(button) CSS 样式库。 本文中的代码,取自众网友的分享,由我整理改良。感谢大家的分享。





*昵称:

*邮箱:

*留言: