2012-02-22 6 views
0

私はいくつかのユーザーによって使用される記事システムを持っています。記事には、自分のwhileループを実行する各記事の閲覧者のIDと照合される独自の権限があります。ユーザーが記事を閲覧できる場合は$printcountをインクリメントして記事を制限し、$limitになるとループを終了します。私はまた、名前、日付、日付の変更と提出によって並べ替えるオプションを並べ替えています。LIMITステートメントとソートなしのページ数

MySQLの制限機能を使用せずに次の/前のページボタンを利用する方法を教えてください。ここに私のコードのショートバージョンは、私だけID ASCでソートされた場合、私は簡単にlast_idとしてIDを格納し、上の可能性が

(100%機能的ではないかもしれないが、全体のポイントを持参してください)
<?php 
$sort=$_GET['sort']; // date_added 
$direction=$_GET['dir']; // ASC 
$limit=$_GET['limit']; // 25 
$query="SELECT * FROM `article` ORDER BY '$sort' '$direction'"; 

$result=mysql_query($query); 
if(mysql_num_rows($result)==NULL) { 
    echo '<tr><td colspan="4">NO RECORDS FOUND</td></tr>'; 
} 
$printcount=0; 
while(($row=mysql_fetch_assoc($result))&&($printcount<$limit+1)) { 
    //if user is owner of article $readable=true; 
    //load permissions from permission column (comma separated integers) into array, if user's group ID is in that array $readable=true; 
    //if article "global_read" flag=1, $readable=true; 
    //if $printcount<$limit, and $readable echo the table row with data 
    //if $readable, $printcount++; 
} 
?> 

です次のページではクエリにはさらにWHERE `id`> $ last_IDが追加されますが、ソートオプションと方向オプションが異なるため、これははるかに複雑に思えます。

+0

私が対処する必要がある質問が、なぜ* *だと思います。なぜあなたはこれをやりたいのですか? –

+0

'LIMIT'がなければ、データベースから同じデータを取得し続ける必要がないように、アプリケーションサーバがそれを処理するようにすることもできます。 –

+0

私は、ユーザーのグループへのアクセスを制限する社内のWikiを構築しました。グループの一部であるユーザーIDを文字列でコンマで区切って格納するgroupsテーブルがあります。私のアプリケーションが潜在的に数千のエントリの後にクロールする可能性があるので、私は個々の記事ごとにエントリを持つ専用のパーミッションテーブルを持つことを望んでいませんでした。私はそれ以外の方法は、フラットファイルを使用する以外にどのようにアプローチするのかはわかりません。これは私の最初の試行であり、権限システムを組み込んでおり、現在データベース内の文字列にexplode/implodeを使用しています。 –

答えて

0

あなたの許可モデルがPHPアプリケーションで処理され、クエリでLIMITを簡単に使用できないため、この質問をしていると思います。

データベーステーブルにユーザー単位のアクセス許可を格納してから、ユーザーが表示できるアーティクルだけを取得できるように結合を使用する必要があります。それでは、アプリケーションでページ区切りや並べ替えロジックを処理する必要はありません。 mysqlでLIMITとORDER BYを使用するだけで、あなたのためにそれを行うことができます。

また、おそらくパラメータベースのクエリを使用する必要があります。あなたのコードには大量のSQLインジェクションホールがあります。

+0

ご返信ありがとうございます。上記のスクリプト($ _GET変数)は実際には使用されておらず、読みやすくするために使用されています。 SQL問合せに入れる前に、すべての変数を厳密にチェックします。 –

+0

私は、権限PK、記事のID(FK)、権限の種類(グローバル権限、グループ権限、ユーザー権限)を決定するために使用される整数フラグ、対応するグループまたはユーザーIDを参照するためのターゲットID整数(FK)、読み取り/書き込みtinyint(アクセスなしの場合は0、アクセスの場合は1) –

0

良い(安定した、速い)ページネーションはOFFSETを使用せずにLIMITを保持するので、ユーザーはページ間を移動でき、応答時間はそれ以上のページに移動すると増加しません。 このドキュメントはページ分割MySQLの主なアイデアは他のdbmsでも考えられます)。

Pagination in MySQL

+0

この文書をありがとうございますが、私はすでに基本的なフォームで高速ページングの概念を作成する方法を理解しています。ここでの問題は、グループとユーザーがコンテンツを表示するためのアクセス権を持っているかどうかを確認するアクセス許可チェックを追加することです。これは前のスクリプトを使っていたのですが、LIMITを使用していたので、結果の数は表示されている記事の数を正確に表していませんでした。複数のグループやユーザーの権限を効果的に組み込むための実用的なソリューションを探しています。もう一度ありがとう! –

+0

ああ、その場合、私はジョンチャンの答えをサポートします。 – Alfabravo

関連する問題