온우카 기드온은 수년간 웹 애플리케이션을 설계 및 코딩하고 복잡한 문제를 해결한 경험이 있는 프리랜서 풀 스택 개발자입니다. 그는 보안, 글쓰기, 새로운 기술에 대한 토론을 좋아합니다.

많은 수의 문서를 다루는 애플리케이션을 구축할 때는 페이지 매김을 사용하여 페이지별로 행을 가져오는 것이 중요합니다.
이 글에서는 N1QL과 PHP로 작업할 때 페이지 매김을 구현하는 방법을 보여드리겠습니다.
N1QL에 대해 조금 알아보기
Couchbase N1QL은 JSON용 SQL을 확장하는 선언적 쿼리 언어입니다. 네이티브 프레임워크 및 언어 통합, 유창한 API 또는 JDBC/ODBC 드라이버를 통해 데이터를 쿼리할 수 있습니다. N1QL은 개발자에게 데이터를 쿼리하고 조작할 수 있는 표현력이 풍부하고 강력하며 완벽한 언어를 제공합니다.
전제 조건
- 카우치베이스에 대한 기본 지식과 서버에 설정된 카우치베이스(카우치베이스 설치)
- N1QL에 대한 기본 지식
- PHP에 대한 기본 지식(모든 언어를 사용할 수 있으므로 선택 사항)
- 사용 가능한 카우치베이스 SDK(여기로 이동)
우리가 구축할 것
이 글에서는 기본적으로 데이터베이스에서 데이터를 가져와서 페이지 번호를 매기고 표시하는 PHP 환경을 빠르게 설정해 보겠습니다.
환경 설정
1단계: 새 버킷 만들기
Couchbase 관리 영역에 로그인하여 새 버킷 이름을 만듭니다. 댓글 달기.

2단계: 새 버킷에 대한 인덱스를 만듭니다: 댓글 달기
쿼리 탭을 클릭하고 아래에 나열된 쿼리를 입력한 후 실행을 클릭합니다.
|
1 |
create primary index on `commenting` using gsi; |
모든 것이 순조롭게 진행되면 문서 작성을 시작해도 좋습니다.
3단계: 프로젝트 스타터 파일 복제하기
이 튜토리얼에서 사용할 파일의 기본 파일 구조를 만들었습니다.
명령줄을 열고 github에서 리포지토리를 복제합니다.
|
1 |
$ git clone git@github.com:dongido001/php-couchbase-pagination_complete.git |
이제 브라우저에서 방금 복제한 파일을 엽니다. 다음 페이지가 표시됩니다:

파일 구조
방금 복제한 리포지토리에는 3개의 PHP 파일이 포함되어 있습니다: config.php, db.php및 index.php.
그리고 config.php 파일은 데이터베이스의 정보를 정의하는 곳입니다:
|
1 2 3 4 5 6 |
<?php //some configs define("C_USERNAMAE", "Administrator"); define("C_PASSWORD", "password"); define("C_URL", "https://127.0.0.1:8091/"); //eg: localhost:8091 define("DEFAULT_BUCKET", "commenting"); |
에서 db.php를 클릭한 후 CouchBase에 연결하여 버킷을 열었으며, CouchBase 정보에 맞게 세부 정보를 변경해야 합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $authenticator = new \Couchbase\ClassicAuthenticator(); $authenticator->cluster(C_USERNAMAE, C_PASSWORD); $cluster = new \Couchbase\Cluster(C_URL); $cluster->authenticate($authenticator); $bucket = $cluster->openBucket(DEFAULT_BUCKET); In the `index.php`, we have some PHP code at the top of the file and at the bottom, we also |
HTML 코드가 있습니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//index.php <?php //include config details require_once('config.php'); //include connection to the database. require_once('db.php'); if( $_SERVER['REQUEST_METHOD'] == "POST"){ $uid = uniqid(); $comment = [ "_id" => $uid, "name" => $_POST["name"], "comment" => $_POST["comment"], "created_at" => date("Y-m-d H:i:s") ]; $bucket->insert($uid, $comment); } ?> ... |
두 파일을 포함했습니다, config.php 그리고 db.php 그런 다음 양식이 제출될 때 데이터베이스에 몇 가지 주석을 삽입하는 로직을 작성했습니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
//index.php ... <!DOCTYPE html> <html lang="en"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous"> </head> <body> <div class="container"> <div class="container" style="margin-left: auto; margin-right: auto; width: 400px;"> <h4 class="text-center">Add a comment</h4> <form action="" method="POST"> <div class="form-group"> <label for="name">Name:</label> <input type="text" class="form-control" name="name" required> </div> <div class="form-group"> <label for="comment">Comment:</label> <textarea class="form-control" rows="5" name="comment" required> </textarea> </div> <button type="submit" class="btn btn-primary">Submit</button> </form> <br /> <div > <h4 class="text-center">Listing comments</h4> </div> <div id="pagination"> </div> </div> </div> </body> </html> |
HTML 코드는 댓글을 추가하고 나열할 수 있는 양식을 표시합니다.
이제 시작해 보겠습니다!
페이지에서 원하는 만큼 댓글을 추가합니다. 곧 해당 데이터에 페이지 번호를 매길 예정입니다.
데이터베이스에서 페이지 매김된 콘텐츠 가져오기
의 헤더 부분에 다음을 추가합니다. index.php 는 상단의 모든 PHP 코드 아래에 있습니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//Select all contentin our query $no_per_page = 4; //This is the number of Items we want per page $current_page = (isset($_GET['page_id'])) ? $_GET['page_id'] : 1; //Gets the current page, if not set, default to page 1 $skip = ($current_page - 1) * $no_per_page; //Gets the total number of page we want to skip when making request. When we are on page one, We don't need to skip any Item. $query = \Couchbase\N1qlQuery::fromString("SELECT * FROM `commenting` LIMIT $no_per_page OFFSET $skip"); $result = $bucket->query($query); //count total number of result in the database $total = $bucket->query(\Couchbase\N1qlQuery::fromString("SELECT COUNT(comment) total FROM `commenting`")); $total = $total->rows[0]->total; $number_of_pages = ceil( $total/$no_per_page ); //calculate number of pages |
위의 코드에 주석을 추가하여 각각의 기능을 설명했습니다. 여기에서는 LIMIT AND 오프셋 을 사용하여 각 쿼리가 반환해야 하는 결과의 수를 제한할 수 있었습니다. 오프셋은 현재 액세스 중인 페이지 번호에 따라 쿼리할 때 데이터의 양을 건너뛰는 데 사용되었습니다.
LIMIT: LIMIT 절은 SELECT가 결과 집합에서 반환할 수 있는 최대 개체 수를 지정합니다. 음수 값 또는 9223372036854775295(1 - 512의 결과)보다 큰 값은 LIMIT 0으로 간주됩니다.
오프셋: OFFSET 절은 건너뛸 개체 수를 지정합니다. LIMIT 절이 있는 경우 LIMIT보다 먼저 OFFSET이 적용됩니다. OFFSET 값은 음수가 아닌 정수여야 합니다.
쿼리 결과를 페이지에 채우기
아래 코드를 추가하여 index.php 이 태그 바로 뒤에 <h4 class="text-center">댓글 나열</h4> .
|
1 2 3 4 5 6 7 8 9 10 |
<?php foreach( $result->rows as $comment ):?> <div> <div class="alert alert-success" role="alert"> <h5 class="alert-heading"> By: <?=$comment->commenting->name?>, Created At: <?=$comment->commenting->created_at?> </h5><br> <p> <?=$comment->commenting->comment?></p> <hr> </div> </div> <?php endforeach; ?> |
페이지 매김 링크 추가
이 HTML 태그 사이에 아래 코드를 추가합니다. <div id="pagination"> </div> 를 추가합니다.
|
여기서는 페이지의 페이지 수만 인쇄하고 있습니다.
예! 이제 페이지 매김이 작동합니다.

결론
이 글에서는 N1QL을 사용하여 페이지 매김을 구현하는 방법을 배웠습니다. 또한 오프셋 그리고 LIMIT 그리고 기본적으로 N1QL을 사용하여 Couchbase에서 쿼리를 실행하는 방법을 설명합니다. 전체 앱은 여기에서 다운로드할 수 있습니다: (git@github.com:dongido001/php-couchbase-pagination_complete.git)
읽어주셔서 감사합니다. 여러분의 의견이나 궁금한 점이 있으면 알려주세요.