목록리스트와 페이징 2 - 검색

2022. 2. 14. 10:25Study/PHP&MySQL

게시판에서 아이디, 이름, 주소로 검색이 가능하고

페이징기능, 검색된 리스트의 갯수 수정 등이 가능하다.

 

point
검색을 하면 get방식으로 mode=search를 넘겨준다. (form action)
mode=search일 때 $sql 문이 달라지게 if문을 설정한다.

 

사용되는 변수

레코드 총 개수 $total_record = mysql_num_rows($result);     // 35
한 페이지 내 리스트 개수 $scale = 10
리스트 총 번호 $total_page = floor($total_record/$scale);     // 4
리스트 일련번호 $number = 1
페이지번호 $page = 1
레코드 인덱스 번호 $start = ($page - 1) * $scale     // 10
일련 시작번호 $number = $total_record - $start     // 25

 

검색관련

  • method = post (GET)
  • action = list2.php?mode=search (POST)
  • $find = id / name / address (select) (POST)
  • $search = input value (검색어) (POST)

 

페이지 번호 별 변수 값

$page = 1; 페이지번호 $page = 1
레코드 인덱스 시작번호 $start = 0
일련시작번호 $number = 35
$page = 2; 페이지번호 $page = 2
레코드 인덱스 시작번호 $start = 10
일련시작번호 $number = 25
$page = 3; 페이지번호 $page = 3
레코드 인덱스 시작번호 $start = 20
일련시작번호 $number = 15
$page = 4; 페이지번호 $page = 4
레코드 인덱스 시작번호 $start = 30
일련시작번호 $number = 5

 

 

membership.sql

  create table membership (
  id  varchar(10) not null,
  name varchar(10) not null,
  post_num char(8),
  address varchar(80),
  tel varchar(20),
  age int,
  primary key(id)
  );
  
insert into membership values ('yjhwang', '황영주', '100-011', '서울시 중구 충무로1가', '234-8879', 35);
insert into membership values ('khshul', '설기형', '607-010', '부산시 동래구 명륜동', '764-3784', 33);
insert into membership values ('chpark', '박철호', '503-200', '광주시 남구 지석동', '298-9730', 34);
insert into membership values ('shlee', '이상훈', '503-201', '광주시 남구 도금동', '838-4347', 32);
insert into membership values ('jyjang', '장영숙', '606-065', '부산시 영도구 봉래동5가', '399-9809', 24);
insert into membership values ('yjbae', '배용진', '122-014', '서울시 은평구 응암4동', '857-5683', 30);
insert into membership values ('hbpark', '박혜빈', '427-760', '경기도 과천시 중앙동', '234-7677', 22);
insert into membership values ('mskim', '김문수', '429-020', '경기도 시흥시 신천동', '370-6003', 63);
insert into membership values ('bkcha', '차범길', '302-121', '대전시 서구 둔산1동', '432-9877', 49);
insert into membership values ('kskim', '김길수', '440-747', '경기도 수원시 장안구 파장동', '324-5875', 54); 
insert into membership values ('srkim', '김수련', '704-701', '대구시 달서구 신당동', '987-3688', 23);	
insert into membership values ('sunglee', '이성현', '441-081', '경기도 수원시 권선구 매산로1가', '243-6844', 36);
insert into membership values ('hnjang', '정한나','502-763', '광주시 서구 화정4동', '845-4547', 58);
insert into membership values ('mylee', '이명연', '502-791', '광주시 서구 쌍촌동', '837-9432', 33);
insert into membership values ('yskim', '김영숙', '429-010', '경기도 시흥시 대야동', '374-8438', 53);
insert into membership values ('jekim', '김정은', '503-202', '광주시 남구 원산동', '347-8873', 29);
insert into membership values ('yjko', '고영주', '122-020', '서울시 은평구 녹번동', '479-3874', 32);
insert into membership values ('cyahn', '안철영', '122-030', '서울시 은평구 대조동', '347-4687', 34);
insert into membership values ('jmkim', '김진모', '530-140', '전라남도 목포시 항동', '379-8349', 28);	
insert into membership values ('ycshul', '설영찬', '606-070', '부산시 영도구 청학동', '983-8748', 41);
insert into membership values ('jjko', '고재진', '100-013', '서울시 중구 충무로3가', '836-4655', 28);
insert into membership values ('hwlee', '이현우', '606-071', '부산시 영도구 청학1동', '346-8892', 32);
insert into membership values ('cskang', '강찬숙', '668-890', '경상남도 남해군 설천면', '377-6879', 21);
insert into membership values ('ypji', '지영필', '122-040', '서울시 은평구 불광동',  '366-3747', 52); 
insert into membership values ('jbkim', '김진배', '427-600', '경기도 과천시 과천동', '382-4993', 47); 
insert into membership values ('jepark', '박지은', '670-800', '경상남도 거창군 거창읍', '328-8743', 26);	
insert into membership values ('jhlee', '이지현', '704-702', '대구시 달서구 월성동', '386-7988', 27);	
insert into membership values ('bykang', '강부영', '302-120', '대전시 서구 둔산동', '798-3243', 62);
insert into membership values ('jymoon', '문진영', '302-122', '대전시 서구 둔산2동', '987-3248', 18);
insert into membership values ('jyjun', '전지연', '100-012' , '서울시 중구 충무로2가', '347-2236', 28);
insert into membership values ('jkko', '고진길', '122-013', '서울시 은평구 응암3동', '234-7466', 27);
insert into membership values ('myjung', '정명윤', '502-771', '광주시 서구 치평동', '374-8786', 47);
insert into membership values ('jsyou', '유지수', '502-772', '광주시 서구 치평동', '309-3897', 49);
insert into membership values ('dsshin', '신달성', '530-145', '전라남도 신안군 장산면', '399-8789', 53);
insert into membership values ('sjshin', '신수진', '606-796', '부산시 영도구 봉래동5가', '389-8930', 47);

 

 

list2.php

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{margin:0; padding:0}
        body{padding:50px;}
        #list_search1{margin:20px}
        table{ border-collapse:collapse; width:700px;}
        th{ background:#FC0; border:1px solid #ccc; padding:3px}
        td{ border:1px solid #ccc; padding:3px}
    </style>
    <?
        @extract($_POST);
        @extract($_GET);

        // $page = $_GET["page"];

        /*
        검색을 통한 리스트 출력
        $mode = search  (get)        $_GET["mode"]
        $find = address (post)      $_POST["find"]
        $search = 부산  (post)        $_POST["search"]
        */

        $connect = mysql_connect("localhost","song","1234");    // song 계정으로 접속
        $db_con = mysql_select_db("song_db", $connect);         // song_db 데이터베이스 선택


        if ($mode=="search"){   //검색모드
        
            if(!$search){       //검색값이 입력되지 않았을때. 경고창 띄우고 이전화면으로 돌아간다.
                echo("
                    <script>
                        window.alert('검색할 단어를 입력해 주세요!');
                        history.go(-1);
                    </script>
                ");
                exit;
            }

            //검색 form에서 $find(select), $search(input.value)가 넘어온다.
            $sql = "select * from membership where $find like '%$search%'";

        }else{     // 글 목록보기 모드 (검색이 아닌 일반 글 목록보기)
            $sql = "select * from membership";            // sql 명령어 저장
        }


        $result = mysql_query($sql,$connect);        // sql 명령어 실행
        $total_record = mysql_num_rows($result); // 전체 글 수 저장


        if (!$scale){   
            $scale = 10; // 한 화면에 표시되는 글 수, scale값이 없으면 10
        }
        $number = 1;    //일련번호를 나타내는 변수 1로 초기화


        // 전체 페이지 수($total_page) 계산 
        if ($total_record % $scale == 0){     //10의 배수
            $total_page = floor($total_record/$scale);     // 30개의총레코드/10개씩 출력 (3페이지)     
        }else{
            $total_page = floor($total_record/$scale) + 1;   // 35/10=3    3+1  (4페이지)
        }


        if (!$page){    // 페이지번호($page)가 0 일 때
            $page = 1;              
            // 게시글이 10보다작다면 페이지번호를 나타내는 변수$page 가 0이다. 페이지 번호를 1로 초기화
        }

        // 표시할 페이지($page)에 따라 $start 계산  
        $start = ($page - 1) * $scale;  //해당 페이지의 시작 페코드 번호를 나타내는 변수 $start 를 설정

        $number = $total_record - $start; //글번호를 의미하는 변수 $number를 구한다.

        // 전체 글수가 35개이고 한페이지에 10개씩 출력되면 첫번째 페이지에는 글번호 35~26이
        // 두번째 페이지에는 25~16, 세번째 페이지에는 15~6, 네번째 페이지에는 5~1 이 표시된다.
    ?>
</head>
<body>
    <form  name="board_form" method="post" action="list2.php?mode=search"> 
        <div id="list_search1">
            ▷ 총 <?= $total_record ?> 개의 게시물이 있습니다.  
            <select name="find">
                <option value='id'>아이디</option>
                <option value='name'>이름</option>
                <option value='address'>주소</option>
            </select>
            <input type="text" name="search">
            <input type="submit" value="검색">
        </div>
    </form>

    <div>
        <select name="scale" onchange="location.href='list2.php?scale='+this.value">
            <option value=''>리스트보기 : <?=$scale?></option>
            <option value='5'>5</option>
            <option value='10'>10</option>
            <option value='20'>20</option>
            <option value='25'>25</option>
        </select>
    </div>

    <table>
        <thead>
            <tr>
                <th scope="col">일련번호</th>
                <th scope="col">아이디</th>
                <th scope="col">이름</th>
                <th scope="col">우편번호</th>
                <th scope="col">주소</th>
                <th scope="col">전화번호</th>
                <th scope="col">나이</th>
            </tr>
        </thead>
        <tbody>
            <?  
                for ($i=$start; $i<$start+$scale && $i < $total_record; $i++){ 
                // $start=>0이면  for ($i=0; $i<10 && $i < 35; $i++)   
                // 현재 페이지에 해당하는 글 목록을 출력한다                  
                
                    mysql_data_seek($result, $i);         // 가져올 레코드로 위치(포인터) 이동  
                    $row = mysql_fetch_array($result);       // 하나의 레코드 가져오기


                    $item_id  = $row[id];
                    $item_name = $row[name];
                    $item_post   =  $row[post_num];
                    $item_address  = $row[address];
                    $item_tel  = $row[tel];
                    $item_age   = $row[age];
            ?>

            <tr>
                <td><?= $number ?></td>
                <td><?= $item_id ?></td>
                <td><?= $item_name ?></td>
                <td><?= $item_post ?></td>
                <td><?= $item_address ?></td>
                <td><?= $item_tel ?></td>
                <td><?= $item_age ?></td>
            </tr>

            <?
                    $number--;   // 글번호 값을 1씩 감소..
                }
            ?>
        </tbody>
        <tfoot>
            <tr>
                <td colspan="7" style="text-align:center">
                    ◀ 이전
                    <?
                        // 게시판 목록 하단에 페이지 링크 번호 출력
                        for ($i=1; $i<=$total_page; $i++){
                        
                            if ($page == $i){     // 현재 페이지 번호 링크 안함
                            
                                echo "<b> $i </b>";
                            }else{ 
                                echo "<a href='list2.php?page=$i&scale=$scale'> $i </a>";  
                            //나머지페이지는 해당 페이지 번호로 링크를 연결
                            }      
                        }

                        mysql_close();   // 데이터베이스 접속 종료
                    ?>
                    다음 ▶
                </td>
            </tr>
        </tfoot>
    </table>

</body>
</html>

 

 

 

 

'Study > PHP&MySQL' 카테고리의 다른 글

MySQL 데이터 타입 (자료형) 유형  (0) 2022.02.14
성적처리 프로그램 작성  (0) 2022.02.14
목록리스트와 페이징 1  (0) 2022.02.11
공지사항 및 최근게시물  (0) 2022.02.11
PHP API 함수를 이용해 데이터 읽기  (0) 2022.02.11