2012-12-31 4 views
1

인터넷에서 "간단한"페이지 매김 자습서조차도 이해하기가 정말 힘들었습니다.특정 쿼리에 페이지 매김을 적용하는 방법은 무엇입니까?

나는 회사를위한 인트라넷 사이트를 만드는 중입니다. 완료하기위한 유일한 단계는 수천 개의 결과, 특히 검색 결과가 모두 포함되어 있기 때문에 모든 쿼리에 페이지 매기기입니다.

당신이 만 10 대를 원한다면 ..

SELECT * FROM hdticket WHERE id = 22; 
+3

[** 새 코드 **에서 mysql_ * 함수를 사용하지 마십시오. (http://bit.ly/phpmsql). 더 이상 유지 관리되지 않으며 공식적으로 사용되지 않습니다 (https://wiki.php.net/rfc/mysql_deprecation). [** 빨간색 상자 **] (http://j.mp/Te9zIL)를 참조하십시오. 대신 [* prepared statements *] (http://j.mp/T9hLWi)에 대해 알아보고 [PDO] (http://php.net/pdo) 또는 [MySQLi] (http://php.net/)를 사용하십시오. mysqli) - [이 기사] (http://j.mp/QEx8IB)는 어떤 결정을 내리는 데 도움이 될 것입니다. PDO를 선택하면 [여기는 좋은 튜토리얼입니다] (http://j.mp/PoWehJ). – ThiefMaster

+3

나는 많은 사람들이 말할 필요가 없다. 결코 $ _GET [ 'anything']'을 당신의 질의에 직접 넣지 말라. 이것은 재앙을위한 처방이다. 그 이유에 대한 Google의 "SQL Injection". – glomad

+0

잘 페이지 매기기는 LIMIT 절을 사용하여 데이터를 가져 오는 것을 의미합니다. 귀하의 스타일링 문제에 따라 테이블이나 CSS 또는 기타 무엇이든 할 수 있습니다. –

답변

2

MySQL 쿼리에 LIMIT 절을 추가해야합니다. 로 이것은 간단하다 :

SELECT * FROM hdticket WHERE id = :ticknum LIMIT 0, 10 

이 처음부터 10 개 기록을 가져옵니다 (당신의 기록을 상상 제로의 인덱스 기반). 첫 번째 숫자는 가져 오기를 시작할 시간이고, 두 번째 숫자는 그 이후에 가져올 수입니다. 그래서 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의 URL은? //intranet/index.php 페이지 = 2는 줄 것이다 :이 도움이

<?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 삽입 공격에 취약합니다. 이 기능은 페이지 매김을 위해 숫자를 넣는 것이 좋지만, 누군가가 사악한 사람이 URL에 SQL을 넣으면 테이블이나 데이터베이스 전체를 자르는 것과 같은 모든 일을 할 수 있습니다. 그것을 확인하지 않고 그냥 지나친 것입니다.

PDO과 같은 mysql_ 함수 대신 사용할 경우 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 주입을 방지하기 위해 탈출 : 귀하의 코드는 다음과 같을 것이다.

+3

을 참조하십시오. 서버 측 페이지 매김을 수행하는 데 LIMIT가 필요하다고 동의합니다. 그러나 LIMIT를 사용하는 경우 항상 ORDER BY 절을 포함해야합니다. 이렇게하면 매번 동일한 순서로 행이 반환되므로 일관된 페이지 매김을 위해 필요합니다. 실제로, MySQL은 어쨌든 일관된 순서로 행을 리턴 할 것입니다. 그러나 그것에 의존하지 않는 것이 좋습니다. – jfrank

+0

@jfrank Seconded. SQL 인젝션 취약점에 대해 경고하기 위해 저 자신을 넘어서는 것을 잊어 버렸습니다. –

+0

Martin과 기여한 모든 분들께 감사드립니다! 이것은 내 질문에 완벽하게 대답합니다! 비록 내가 아주 초록일 때 이것을 시작했지만 OOP를 배우기 위해 한 걸음 씩 나아가고 있지만, 나는 deprecated mysql_ 함수를 알고있다. 또한이 사이트는 안전한 네트워크에서 문맹 인 컴퓨터 용으로 개발중인 내부 사이트이므로 향후 프로젝트에서 반드시 염두에 둬야하지만 주입에 대해 너무 걱정하지 않아도됩니다! 모두에게 감사드립니다! –

-2

당신이 그렇게 할/최고 한도를 사용할 수 있습니다

내 질문은 내가 아래에있는 쿼리에게 방법 페이지를 매기는 할 수있을 것입니다 :

select top 10,* from table; 

또는 을하면 다음 페이지로 이동하려면 :

select * from table limit 10 , 20; 
관련 문제