Php 如何在搜索结果中链接到主题的右侧页面?
我有一个论坛的搜索功能,搜索结果将显示在10的时间。然后,用户可以查看下一个或前10个搜索结果。结果显示了不同的主题,在那里可以找到搜索到的单词。一切都像我希望的那样 问题是,我希望用户能够单击结果并最终显示在该主题的右侧页面上。例如,必须在第2页上使用主题页SQL查询中的限制10,10查看特定主题中的帖子nr 14。我将LIMIT参数作为$u GET发送到链接中 在按发布日期排序时,如何从特定主题的总数中检索结果中每个主题的行号?所有内容都始终按该顺序显示。我想使用$nr=$nr-1//然后 在该数字上,可以发送正确的限制参数,并在搜索结果中添加链接 以下是用于获取搜索结果的PDO:Php 如何在搜索结果中链接到主题的右侧页面?,php,sql,search,pagination,Php,Sql,Search,Pagination,我有一个论坛的搜索功能,搜索结果将显示在10的时间。然后,用户可以查看下一个或前10个搜索结果。结果显示了不同的主题,在那里可以找到搜索到的单词。一切都像我希望的那样 问题是,我希望用户能够单击结果并最终显示在该主题的右侧页面上。例如,必须在第2页上使用主题页SQL查询中的限制10,10查看特定主题中的帖子nr 14。我将LIMIT参数作为$u GET发送到链接中 在按发布日期排序时,如何从特定主题的总数中检索结果中每个主题的行号?所有内容都始终按该顺序显示。我想使用$nr=$nr-1//然后
$query = 'SELECT t.topic_id, t.topic_cat, t.topic_subject, p.post_content, p.post_id, UNIX_TIMESTAMP(p.post_date) AS post_date
FROM posts p
LEFT JOIN topics t ON p.post_topic = t.topic_id
WHERE p.post_content LIKE :search OR t.topic_subject LIKE :search ORDER BY UNIX_TIMESTAMP(p.post_date) DESC LIMIT :start, :size';
$statement = $db->prepare($query);
$statement->bindValue(':search', '%'.$search.'%');
$statement->bindValue(':start', $start2, PDO::PARAM_INT);
$statement->bindValue(':size', $pagesize, PDO::PARAM_INT);
$statement->execute();
while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
$array[$row['topic_subject']][] = $row['post_id'];
$nr = count($array[$row['topic_subject']]) - 1;
echo '<div class="search_result"><div class="search_topic"><a href="topic_view.php?id=' . $row['topic_id'] . '&cat_id=' . $row['topic_cat'] . '
&start=' . floor($nr / 10) * 10 . '#anchor_' . $row['post_id'] . '">' . $row['topic_subject'] . '</a><span style="float:right;color:#696969">'
. date("M d, Y",$row['post_date']) . '</span></div><div class="search_post">' . $row['post_content'] . '</div></div>';
}
} $statement->closeCursor();
它是链接中的开始参数,我需要在查询中以某种方式获取它,这样我就不必为while循环中的每个post_id进行新的DB调用。假设您只知道post的id,我会这样做:
SELECT
count(*)
FROM
`posts`
WHERE
date <= ( SELECT date FROM `posts` WHERE post_id = '$id' )
ORDER BY
date DESC;
对于多个ID:
SELECT topic_id, (
SELECT
count(*)
FROM
`posts`
WHERE
date <= ( SELECT date FROM `posts` u1 WHERE u1.topic_id = u2.topic_id )
) AS row
FROM
`posts` u2
WHERE
topic_id IN ( '$id1', '$id2', '$id3' )
ORDER BY
date DESC;
然后通过$start=$row['start']访问
正如你所说,我有个问题。我认为这个链接对你很有用 我已经成功地完成了这些工作,希望能对您有所帮助: 1.
2. 我不明白这个问题。你有行号,你想知道它将出现在哪一页?我有搜索结果中显示的每个帖子的id每个结果的标题都是主题,但是,为了能够将用户发送到该主题的右侧页面,我需要知道在LIMIT子句中使用哪个数字。我假设它必须在topic_id=“$topic_id”的位置?因为我需要主题中的帖子编号。但是我不是必须对每个搜索结果都进行查询吗?我想你只需要一个,我会在一分钟内重写。搜索结果显示为PDO:while$row=$statement->fetchPDO::FETCH_ASSOC{},因此如果能够通过在原始查询中加入一些额外的select,在每个结果集中包含正确的开始参数,那就太好了。@newInBusiness编辑的答案。对不起,这是我能想到的最好的办法了,不过我相信还有更好的办法。
$start = floor( $nr / 10 ) * 10;
$end = ceil( $nr / 10 ) * 10;
SELECT topic_id, (
SELECT
count(*)
FROM
`posts`
WHERE
date <= ( SELECT date FROM `posts` u1 WHERE u1.topic_id = u2.topic_id )
) AS row
FROM
`posts` u2
WHERE
topic_id IN ( '$id1', '$id2', '$id3' )
ORDER BY
date DESC;
$query = 'SELECT :start as start, t.topic_id, t.topic_cat, t.topic_subject,
p.post_content, p.post_id, UNIX_TIMESTAMP(p.post_date) AS post_date
FROM posts p
LEFT JOIN topics t ON p.post_topic = t.topic_id
WHERE p.post_content LIKE :search OR t.topic_subject LIKE :search
ORDER BY UNIX_TIMESTAMP(p.post_date) DESC LIMIT :start, :size';
$nr = count($array[$row['topic_subject']])+$start - 1;