반응형


| header('Content-Type: text/html; charset=utf-8'); // 화면에 글자가 안 깨지게 한국어 설정을 해 require('conn.php'); // 데이터가 들어있는 DB 창고와 연결하는 도구(conn.php)를 가져와 $sql = "SELECT sno, sname, sex, major, syear, TO_CHAR(avr, '0.00') AS avr FROM student ORDER BY sno ASC"; // 학생 테이블에서 학번, 이름, 성별, 학과, 학년, 평점을 가져오되 평점은 소수점 둘째 자리까지 보여줘 $result = oci_parse($conn, $sql); // 작성한 명령서를 DB 컴퓨터가 읽을 수 있게 전달 oci_execute($result); // 전달된 명령서를 실제로 실행해서 데이터를 찾아와 $row_num = oci_fetch_all($result, $row); // 찾아온 데이터가 총 몇 줄인지 세어서 $row_num에 저장하고, 실제 데이터는 $row라는 큰 바구니에 다 담아 oci_free_statement($result); // 실행된 SQL 명령어가 점유하고 있던 서버의 메모리 자원을 해제해 oci_close($conn); // PHP와 Oracle 데이터베이스 간에 수립된 네트워크 연결을 공식적으로 종료해 $scale = 5; // 화면 한 장에 보여줄 줄 개수를 5개로 정해 $start = isset($_GET['start']) ? $_GET['start'] : 0; // 주소창(URL) 파라미터 중 start라는 이름의 값이 존재하는지 확인하여, 값이 있으면 해당 숫자 값을 $start 변수에 대입하고 값이 없으면 초기값인 0을 대입하여 데이터 출력의 시작 위치 인덱스를 결정하는 명령어 echo "<p style='text-align:center;'>전체 학생 수는 $row_num 명입니다.</p>"; // 변수 $row_num에 저장된 전체 데이터의 총 개수를 화면 정중앙에 출력하는 명령 echo "<table border='1' style='margin:0 auto; width:80%; text-align:center; border-collapse:collapse;'>"; // 두께 1인 선을 가지고 전체 폭의 80% 크기를 가진 표(table)의 틀을 생성하는 명령 echo "<tr bgcolor='#f2f2f2'> <th>학번</th><th>이름</th><th>성별</th><th>학과</th><th>학년</th><th>평점</th> </tr>"; // 3. 페이징 범위만큼 반복 출력 for($i = $start; $i < ($start + $scale); $i++) { ---> 시작점은 같지만($i = $start;) 끝점 ($start + $scale);은 달라야한다 *** 반복문 시작: $i를 시작 번호($start)로 설정하고, 시작 번호에 출력 개수를 더한 값($start + $scale) 직전까지 1씩 키우며 실행함 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 1. $i = ($start + $scale) 일때 오류 scale 개수는 5개 이다.즉 출력이 5개 되어야한다. 그런데 $i = ($start + $scale); 가 되어버리면 5 = 5 (참) 인게 되어 0,1,2,3,4,5,6 6개를 출력해버린다. 그래서 " = " 을 사용해선 안된다 시작: $i = 0 으로 출발 가운데 조건문 도착: i=5라는 명령을 만남 강제 대입: $i가 0이었는데 갑자기 5로 바뀜 판단: 숫자 5는 존재하니까 이 조건은 무조건 참이야라고 ㅍ마정함 결과: 무한실행(= 무한 루프에 빠지게 된다) ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 2. $i > ($start + $scale) 일때 오류 시작: $i = 0 검사: 0이 5보다 큰가? ---> 0>5 --> 결과는 거짓 행동: 반복문을 즉시 종료하고 </table> 태그로 건너뜀 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ *** $i: 현재 몇 번째 줄 데이터를 꺼내고 있는지 가리키는 '순서 번호' if($i < $row_num) { *** 현재 번호($i)가 실제 전체 데이터 개수($row_num)보다 작을 때만 실행하여 없는 번호 참조 에러를 방지함 데이터가 만약 3개더라도 컴퓨터는 0번 부터 번호를 붙이기 때문이다 echo "<tr> <td>{$row['SNO'][$i]}</td> // $row 배열의 $i번째 인덱스에서 학번 데이터를 꺼내 표의 칸에 출력함 <td>{$row['SNAME'][$i]}</td> <td>{$row['SEX'][$i]}</td> <td>{$row['MAJOR'][$i]}</td> <td>{$row['SYEAR'][$i]}</td> <td>{$row['AVR'][$i]}</td> </tr>"; } } echo "</table>"; // 이전/다음 페이지 이동 링크 echo "<div style='text-align:center; margin-top:20px;'>"; $p = $start - $scale; // 현재 시작 번호에서 페이지당 개수를 빼서 '이전 페이지'가 시작될 번호를 계산하여 $p에 저장함 $n = $start + $scale; // 현재 시작 번호에서 페이지당 개수를 더해서 '다음 페이지'가 시작될 번호를 계산하여 $n에 저장함 // [이전페이지] 링크 처리 --- 이전 버튼을 누른다는 것으로 생각 if($p >= 0) { // 계산된 이전 번호($p)가 0보다 크거나 같으면(즉, 이전 페이지가 존재하면) 클릭 시 start=$p 값을 주소창에 전달하는 링크를 만듦 * 만약 $p 값이 -10 이라면 예시로 $p가 -10일 때 (첫 페이지에서 '이전'을 눌렀을 때) -10 > = 0 은 거짓이 되므로 뒤로 가기 버튼이 안보이게 된다 (이 부등호의 핵심은 마이너스(-) 값이 나오면 안되기 때문이다 ---> 마이너스 번호를 막아주는 것(인덱스는 0부터 있고 마이너스 인덱스는 없다) echo "<a href='{$_SERVER['PHP_SELF']}?start=$p'>[이전페이지]</a> "; } else { echo "이전페이지 "; // 이전 번호가 0보다 작으면(첫 페이지면) 링크 기능 없이 '이전페이지' 글자만 출력함 } // [다음페이지] 링크 처리 --- 다음 버튼을 누른 다는 것으로 생각 if($n < $row_num) { // 계산된 다음 번호($n)가 전체 데이터 개수($row_num)보다 작으면 클릭 시 start=$n 값을 주소창에 전달하는 링크를 만듦 * $n: 다음 페이지 시작번호 보다 이 게시판의 전체 글의 총 개수가 커야 한다 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 1. $n < $row_num 의 기호 의미 $row_num: 데이터베이스에서 가져온 전체 행(Row)의 개수 (예: 25개) $n: 다음 페이지를 눌렀을 때 시작할 데이터의 번호 (예: 31번) 2. 왜 $row_num 쪽으로 입을 벌리고 있는가? 컴퓨터는 1번부터 25번까지만 데이터가 들어있는 통에서 31번 데이터를 가져오라고 하면 에러를 낸다 성공 케이스 ($21 < 25$): 다음에 시작할 번호(21)가 전체 개수(25)보다 작다 결과: 참(True) $\rightarrow$ 아직 읽을 데이터가 안에 남아있으니 다음 페이지 버튼을 보여준다 실패 케이스 ($31 < 25$): 다음에 시작할 번호(31)가 전체 개수(25)보다 커져 버렸습니다. (부등호가 틀림) 결과: 거짓(False) $\rightarrow$ 전체 개수를 넘어서는 데이터는 존재하지 않으므로 다음 페이지 버튼을 숨긴다 $n (내가 가려는 곳) 이 $row_num (실제 데이터가 있는 끝지점) 보다 작아야만 (<) 그곳에 데이터가 살고 있기 때문에 부등호를 저 방향으로 쓰는 것이다. 만약 $n이 더 커지는 순간, 그곳은 데이터가 없는 빈 공간이 된다 echo "<a href='{$_SERVER['PHP_SELF']}?start=$n'>[다음페이지]</a>"; } else { echo "다음페이지"; // 다음 번호가 전체 개수와 같거나 크면(마지막 페이지면) 링크 기능 없이 '다음페이지' 글자만 출력함 } $p = 이전 페이지가 시작될 번호 $n = 다음 페이지가 시작될 번호 echo "</div>"; echo "<hr>"; show_source(__FILE__); ?> |
| $scale (출력 개수) 한 화면에 보여줄 줄(row)의 개수 ex. 5개씩 끊어서 보자 라고 약속한 숫자 $start (시작점) 현재 화면에서 가장 먼저 보여줄 데이터의 번호(인덱스) ex. 데이터가 0번부터 99번까지 줄 서있을때, 지금 몇번부터 보여줄까 를 정하는 숫자 $start + $scale (스타트 + 스케일) 왜 더하는가? - 멈추는 지점 반복문이 **어디서 멈춰야 할지(끝 지점)**를 정하기 위해서 for 반복문은 **"어디서 시작해서 어디서 끝낼지"**를 적어야 한다. 5개를 보여주려면 시작 번호에 5를 더한 숫자 직전에서 멈춰야 딱 5개가 된다 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 1페이지를 볼 때(start=0) 시작:0 끝: 0+5=5 결과: 0,1,2,3,4 번호만 화면에 나옴(정확히 5개) ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 2페이지를 볼 때(start=5) 시작:5 끝: 5+5=10 결과: 5,6,7,8,9 번호만 화면에 나옴(정확히 5개) ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 3페이지를 볼 때(start=5) 시작:10 끝: 10+5=15 결과: 10,11,12,13,14 번호만 화면에 나옴(정확히 5개) ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ |
| 참고사항 데이터 초과 방지: if($i < $row_num) 마지막 페이지에 데이터가 2개밖에 없는데 5개를 읽으라고 하면 에러가 납니다. 이를 방지하기 위해 "전체 개수까지만 읽어라"라는 제한을 둔다 마이너스 인덱스 방지: if($p >= 0) 첫 페이지에서 '이전'을 버튼 링크를 없애서 -5번 데이터를 찾는 사고를 막는다 마지막 페이지 제한: if($n < $row_num) 더 이상 보여줄 데이터가 없으면 '다음' 버튼의 링크를 없애버린다 |
'Infra & Security Eng > Database Engineering' 카테고리의 다른 글
| ERwin 차량운행일지 정규화 3단계 실습_0327_1 (0) | 2026.03.27 |
|---|---|
| 오라클 클라이언트(Client), 아파치(Apache), PHP, 삼바(Samba) 서버 설치, 설정, 연동까지 완벽 가이드 (0) | 2026.03.27 |
| 모델링(판매전표 정규화 3단계 과정 실습, 각 단계별 해석과 개념설명) 실습_0326_2 (0) | 2026.03.26 |
| [모델링] 관계 실습_0326_1 (0) | 2026.03.26 |
| 인사기록카드 비정규화 - 정규화 과정 실습 (1단계까지 완료) (0) | 2026.03.25 |