3

検索結果が一度に 10 件表示されるフォーラムに検索機能があります。ユーザーは、次または前の 10 件の検索結果を見ることができます。結果には、検索された単語が見つかるさまざまなトピックが表示されます。すべてが思い通りに機能します。

問題は、ユーザーが結果をクリックして、そのトピックの正しいページに到達できるようにしたい場合です。たとえば、特定のトピックの投稿番号 14 は、2 ページ目に表示する必要があります (LIMIT 10,10トピック ページの SQL クエリで使用)。LIMITリンクでパラメーターを $_GET として送信します。

投稿された日付で並べ替えたときに、特定のトピックの合計数から結果の各トピックの行番号を取得するにはどうすればよいですか? すべてが常にこの順序で表示されます。使いたい$nr = $nr-1; //and then

 $limit = floor($nr / 10) * 10;

LIMITその番号で、検索結果のリンクを使用して適切なパラメーターを送信できるようにします。

検索結果を取得するために使用される PDO は次のとおりです。

$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'] . '&amp;cat_id=' . $row['topic_cat'] . '
        &amp;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();

リンク内のパラメーターを何らかの形でクエリで取得する必要があるため、内のstartそれぞれに対して新しい DB 呼び出しを行う必要はありません。post_idwhile loop

4

3 に答える 3

3

投稿の ID しか知らないと仮定すると、次のようになります。

SELECT
    count(*)
FROM
    `posts`
WHERE
    date <= ( SELECT date FROM `posts` WHERE post_id = '$id' )
ORDER BY
    date DESC;

これにより、この投稿の行数がわかります。その後、次のような php コードを実行するだけです。

$start = floor( $nr / 10 ) * 10;
$end = ceil( $nr / 10 ) * 10;

複数の 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;
于 2012-09-11T11:34:16.137 に答える
1
$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';

次にアクセスします$start = $row['start']

$nr = count($array[$row['topic_subject']])+$start - 1;
于 2012-09-19T19:17:04.353 に答える
0

おっしゃる通り悩みました。このリンクはあなたにとって役立つと思います。

1. http://www.awcore.com/dev/1/3/Create-Awesome-PHPMYSQL-Pagination_en 2. http://www.9lessons.info/2009 /09/pagination-with-jquery-mysql-and-php.html

于 2012-09-20T07:28:48.697 に答える