インターネット上の「単純な」ページ付けチュートリアルでさえ、私は本当に理解するのに苦労しました。
私は会社のイントラネットサイトを作成中です。それを完了するための唯一のステップは、すべてのクエリにページを付けることです。すべてのクエリには数千の結果、特に検索結果が含まれるためです。
私の質問は、以下のようにクエリをページ付けできるかどうかです。
SELECT * FROM hdticket WHERE id = 22;
インターネット上の「単純な」ページ付けチュートリアルでさえ、私は本当に理解するのに苦労しました。
私は会社のイントラネットサイトを作成中です。それを完了するための唯一のステップは、すべてのクエリにページを付けることです。すべてのクエリには数千の結果、特に検索結果が含まれるためです。
私の質問は、以下のようにクエリをページ付けできるかどうかです。
SELECT * FROM hdticket WHERE id = 22;
LIMIT
MySQLクエリに句を追加する必要があります。これは次のように簡単です。
SELECT * FROM hdticket WHERE id = :ticknum LIMIT 0, 10
これにより、最初から10個のレコードがフェッチされます(レコードがゼロインデックスベースであると想像してください)。最初の数字はいつからフェッチを開始するかであり、2番目の数字はその後フェッチする数です。したがって、0から、次の10レコードをフェッチしています。これは1ページになります。
レコードの後続のページを取得するには、最初の番号をインクリメントするだけです。したがって、2ページ目を取得するには、10からカウントを開始し、次の10レコードをフェッチする必要があります。このクエリは次のようになります。
SELECT * FROM hdticket WHERE id = :ticknum LIMIT 10, 10
そして3ページ目:
SELECT * FROM hdticket WHERE id = :ticknum LIMIT 20, 10
等々。うまくいけば、パターンが出現するのを見ることができます。
パラメータを使用している$_GET
ので、URLを調整してレコードをページングすることができます。したがって、http://intranet/index.php?page=2のURLは次のようになります。
<?php
$page = intval($_GET['page']);
$limit = 10;
$offset = (($page - 1) * $limit);
$sql = "SELECT * FROM hdticket WHERE id = :ticknum LIMIT $offset, $limit";
お役に立てれば。
また、いくつかの傍白。mysql_
非推奨になっているため、関数を使用しないでください。これは、公式のマニュアルページ(http://php.net/manual/en/function.mysql-query.php )から確認できます。
さらに、URLに含まれるものを取得し、それをSQLクエリで直接使用するため、コードはSQLインジェクション攻撃に対して脆弱です。そこにページネーションの数値を入力する場合、これはすべて問題ありませんが、悪意のある人がSQLをURLに入力すると、テーブルやデータベース全体の切り捨てなど、あらゆる種類の処理を実行できます。チェックせずに通過するだけです。
これに対抗するために、 PDOmysql_
などの関数の代替を使用する場合は、SQLステートメントで変数を準備できます。コードは次のようになります。
<?php
$sql = "SELECT * FROM hdticket WHERE id = :ticknum LIMIT :offset, :limit";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':ticknum', $ticknum, PDO::PARAM_INT);
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$stmt->execute();
これにより、SQL文字列に渡されるデータが期待どおりになり、SQLインジェクションを防ぐために自動的にエスケープされます。
あなたはそうするためにtop/limitを使うことができます。
トップ10のみが必要な場合は、次のようにします。
select top 10,* from table;
または、ページに移動する場合は、次のようにします。
select * from table limit 10 , 20;