0

ページ付けスクリプトを作成しています。ユーザーがページをクリックして移動したときにどのような結果が表示されるかを判断できるように、データベースクエリの最初と最後の結果を取得する必要があります。これは私がその瞬間に持っているコードです:

// my database connection is opened

// this gets all of the entries in the database
$q = mysql_query("SELECT * FROM my_table ORDER BY id ASC");
$count = mysql_num_rows($q);
// this is how many results I want to display
$max = 2;
// this determines how many pages there will be
$pages = round($count/$max,0);
// this is where I think my script goes wrong
// I want to get the last result of the first page
// or the first result of the previous page
// so the query can start where the last query left off
// I've tried a few different things to get this script to work
// but I think that I need to get the first or last result of the previous page
// but I don't know how to.
$get = $_GET['p'];
$pn = $_GET['pn'];
$pq = mysql_query("SELECT * FROM my_table ORDER BY id ASC LIMIT $max OFFSET $get");

// my query results appear

if(!$pn) {
    $pn = 1;
}
echo "</table><br />
Page $pn of $pages<br />";
for($p = 1;$p<=$pages;$p++) {
    echo "<a href='javascript:void(0);' onclick='nextPage($max, $p);' title='Page $p'>Page $p</a> ";
}
4

2 に答える 2

3

そこにはほとんど問題がないと思いますが、私はあなたのためにそれらに取り組もうとしています。まず、上記のコメントのように、SQL インジェクションに対して脆弱なコードを使用しています。そのことに注意してください - MySQL 拡張機能と同じくらい簡単に使用でき、多くの問題 (インジェクションなど) からあなたを救う PDO を使用したいと思うかもしれません。

しかし、あなたのコードに、それを見てみましょう:

  1. mysql関数を使用するのではなく、DBに行数を取得するように依頼する必要があります。これははるかに効果的であるため、SELECT count(*) FROM mytable.
  2. $pagesすべての行を印刷するために ceil() を使用するには、5$max行と 11 行がある場合、実際には 3 が必要な場合に round で$pages2 を作成します (最後のページには最後の 11 行のみが含まれます)。
  3. LIMITでしたいLIMIT row_count OFFSET offset$max = row_countページ番号からオフセットを計算できます$offset = ($max * $page) - $max。あなたのコードで$getは、直接ページである場合、$get 番目の行を取得することを意味します (ただし、JS の nextpage で何が起こるかはわかりません。すべてが JavaScript を使用しているわけではないことに注意してください)。

ここで PDO を使用する簡単な例を用意しました。

行の選択は、SQL にパラメーターを配置する方法の例を示しています。このケースの状態では完全に安全です'SELECT * FROM pseudorows LIMIT '.$start.','.$max。例を簡単に (そして安全に) 作成したかったからです。

// DB config
$DB_NAME    = 'test';
$DB_USER    = 'test';
$DB_PASSWD  = 'test';

    // make connection
try {
    $DB_CONN = new PDO("mysql:host=localhost;dbname=".$DB_NAME, $DB_USER, $DB_PASSWD);
    $DB_CONN->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die($e);
}

// lets say user param 'p' is page, we cast it int, just to be safe
$page   = (int) (isset($_GET['p'])?$_GET['p']:1);
// max rows in page
$max    = 20;

// first select count of all rows in the table
$stmt = $DB_CONN->prepare('SELECT count(*) FROM pseudorows');
$stmt->execute();
if($value = $stmt->fetch()) {
    // now we know how many pages we must print in pagination
    // it's $value/$max = pages
    $pages = ceil($value[0]/$max);

    // now let's print this page results, we are on $page page
    // we start from position max_rows_in_page * page_we_are_in - max_rows_in_page
    // (as first page is 1 not 0, and rows in DB start from 0 when LIMITing)
    $start = ($page * $max) - $max;
    $stmt = $DB_CONN->prepare('SELECT * FROM pseudorows LIMIT :start,:max');
    $stmt->bindParam(':start',$start,PDO::PARAM_INT);
    $stmt->bindParam(':max',  $max,PDO::PARAM_INT);
    $stmt->execute();

    // simply just print rows
    echo '<table>';
    while($row = $stmt->fetch()) {
        echo '<tr><td>#'.$row['id'].'</td><td>'.$row['title'].'</td></tr>';
    }
    echo '</table>';

    // let's show pagination
    for($i=1;$i<=$pages;$i++) {
        echo '[ <a href="?p='.$i.'">'.$i.'</a> ]';
    }
}
于 2012-06-03T08:32:41.350 に答える
0

mysql_fetch_array連想配列を返します

つまり、 and を使用resetendて最初と最後の結果を取得できます。

$pqa = mysql_fetch_array($pq);
$first = reset($pqa);
$last = end($pqa);

実際の結果をどのように使用する予定かわかりません。ページ番号だけでページネーションに十分なはずです。

それでも、それが役立つことを願っています。はい、mysqli にアップグレードして、コードが古くならないようにします。

于 2012-06-03T08:19:12.493 に答える