달력

112024  이전 다음

  • 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

'분류 전체보기'에 해당되는 글 49건

  1. 2010.10.23 Chapter09. 일반적인 프로그래밍 테크닉 - 4 ('10.10.23)

앞서 예제로 나온 view_user.php 파일을 수정하여 한 페이지에 10개의 데이터를 출력하도록 만든다.
쿼리문에서 limit 절을 이용하여 10개씩의 데이터를 받아온다.




<?php # Script 9.4 - #4
$page_title = 'View the Current Users';
include ('includes/header.html');

echo '<h1>Registered Users</h1>';

require_once('../mysqli_connect.php');

$display = 10;

if(isset($_GET['p']) && is_numeric($_GET['p'])) {
    $pages = $_GET['p'];
} else { // view_users.php 페이지 첫 로딩시에는 변수 p가 null 상태이므로 이를 초기화한다
    $q = "SELECT COUNT(user_id) FROM users";
    $r = @mysqli_query($dbc, $q);
    $row = @mysqli_fetch_array($r, MYSQLI_NUM);
    $records = $row[0];

    if($records > $display) {
        $pages = ceil($records/$display); // 10개씩 나누어 출력하므로 $record/$display의 몫을 $page에 할당한다
    } else {
        $pages = 1;
    }
}

if(isset($_GET['s']) && is_numeric($_GET['s'])) { // 시작페이지를 뜻하는 변수 $start를 초기화한다
    $start = $_GET['s'];
} else {
    $start = 0;
}

$q = "SELECT last_name, first_name, DATE_FORMAT(registration_date, '%M %d, %Y') AS dr, user_id FROM users ORDER BY registration_date ASC LIMIT $start, $display"; // limit절에서 $start, $display를 이용하여 쿼리문의 결과를 10개씩만 가져온다
$r = @mysqli_query($dbc, $q);

echo '<table align="center" cellspacing="5" cellpadding="5" width="100%">
<tr>
    <td align="left"><b>Edit</b></td>
    <td align="left"><b>Delete</b></td>
    <td align="left"><b>Last Name</b></td>
    <td align="left"><b>First Name</b></td>
    <td align="left"><b>Date Registration</b></td>
</tr>
';

$bg = '#eeeeee';

while($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) {
    $bg = ($bg=='#eeeeee' ? '#ffffff' : '#eeeeee'); // $bg가 #eeeeee 이면 #ffffff를 할당하고, #ffffff이면 #eeeeee를 할당하여 테이블 행의 색을 구분하여 출력한다
    echo '<tr bgcolor="' . $bg . '">
        <td align="left"><a href="edit_user.php?id=' . $row['user_id'] . '">Edit</a></td>
        <td align="left"><a href="delete_user.php?id=' . $row['user_id'] . '">Delete</a></td>
        <td align="left">' . $row['last_name'] . '</td>
        <td align="left">' . $row['first_name'] . '</td>
        <td align="left">' . $row['dr'] . '</td>
    </tr>
    ';
}

echo '</table>';

mysqli_free_result ($r);
mysqli_close($dbc);

// 페이지 수를 출력하는 part
if ($pages > 1) {
    echo '<br /><p>';
    $current_page = ($start/$display) + 1; // 페이지 첫 로딩시, $start = 0 이므로 $current_page=1이 된다

    if($current_page != 1) {
        echo '<a href="view_users.php?s=' . ($start - $display) . '&p=' . $pages . '">Previous</a> ';
        // $current_page 가 1이 아닐 경우, s의 값은 10의 배수가 된다
             3번째 page에 있을 경우, $start = 20, $display = 10 이므로 s의 값은 10이 되고 s는 10이 되어 이전 페이지의 $start값을 가르킨다
    }

    for ($i = 1; $i <= $pages; $i++) {
        if($i != $current_page) {
            echo '<a href="view_users.php?s=' . (($display * ($i - 1))) . '&p=' . $pages . '">' . $i . '</a> ';
          // 현재 보고 있는 페이지가 아닌 경우에만 링크를 건다

        } else {
            echo $i . ' ';
        }
    }
    if ($current_page != $pages) {
        echo '<a href="view_users.php?s=' . ($start + $display) . '&p=' . $pages . '">Next</a>';
    }
}

include ('includes/footer.html');
?>




#Error Comment

페이지 수와 링크를 출력하는 파트의 소스는 이해가 어려운 부분이다.
정확하게 말하자면, 본인이 직접 생각해서 만든 소스가 아니기때문이며
설사 본인이 만든 코드라 할지라도 시간이 흐른 뒤에 본다면 역시나 이해하기 힘들 것이다.
그럼에도 그냥 넘어가고자 하는 이유는, 기법이나 문법상에서 특별한 기법이 있는 것이 아니라
단지 정확한 링크를 위해 만든 연산일 뿐이므로 크게 신경쓰지 않고 넘어가는 것이 좋겠다.

알아둬야할 부분은 페이지 링크를 전달하는 기법이다.
GET 타입 method처럼 쓰기위해 링크를 거는 부분을 다음과 같이 작성한다.

echo '<a href="view_users.php?s=' . ($start - $display) . '&p=' . $pages . '">Previous</a> ';

page_name.php?s=s_value&p=p_value

같은 페이지에서 폼 처리를 하므로 전달한 변수 s와 p를 쓰기위해 $_GET['s'], $_GET['p']를 사용한다.
GET 타입 method는 링크과정이 유저에게 직접 보여지므로 보안성에 문제가 있을 수 있으나,
위 예제와 같이 page 링크는 보안성보다는 편리성에 촛점을 맞춘 기법이라 볼 수 있다.
왜냐하면, 유저가 원하는 페이지를 즐겨찾기를 통해 바로 접속하도록 할 수 있으며, 새로고침을 통한
refresh 또한 가능하기 때문이다.


Posted by CloudySky
|