2012-02-22 2 views
0

여러 사용자가 사용하는 집필 시스템이 있습니다. 기사에는 내 while 루프를 통해 실행되는 각 기사의 뷰어 ID에 대해 확인되는 자체 권한이 있습니다. 사용자가 기사를 볼 수 있도록 허용하면 $printcount을 증가시키고 기사는 $limit에 도달하면 루프가 종료됩니다. 나는 또한 정렬 이름, 날짜 삽입, 날짜 수정 및 제출 정렬 옵션이 있습니다.LIMIT 문 및 정렬이없는 페이지 번호

MySQL 제한 기능을 사용하지 않고 다음/이전 페이지 버튼을 어떻게 활용할 수 있습니까? 여기에 내 코드의 짧은 버전 (100 % 작동하지 않을 수 있지만 걸쳐 포인트를 데려 와야한다)에 난 단지 ID ASC에 의해 분류 된 경우에, 나는 쉽게 last_id로 ID를 저장할 수

<?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

사용자 그룹에 대한 액세스를 제한하는 사내 위키를 만들었습니다. 그룹의 일부인 문자열을 쉼표로 구분하여 사용자 ID를 저장하는 그룹 테이블이 있습니다. 내 응용 프로그램이 잠재적으로 수천 개의 항목을 크롤링 할 수 있으므로 모든 단일 아티클에 대한 항목이있는 전용 사용 권한 테이블을 갖고 싶지 않았습니다. 플랫 파일을 자체 사용 권한 세트가 내장 된 파일로 사용하는 것 이외에 다른 접근 방법을 모르겠습니다. 이것은 사용 권한 시스템을 통합 한 첫 번째 시도이며 현재 데이터베이스와의 문자열에 대해 explode/implode를 사용하고 있습니다. –

답변

0

귀하의 권한 모델이 PHP 응용 프로그램에서 처리되고 사용자 쿼리에서 LIMIT를 쉽게 사용할 수 없기 때문에이 질문을하고 있다고 가정합니다.

데이터베이스 테이블에 사용자 별 사용 권한을 저장 한 다음 사용자가 볼 수있는 아티클 만 검색 할 수 있도록 조인을 사용해야합니다. 그런 다음 응용 프로그램에서 페이지 매김이나 정렬 논리를 처리 할 필요가 없습니다. 당신은 LIMIT와 ORDER BY를 mysql에서 사용할 수있다.

또한 매개 변수 기반 쿼리를 사용해야합니다. 귀하의 코드에는 방대한 SQL 주입 구멍이 있습니다.

+0

답장을 보내 주셔서 감사합니다. 위의 스크립트 ($ _GET vars)는 실제로 사용되지 않으며 읽기 쉽게 사용됩니다. SQL 쿼리에 넣기 전에 모든 변수를 엄격하게 검사합니다. –

+0

필자는 권한 PK, 기사 ID (FK), 권한 유형 (전역 권한, 그룹 권한 및 사용자 권한)을 결정하는 데 사용되는 정수 플래그, 해당 그룹 또는 사용자 ID를 참조하는 대상 ID 정수 (FK) 및 읽기/쓰기 tinyint (액세스 할 수없는 경우 0, 액세스 할 경우 1) –

0

좋은 (안정된, 빠른) 페이지 매김은 OFFSET을 사용하지 않고 LIMIT를 유지하므로 사용자는 페이지간에 이동할 수 있으며 페이지가 더 이상 이동하지 않아도 응답 시간이 증가하지 않습니다 이 문서는 페이지 매김 MySQL의 주요 아이디어는 다른 dbms에서도 고려 될 수 있습니다).

Pagination in MySQL

+0

이 문서를 가져 주셔서 감사합니다. 그러나 기본 양식에서 빠른 페이지 매김 개념을 만드는 방법을 이미 알고 있습니다. 여기서 문제는 그룹 및 사용자가 내용을 볼 수있는 권한이 있는지 확인하기 위해 권한 검사를 추가하는 것입니다. 이것은 전에 스크립트를 사용 했었지만 LIMIT을 사용하고 있었기 때문에 결과 확인 횟수를 확인할 수 없다는 이유로 결과의 수는 정확하게 표시되지 않습니다. 나는 규모를 확장 할 수있는 여러 그룹 및/또는 사용자 권한을 효과적으로 통합하는 실용적인 솔루션을 찾고 있다고 생각합니다. 다시 한번 감사드립니다! –

+0

어, 그럴 경우 나는 jonchang의 대답을지지 할 것이다. – Alfabravo