본문 바로가기

개발과제/보안추가

[노말틱 모의 해킹 취업반 추가 개발과제 ] PreparedStatement 적용하기 -2

안녕하세요 전에 하던 거 이어서 PreparedStatement를 계속 적용하겠습니다.

 

-inquiry_board.php

 

board.php와 거의 똑같게 복사붙이 기하겠습니다.

 

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Welcome!</title>
    </head>
    <body>
        <h1>INQUIRY_MENU</h1>
        <?php

            include 'DB_INFO.php'; //데이터 베이스 정보

            //데이터베이스 연결
            $conn = mysqli_connect($host,$username,$password,$db_inquiry);

            //데이터베이스 오류시 종료
            if(mysqli_connect_errno()) {
                die("데이터 베이스 오류: ". mysqli_connect_error());
            }

            session_start(); //세션 시작
        ?>

        <form method ="GET" action="inquiry_board.php">
            <input type = "text" name="search" value="<?php echo filter_var(strip_tags($_GET['search']),FILTER_SANITIZE_SPECIAL_CHARS);?>" placeholder="검색" >
            <input type="submit" value="검색">
            <select name="sort" onchange="this.form.submit()">
                <option value="">정렬 방식 선택</option>
                <option value="date" <?php if(filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS)=='date'){echo ' selected';} ?> >날짜순</option>
                <option value="author" <?php if(filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS)=='author'){echo ' selected';} ?> >작성자순</option>
            </select>          
            <label for="date">날짜 선택:</label>
            <input type="date" id="date_value" name="date_value" value="<?php echo isset($_GET['date_value']) ? $_GET['date_value'] : ''; ?>">
        </form>

        <p>
        <?php 
            //한 페이지에 보여줄 게시물 수
            $num_per_page = 5;

            //현재 페이지 번호
            if(isset($_GET['page'])) {
                $page = mysqli_real_escape_string($conn,filter_var(strip_tags(intval($_GET['page'])),FILTER_SANITIZE_SPECIAL_CHARS));
            } else {
                $page = 1;
            }
            
            //검색이 입력된 경우
            if(isset($_GET['search'])) {
                $search = filter_var(strip_tags($_GET['search']),FILTER_SANITIZE_SPECIAL_CHARS);

                if(isset($_GET['date_value']) && strtotime($_GET['date_value'])) {
                    //날짜 선택한 경우, strtotime() 이용해 유효한 값인지 확인
                    $date_value = filter_var(strip_tags($_GET['date_value']),FILTER_SANITIZE_SPECIAL_CHARS);
                    $date_value = DateTime::createFromFormat('Y-m-d', $date_value)->format('Y-m-d'); //날짜 값으로 다시 바꾼다
                }
                else {
                    //날짜가 선택이 안된 경우
                    $date_value = '';
                }
            } else {
                //검색이 입력되지 않은 경우
                $search = '';
                $date_value = '';
            }
            
            //각 %을 붙여서 포함 된 문자열을 찾을 수 있게 한다
            $search_value = '%'.$search.'%';
            $date_value_value = '%'.$date_value.'%';

            $sql = "SELECT * FROM $db_inquiry WHERE title LIKE ? AND date_value LIKE ? ";
            $total_sql = "SELECT count(*) AS cnt FROM $db_inquiry WHERE title LIKE ? AND date_value LIKE ? ";

            $stmt2 = mysqli_stmt_init($conn); //preparedstatement 초기화 

            //total_sql문 preparedStatement 적용
            $stmt2 = mysqli_prepare($conn, $total_sql);
            mysqli_stmt_bind_param($stmt2, 'ss', $search_value , $date_value_value); //s는 string, i는 정수형을 뜻한다
            mysqli_stmt_execute($stmt2); //실행
            $total_result = mysqli_stmt_get_result($stmt2);
            $total_row = mysqli_fetch_assoc($total_result); //결과를 배열로 가져온다
            $total_posts = $total_row['cnt']; //배열 중 cnt의 값을 가져온다

            //전체 페이지 수
            $total_pages = ceil($total_posts / $num_per_page);

            //각 페이지 시작 인덱스
            $start = ($page - 1) * $num_per_page;

            //정렬해주는 조건문
            if (isset($_GET['sort'])) {
                $sort = mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS));
                if ($sort == 'date') {
                    //날짜순
                    $sql .= " ORDER BY date_value DESC";
                } else if ($sort == 'author') {
                    //작성자순
                    $sql .= " ORDER BY id DESC";
                }
            } 
            
            $sql .= " LIMIT $start, $num_per_page"; //최대 5개씩 호출

            $stmt = mysqli_stmt_init($conn); //preparedstatement 초기화 

            //쿼리문 실행 preparedstatement 적용
            $stmt = mysqli_prepare($conn,$sql);
            mysqli_stmt_bind_param($stmt, 'ss',  $search_value , $date_value_value); //s는 string, i는 정수형을 뜻한다
            mysqli_stmt_execute($stmt);
            $result = mysqli_stmt_get_result($stmt);

            if(mysqli_num_rows($result) > 0) {
                //게시물 출력
                while($row = mysqli_fetch_assoc($result)) {
                    $index = $row['board_id'];
                    $id = $row['user_id'];
                    $title = $row['title'];
                    echo '<p><a href="view_inquiry_board.php?index='.$index.'">'.$title.'</a> : '.$id.'작성함</p>';
                }
            } else {
                echo "게시물이 없습니다!";
            }
            
            echo '<p> [ ';
            
            // 현재 페이지를 10으로 나눈 몫에 10을 곱한 값에서 1을 빼면
            // 현재 페이지가 몇 번째 페이지 블록에 있는지 알 수 있습니다.
            $block_start = floor(($page-1)/10)*10;

            if ($block_start > 1) {
                // 이전 페이지 블록이 있다면, 다음 버튼을 출력합니다.
                $next_block_start = $block_start - 10;
                if($next_block_start == 0) {
                    $next_block_start += 1; //0페이지는 존재 하지 않기에 1더한다
                }
                echo '<a href="?page=' . $next_block_start .'"><< </a>';
            }

            // 이전 버튼 출력
            if ($page > 1) {
                echo '<a href="?page=' . ($page-1) .'">< </a> ';
            }
            
            // 페이지 링크 출력
            for ($i = $block_start+1; $i <= min($block_start+10, $total_pages); $i++) {
                if($i == $page) {
                    echo '<strong>'.$i.' </strong>';
                } else {
                    echo '<a href="?page=' . $i .'">'.$i. '</a> ';
                }
                echo ' ';
            }

            // 다음 버튼 출력
            if ($page < $total_pages) {
                echo '<a href="?page=' . ($page+1) .'">> </a> ';
            }
            
            if ($block_start+10 < $total_pages) {
                // 다음 페이지 블록이 있다면, 다음 버튼을 출력합니다.
                $next_block_start = $block_start + 11;
                echo '<a href="?page=' . $next_block_start .'">>></a>';
            }

            echo ' ]</p>';
            

            mysqli_stmt_close($stmt); //preparedstatement 종료
            mysqli_stmt_close($stmt2);
        ?>
        </p>
        <p></p>
        <form action="inquiry_write_board.php" method="POST"> 
            <p><input type="submit" name="write" value="게시판 작성"></p>
        </form>
        <form action="login.php">
            <p><input type="submit" value="로그인페이지로"></p>
        </form>
        <form action="board.php" method="GET"> 
            <p><input type="submit" value="검색 초기화"></p>
            <input type="hidden" name="search" value="">
            <input type="hidden" name="sort" value="">
            <input type="hidden" name="date_value" value="">
        </form>
    </body>
</html>

 

 

 

-inquiry_delete_board.php

 

<?php
    include 'DB_INFO.php'; //데이터 베이스 정보

    session_start(); //세션 시작
    
    //게시판 데이터베이스 연결
    $conn = mysqli_connect($host,$username,$password, $db_inquiry);
    
    //데이터베이스 오류시 종료
    if(mysqli_connect_errno()) {
        die("데이터 베이스 오류: ". mysqli_connect_error());
    }

    //POST로 전달된 정보 받기
    $board_id = filter_var(strip_tags($_GET['board_id']),FILTER_SANITIZE_SPECIAL_CHARS);
    
    //삭제용 sql문 작성
    $sql = "DELETE FROM $db_inquiry WHERE board_id= ? ";

    //비밀번호 조회용 sql문 작성
    $sql_pw = "SELECT pw FROM $db_inquiry WHERE board_id= ? ";


    $stmt = mysqli_prepare($conn,$sql); //삭제용sql
    $stmt2 = mysqli_prepare($conn,$sql_pw); //비밀번호sql

    mysqli_stmt_bind_param($stmt , 'i' , $board_id);
    mysqli_stmt_bind_param($stmt2, 'i' , $board_id);

    mysqli_stmt_execute($stmt2); //비밀번호부터 실행
    //실행(비밀번호)
    $result = mysqli_stmt_get_result($stmt2);

    //결과값 가져오기
    $row = mysqli_fetch_assoc($result);

    if(isset($_POST['pw'])) {
        //비밀번호 값을 가져온다
        $hashed_pw = $row['pw'];

        if(password_verify($_POST['pw'],$hashed_pw)) {
            //실행
            if(mysqli_stmt_execute($stmt)) {
                //실행 후 게시판으로 이동
                header("Location: inquiry_board.php");
            } else {
                //오류 발생 시 메시지 호출
                $_SESSION['write_error'] = '삭제하는데 실패했습니다! 조금 있다 하십시오';
                header("Location: view_inquiry_board.php");
            }

        } else {
            //비밀번호 틀린경우
            $_SESSION['write_error'] = '비밀번호가 틀립니다!';
            header("Location: view_inquiry_board?index=$board_id");
        }
    } else {
        echo "<form method='POST' action='inquiry_delete_board.php?board_id=$board_id'>
                <input type='password' name='pw' value=''>
                <p><button type='submit'>인증하기</button></p>
             </form>";
    }
    mysqli_stmt_close($stmt); //preparedstatement 종료
    mysqli_stmt_close($stmt2);
    exit();
?>

 

 

 

 

-inquiry_fix_process_board.php

 

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>게시판 수정 중</title>
    </head>
    <body>

        <?php 
            include 'DB_INFO.php'; //데이터 베이스 정보

            session_start();

            //데이터베이스 연결
            $conn = mysqli_connect($host,$username,$password,$db_inquiry);

            //데이터베이스 오류시 종료
            if(mysqli_connect_errno()) {
                die("데이터 베이스 오류: ". mysqli_connect_error());
            }

            //GET방식으로 board_id 받기
            $board_id = filter_var(strip_tags($_GET['board_id']),FILTER_SANITIZE_SPECIAL_CHARS);


            //작성된 게시물들 조회 문
            $sql = "SELECT * FROM $db_inquiry WHERE board_id = ? ";

            $stmt = mysqli_prepare($conn,$sql);

            mysqli_stmt_bind_param($stmt, 'i' , $board_id);

            mysqli_stmt_execute($stmt);

            //결과값 옮기기
            $result = mysqli_stmt_get_result($stmt);

            //결과값 가져오기
            $row = mysqli_fetch_assoc($result);

            
            if(isset($_POST['pw'])) {
                //비밀번호 값을 가져온다
                $hashed_pw = $row['pw'];

                if(password_verify($_POST['pw'],$hashed_pw)) {
                    //비밀번호가 맞으면
                    echo "<form action='inquiry_write_process_board.php' method='POST'>
                            <p><input type='text' name='user_id' maxlength='44' value='".$row['user_id']."' placeholder='작성자이름'></p>
                            <p><input type='text' name='title' maxlength='44' value='".$row['title']."' placeholder='제목 입력, 최대 44자까지 가능합니다'></p>
                            <p><textarea name='detail' rows='20' cols='20' maxlength='254' placeholder='내용 작성,최대 254자 가능합니다'>".$row['detail']."</textarea></p>
                            <p><input type='submit' value='수정하기'></p>
                            <input type='hidden' name='board_id' value='".$row['board_id']."'>
                        </form>";


                } else {    
                    //비밀번호 틀린경우
                    $_SESSION['write_error'] = '비밀번호가 틀립니다!';
                    
                    header("Location: view_inquiry_board.php?index=".$board_id);
                    exit();
                }
            } else {
                echo "<form method='POST' action='inquiry_fix_process_board.php?board_id=$board_id'>
                    <input type='password' name='pw' value=''>
                    <p><button type='submit'>인증하기</button></p>
                  </form>";
            }
          
            mysqli_stmt_close($stmt); //preparedstatement 종료
        ?>

        <p>
        </p>
    </body>
</html>

 

 

-inquiry_write_board.php

없네요! 패스

 

 

-inquiry_write_process_board.php

 

<?php
    include 'DB_INFO.php'; //데이터 베이스 정보

    session_start(); //세션 시작

    //문의게시판 데이터베이스 연결
    $conn = mysqli_connect($host,$username,$password, $db_inquiry);

    //데이터베이스 오류시 종료
    if(mysqli_connect_errno()) {
        die("데이터 베이스 오류: ". mysqli_connect_error());
    }

    //POST로 전달된 정보 받기
    if(isset($_POST['board_id'])){ //수정시 받아온다
        $board_id = filter_var(strip_tags($_POST['board_id']),FILTER_SANITIZE_SPECIAL_CHARS);
    } else {
        $board_id = null;
    }
    $title = filter_var(strip_tags($_POST['title']),FILTER_SANITIZE_SPECIAL_CHARS);
    $detail = filter_var(strip_tags($_POST['detail']),FILTER_SANITIZE_SPECIAL_CHARS);

    //POST으로 유저 이름 받기
    $user_id = filter_var(strip_tags($_POST['user_id']),FILTER_SANITIZE_SPECIAL_CHARS);

    if(isset($_POST['pw'])){
        //비밀번호가 있으면 해싱
        $hashed_pw = password_hash($_POST['pw'], PASSWORD_DEFAULT);
    }

    if(isset($board_id)) {
        //board_id가 있다는 것은 수정을 의미
        $sql = "UPDATE $db_inquiry SET user_id= ?, title = ? , detail= ? WHERE board_id= ? ";
        $stmt = mysqli_prepare($conn,$sql);
        mysqli_stmt_bind_param($stmt, 'ssss', $user_id,$title,$detail,$board_id);
    }
    else {
        //board_id가 없으니 새로 만드는 sql문
        $sql = "INSERT INTO $db_inquiry (user_id, title, detail,pw) VALUES ( ?, ?, ?,'$hashed_pw')";
        $stmt = mysqli_prepare($conn,$sql);
        mysqli_stmt_bind_param($stmt, 'sss', $user_id,$title,$detail);
    }

    //sql문 실행
    if(mysqli_stmt_execute($stmt)) {
        //수정인 경우 바로 게시판 보이게 함
        if(isset($board_id)) {
            $_SESSION['write_error'] = '수정되었습니다!';
            header("Location: view_inquiry_board.php?index=$board_id");
        }
        else {
            $board_id = mysqli_insert_id($conn); // 새로 생성한 게시물의 id를 가져옴
            $_SESSION['write_error'] = '작성되었습니다!';
            header("Location: view_inquiry_board.php?index=$board_id");
        }
    } else {
        $_SESSION['write_error'] = '작성 중 오류가 발생하였습니다.';
        header("Location: view_inquiry_board.php");
    }

    mysqli_stmt_close($stmt);

    exit();
?>

 

 

 

-view_inquiry_board.php

 

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>문의게시물 보는중</title>
    </head>
    <body>
        <p>
        <?php 

            include 'DB_INFO.php'; //데이터 베이스 정보

            //데이터베이스 연결
            $conn = mysqli_connect($host,$username,$password,$db_inquiry);

            //데이터베이스 오류시 종료
            if(mysqli_connect_errno()) {
                die("데이터 베이스 오류: ". mysqli_connect_error());
            }

            //GET방식으로 전달된 index 받는다
            $board_id = filter_var(strip_tags($_GET['index']),FILTER_SANITIZE_SPECIAL_CHARS);

            //작성된 게시물들 조회 문
            $sql = "SELECT * FROM $db_inquiry WHERE board_id = ? ";

            $stmt = mysqli_prepare($conn,$sql);

            mysqli_stmt_bind_param($stmt, 'i', $board_id);

            mysqli_stmt_execute($stmt);

            //결과 가져오기
            $result = mysqli_stmt_get_result($stmt);
            
            //게시물 출력
            while($row = mysqli_fetch_assoc($result)) {
                echo '<p>ID: '.$row['user_id'].'</p>';
                echo '<p>Title: '.$row['title'].'</p>';
                echo '<p>Detail: '.$row['detail'].'</p>';
                echo '<p>Date: '.$row['date_value'].'</p>';

                //게시물 수정 버튼을 보여준다
                echo "<form method='GET' action='inquiry_fix_process_board.php'>
                        <input type='hidden' name='board_id' value='".$row['board_id']."'>
                        <p><button type='submit'>게시물 수정</button></p>
                      </form>";

                //게시물 삭제 버튼을 보여준다
                echo "<form method='GET' action='inquiry_delete_board.php'>
                        <input type='hidden' name='board_id' value='".$row['board_id']."'>
                        <p><button type='submit'>삭제</button></p>
                      </form>";          
            }

            mysqli_stmt_close($stmt);
        ?>
        </p>
        <p>
        <?php session_start();
                if (isset($_SESSION['write_error'])) {
                    echo $_SESSION['write_error'];
                    unset($_SESSION['write_error']);
                }
        ?>
        </p>
        <p></p>
        <form action="inquiry_board.php">
            <p><input type="submit" value="문의페이지로"></p>
        </form>
        <form action="login.php">
            <p><input type="submit" value="로그인페이지로"></p>
        </form>
    </body>
</html>

 

 

 

 

-join.php

없네요! 패스

 

-login.php

없네요! 패스

 

-like.php

 

<?php
    include 'DB_INFO.php'; //데이터 베이스 정보

    //데이터베이스 연결
    $conn = mysqli_connect($host,$username,$password,$dbname); //로그인
    $conn_for_board = mysqli_connect($host,$username,$password,$db_board); //게시판

   
    //데이터베이스 오류시 종료
    if(mysqli_connect_errno()) {
        die("데이터 베이스 오류: ". mysqli_connect_error());
    }

    session_start(); //세션 시작
    
    if(!isset($_SESSION['login_id'])) {
        //로그인하지 않은 사용자
        header("Location: login.php"); //login 화면으로 바꾼다
        exit(); //이 페이지를 바로 닫는다
    }

    //세션ID 저장
    $login_id = $_SESSION['login_id'];
    //POST 받은 id값 저장
    $board_id = filter_var(strip_tags($_POST['board_id']),FILTER_SANITIZE_SPECIAL_CHARS);

    //ID통해 좋아요 누른 게시물 조회
    $sql = "SELECT likes_board FROM LOGIN_INFO WHERE id = ? AND ( FIND_IN_SET( ? ,likes_board ) > 0 )";

    $stmt = mysqli_prepare($conn,$sql);
    mysqli_stmt_bind_param($stmt, 'ss' , $login_id, $board_id);
    mysqli_stmt_execute($stmt);
    //쿼리문 실행
    $result = mysqli_stmt_get_result($stmt);

    if(mysqli_num_rows($result) > 0) {
        //좋아요 누른 경우 취소하기
        $stmt2 = mysqli_prepare($conn, "UPDATE LOGIN_INFO SET likes_board = REPLACE(likes_board, ? , '') WHERE id = ? ");
        $stmt3 = mysqli_prepare($conn_for_board, "UPDATE BOARD_INFO SET like_value = like_value - 1 WHERE board_id = ? ");

        mysqli_stmt_bind_param($stmt2, 'ss', $board_id,$login_id);
        mysqli_stmt_bind_param($stmt3, 's', $board_id);
    }
    else {
        //좋아요 안 누른 경우 추가
        $stmt2 = mysqli_prepare($conn, "UPDATE LOGIN_INFO SET likes_board = CONCAT_WS( ? , likes_board, ',') WHERE id = ? ");
        $stmt3 = mysqli_prepare($conn_for_board, "UPDATE BOARD_INFO SET like_value = like_value + 1 WHERE board_id = ? ");

        mysqli_stmt_bind_param($stmt2, 'ss', $board_id,$login_id);
        mysqli_stmt_bind_param($stmt3, 's', $board_id);
    }

    mysqli_stmt_execute($stmt2);
    mysqli_stmt_execute($stmt3);

    mysqli_stmt_close($stmt);
    mysqli_stmt_close($stmt2);
    mysqli_stmt_close($stmt3);
    
    header("Location: view_board.php?index=".$board_id);

    exit();

?>

게시물 관련 코드인데 제가 깜박하고 어제 수정 안 했네요!

 

 

 

-my_info.php

딱히 없네요 패스

 

-only_login.php

여기도 없네요

 

-process_join.php

 

<?php
    include 'DB_INFO.php'; //데이터 베이스 정보

    session_start(); //세션 시작

    //데이터베이스 연결
    $conn = mysqli_connect($host,$username,$password,$dbname);

    //데이터베이스 오류시 종료
    if(mysqli_connect_errno()) {
        die("데이터 베이스 오류: ". mysqli_connect_error());
    }
    
    
    //POST로 전달된 정보 받기
    $login_id = filter_var(strip_tags($_POST['id']),FILTER_SANITIZE_SPECIAL_CHARS);
    $login_pw = $_POST['pw'];
    $adr = trim(filter_var(strip_tags($_POST['address']),FILTER_SANITIZE_SPECIAL_CHARS));
    
    //비밀번호는 해싱
    $hashed_pw = password_hash($login_pw, PASSWORD_DEFAULT);

    //암호화 키
    $encryption_key = 'my_secret_key';
    
    //주소는 암호화
    $encrypted_address = openssl_encrypt($adr, 'aes-256-cbc', $encryption_key, OPENSSL_ZERO_PADDING, '1234567890123456');

    //ID 중복 검사용 sql문
    $check_id = "SELECT id FROM LOGIN_INFO WHERE id= ? ";

    $stmt = mysqli_prepare($conn,$check_id);
    mysqli_stmt_bind_param($stmt, 's', $login_id);
    mysqli_stmt_execute($stmt);

    //중복 검사 sql문 실행
    $result_id = mysqli_stmt_get_result($stmt);

    if(mysqli_num_rows($result_id) > 0 ) { 
        //중복이 있을때
        $_SESSION['join_error'] = '아이디가 중복입니다!';
        header("Location: join.php");
    } else {
        //중복이 아닐때
        //새로운 사용자를 데이터베이스에 삽입문
        $sql = "INSERT INTO $dbname (id, pw, adr)
        VALUES (?,'$hashed_pw','$encrypted_address')";

        $stmt2 = mysqli_prepare($conn,$sql);
        mysqli_stmt_bind_param($stmt2, 's', $login_id);

        //sql문 실행
        if(mysqli_stmt_execute($stmt2)) {
            $_SESSION['join_error'] = '회원가입이 완료되었습니다!';
            header("Location: join.php");
        } else {
            $_SESSION['join_error'] = '회원가입 오류가 발생하였습니다.';
            header("Location: join.php");
        }

    }

    mysqli_stmt_close($stmt);
    mysqli_stmt_close($stmt2);

    //회원가입 후 닫기
    exit();
?>

 

 

 

-process_login.php

 

<?php
    include 'DB_INFO.php'; //데이터 베이스 정보

    //데이터베이스 연결
    $conn = mysqli_connect($host,$username,$password,$dbname);

    session_start(); //세션 시작
    //오류시 종료
    if(mysqli_connect_errno()) {
        die("데이터 베이스 오류: ". mysqli_connect_error());
    }
    //POST로 전달된 정보 받기
    $login_id = filter_var(strip_tags($_POST['id']),FILTER_SANITIZE_SPECIAL_CHARS);
    $login_pw = $_POST['pw'];

    //ID 찾는 쿼리문
    $sql = "SELECT * FROM LOGIN_INFO WHERE id= ? ";

    $stmt = mysqli_prepare($conn,$sql);

    mysqli_stmt_bind_param($stmt, 's', $login_id);
    mysqli_stmt_execute($stmt);

    //쿼리 실행
    $result = mysqli_stmt_get_result($stmt);

    //쿼리 실행 결과 확인
    if(mysqli_num_rows($result) > 0 ) { 
        //ID있으니 비밀번호 검증
        $row = mysqli_fetch_array($result)  ;
        $hashed_pw = $row['pw']; //결과 배열 중 pw을 가져온다
        if(password_verify($login_pw,$hashed_pw)) {
            //로그인 성공
            session_regenerate_id(); //ID 자동 갱신
            $_SESSION['login_id'] = $row['id'];
            header("Location: only_login.php");
        } else {
            //로그인 실패
            $_SESSION['login_error'] = "비밀번호가 일치하지 않습니다.";
            header("Location: login.php");
        }
    }
    else {
        //로그인 실패
        $_SESSION['login_error'] = '아이디 또는 비밀번호가 일치 하지 않습니다.';
        header("Location: login.php");
    }

    mysqli_stmt_close($stmt);
?>

 

 

 

-process_logout.php

없네요 패스

 

-search_address.php

<!DOCTYPE html>
<html>
<head>
    <title>주소찾기</title>
</head>
<body>
    <h1>주소찾기</h1>
    <form action="search_address.php" method="GET">
        <label>주소입력: </label>
        <p><input type="text" name="search" placeholder="주소 입력" required></p>
        <input type="submit" value="검색">
    </form>
    <?php
        include 'DB_INFO.php';

        //데이터베이스 연결
        $conn = mysqli_connect($host,$username,$password,$db_address);

        //데이터베이스 오류시 종료
        if(mysqli_connect_errno()) {
            die("데이터 베이스 오류: ". mysqli_connect_error());
        }
        
        //검색이 입력된 경우
        if(isset($_GET['search'])) {
            $search = filter_var(strip_tags($_GET['search']),FILTER_SANITIZE_SPECIAL_CHARS);
        } else {
            //검색이 입력되지 않은 경우
            $search = '';
        }

        $sql = "SELECT *
                FROM 우편번호
                WHERE CONCAT(우편번호,' ',시도,' ',시군구,' ',읍면,' ',도로명) LIKE ? ";

        $search_value = '%'.$search.'%';

        $stmt = mysqli_prepare($conn,$sql);
        mysqli_stmt_bind_param($stmt, 's' , $search_value);
        mysqli_stmt_execute($stmt);

        //쿼리문 실행
        $result = mysqli_stmt_get_result($stmt);

        if(mysqli_num_rows($result) > 0) {
            //주소 출력
            while($row = mysqli_fetch_assoc($result)) {

                $address = $row['우편번호'].' '.$row['시도'].' '.$row['시군구'].' '.$row['읍면'].' '.$row['도로명'];

                echo '<p><a href="join.php?address='.$address.'">'.$address.'</a></p>';

            }
        } else {
            echo "주소가 없습니다!";
        }

        mysqli_stmt_close($stmt);
    ?>
</body>
</html>

.

.

.

.

.

.

 

이렇게 해서 끝이 났습니다!

 

이제 preparedstatement 사용을 습관 들이겠습니다.

 

다음 개발은 이제 디자인을 하면서 추가할 코드가 있으면 추가하겠습니다.

예를 들자면 문의 게시판에 연락처도 남게 하던가

아니면 아이디가 게시물에 ID가 아닌 닉네임이 나오게 하겠습니다.

마이페이지에 닉네임 변경할 수 있게도 추가하겠습니다.

 

차차 하겠습니다. 필수 기능은 전부 들어가 있으니깐요!