这是一种很捉鸡的写法,应该有更优的算法的,但是我的Mysql还很烂,只能拐个弯...
下面的$pageNo应该要先自减一,因为用户一般认为页面是从1开始计数的。
过程:

  1. 计算有多少个id不显示
  2. 利用limit查询得到当前页数下不显示的id
  3. 用个while把获取到的id跑成mysql指令
  4. 再次执行查询,附加条件不显示被ban的id

代码:
$wd: 搜索的关键字
$banip: 被ban的id (手滑写成ip)
$pageNo: 第N页减一
$tmp_addon: 被ban掉的id的个数
$searchlimit: 每页显示多少
其中,第一次与第二次查询到的内容排列顺序必须相同。

<?php
    $banid = "id <> -1";
    $tmp_addon = $pageNo*$searchlimit;
    $tmp_wd = str_replace(" ", "|", $wd);
    if (substr($tmp_wd, 0, 1) == "|") {
        $tmp_wd = substr($tmp_wd, 1);
    }
    if (substr($tmp_wd, -1) == "|") {
        $tmp_wd = substr($tmp_wd,0,strlen($tmp_wd)-1); 
    }
    $tmp_banid_ = $db->query("SELECT id FROM jb_spider WHERE concat(url,title,html) like '%".$s."%' ORDER BY title REGEXP '(".$tmp_wd.")' desc limit ".$tmp_addon);
    while ($tmp_banid = $tmp_banid_->fetch_row()) {
        $banid .= " AND id <>".$tmp_banid[0];
    }
    unset($tmp_banid_,$tmp_banid,$tmp_addon);
    $rs = $db->query("SELECT * FROM jb_spider WHERE concat(url,title,html) like '%".$s."%' AND ".$banid." ORDER BY title REGEXP '(".$tmp_wd.")' desc limit ".$searchlimit);
    unset($tmp_wd);

ORDER BY title REGEXP (xxx|xxx)再次让结果按照title排序,模拟权重