본문 바로가기
코드이그나이터와 php7와 mysql

코드이그나이터4, 검색!

1. 오토셋 APM 인스톨러 ( apache + php7.2 + mariadb ) 설치 | https://itadventure.tistory.com/93

2. 코드이그나이터 4 ( codeigniter 4 ) 설치 | https://itadventure.tistory.com/95

3. 비주얼 스튜디오 코드 에디터 설치 & 한글 설정 | https://itadventure.tistory.com/96

4. 폴더열기 / 웹페이지 편집(1) | https://itadventure.tistory.com/97

5. 웹페이지 편집(2) | https://itadventure.tistory.com/101

6. 코드이그나이터4의 URL 규칙 | https://itadventure.tistory.com/105

7. php, 네임스페이스 [ namespace ] ?! | https://itadventure.tistory.com/118

8. 코드이그나이터의 네임스페이스, 그리고 모델 | https://itadventure.tistory.com/122

9. 코드이그나이터 뷰의 파라미터 전달 | https://itadventure.tistory.com/147

10. 코드이그나이터 뷰를 나눠 볼까요? | https://itadventure.tistory.com/174

11. MYSQL 이 뭐여? [ 마이에스큐엘은 서류철이다! ] | https://itadventure.tistory.com/175

12. MYSQL 콘솔에 접속해보자! | https://itadventure.tistory.com/178

13. MySql에 넣었다가 꺼냈다가, 뭘? | https://itadventure.tistory.com/265

14. 검색진열대 MYSQL | https://itadventure.tistory.com/267

15. 편집의 왕자 MySQL | https://itadventure.tistory.com/269

16. 코드이그나이터4, MYSQL과 손잡다. | https://itadventure.tistory.com/271

17. MySQL -> 컨트롤러 -> 뷰 트리플 패스! | https://itadventure.tistory.com/272

18. 코드이그나이터! MySQL 에 입력하다! ( insert ) | https://itadventure.tistory.com/273

19. 해킹을 막아라! MySQL인젝션 보안 | https://itadventure.tistory.com/274

20. MySQL과 친해지는 phpmyadmin | https://itadventure.tistory.com/277

21. 코드이그나이터4에서 책 정보를 편집해볼까요? | https://itadventure.tistory.com/280

22. 코드이그나이터4에서 책을 지워봅시다. DELETE! | https://itadventure.tistory.com/282

23. 코드이그나이터4, 페이징 기술 | https://itadventure.tistory.com/285

24. 코드이그나이터4. 검색!


인생에는 많은 물음표(?)가 있습니다.
사람들은 물음표로 진행되는 많은 순간마다 선택을 해야 할 때가 있지요.

이걸 선택하면 어떤 일이 일어날까?
이걸 선택했더라면 더 좋았을걸.. 하면서 많은 생각들을 갖게 됩니다.

컴퓨터를 통해 인생의 답을 찾을 수 있을까요?
인생에 대한 답을 컴퓨터에 의지하는 것은 어리석은 일입니다.
컴퓨터는 믿을만한 대상이 아니기 때문입니다.

그렇지만 단순한 정보를 찾는 것은 가능하지요.
정보를 제공하는 것이야말로 컴퓨터의 주된 목적이기 때문입니다.

지난 챕터에서는 페이징 기술 구현에 대해 알아보았지요?
이번 시간에는 검색기능에 대해서 알아 보겠습니다.

어떤 책을 찾고 싶은데 제목의 '특정단어'만 기억이 난다면 어떻게 해야 할까요?
일일히 책 목록을 하나씩 들여다 보는 것도 하나의 방법이지만, 
아마도 눈이 많이 피로해질 겁니다.
그럴때 마치 검색엔진 네이버나 구글처럼 단어만 치면 알아서 책 목록을 검색해주면 어떨까요?

이번 챕터에서도 이미 완성된 소스를 먼저 소개해드리고 부분적으로 추가된 부분에 대해 설명드리겠습니다.

첫번째는 역시나 컨트롤러입니다.
지난번과 파일명을 달리하기 위해 BookList3.php 로 이름지었습니다.
컨트롤러 - BookList3.php
코드이그나이더폴더\app\Controllers 폴더에 저장해주시기 바랍니다.

<?php
namespace App\Controllers;
use CodeIgniter\Controller;
class BookList3 extends Controller
{
    public function index()
    {
        
        $db = \Config\Database::connect("default", false);
        $pageview=20;
        $page=$this->request->getVar("page");
        $searchword=$this->request->getVar("searchword");
        if($page=="")$page=1;
        $startlimit=($page-1)*$pageview;
        $query_count = $db->query("SELECT count(*) FROM book where title like '%".addslashes($searchword)."%'");
        $results_count = $query_count->getResultArray();
        $total = $results_count[0]['count(*)'];
        $totalpage = ceil($total / $pageview);
        $pagestr="{$total}건, {$totalpage}페이지 / ";
        for($i=1;$i<=$totalpage;++$i){
            $pagestr .= "<a href='?page=$i&searchword=$searchword' style='text-decoration:none'>";
            if($i==$page)$pagestr .= "<span style='color:red;font-weight:bold'>[";
            $pagestr .= "$i";
            if($i==$page)$pagestr .= "</span>]";
            $pagestr .= "</a> ";
            
        }
            $query = $db->query("SELECT * FROM book where title like '%".addslashes($searchword)."%' order by number desc limit $startlimit, $pageview");
        $results = $query->getResultArray();
        $data = [
            'title'=>"도서 목록",
            'booklist'=>$results,
            'pagestr'=>$pagestr,
            'searchword'=>$searchword
        ];
        return view('booklist3', $data);
    }
}

뷰 - booklist3.php
코드이그나이더폴더\app\Views 폴더에 저장해주시기 바랍니다.

<style>
    .title_style { font-size:12pt; color:blue}
    .author_style { font-size:9pt; color:gray}
</style>
<u><b><?=$title?></b></u><br/>
<?=$pagestr?>
<form method=post action="bookList3">
제목 검색 : <input type=text name=searchword value="<?=$searchword?>">
<input type=submit value="검색">
</form>
<hr/>
<? foreach ($booklist as $book) { ?>
<span class=title_style><?= $book['title']?></span>
<span class=author_style>/ <?= $book['author']?></span>
<span class=author_style>/ <a href="bookEdit?number=<?= $book['number']?>">[편집]</a></span>
<span class=author_style>/ <a href="bookDelete?number=<?= $book['number']?>">[삭제]</a></span>
<br/>
<? } ?>
<hr/>
<?=$pagestr?><br/>

이제 기능을 확인해 볼까요?
독자 여러분의 PC에서 아래 페이지에 접속합니다.

http://localhost/bookList3

그러면 아래와 같은 화면이 나올겁니다.
지난 챕터에서는 보이지 않던 '제목 검색'이라는 부분이 한줄 추가되었군요?

제목 검색란에 '프로그래밍'라고 입력한 다음, [검색] 버튼을 클릭하면 아래와 같이 결과가 나올겁니다.
제목에 '프로그래밍'이란 글자가 들어간 책들만 모두 나열되었지요.
사용자 입장에서 매우 편해진 것 같지 않나요?

이제 원리를 살펴보도록 하지요.
먼저 뷰에서 변경된 부분을 먼저 살펴보겠습니다.
뷰에서는 아래 부분이 추가되었습니다.

<form method=post action="bookList3">
제목 검색 : <input type=text name=searchword value="<?=$searchword?>">
<input type=submit value="검색">
</form>

바로 검색 양식 폼이지요. 바로 이 부분인데요.

<form> 으로 시작해서 </form>  으로 끝나는 부분을 폼 양식이라고 합니다.

<form method=post action="bookList3">
       :
</form>

폼 양식은 보통 그 내부에 다음 페이지로 이동하는 기능을 포함하는데요. 
그 때 폼 양식 내의 내용들을 전달해주는 특수 기능이 있습니다.
그래서 폼 양식 내부에 사용자가 입력하는 검색어가 전달됩니다.
아래 태그가 바로

<input type=text name=searchword value="<?=$searchword?>">

아래 부분에 해당하는데요.

제목란에 '프로그래밍'이라는 글자를 입력 후, 검색버튼을 누를 때 
bookList3 페이지로 이동하면서, searchword 라는 파라미터 변수에 '프로그래밍'이라는 값을 담아서 전달합니다.
그 값을 컨트롤러가 받아서 처리하는 것이지요.

value="<?=$searchword?>" 라고 된 부분이 있는데 이건 마지막에 설명드리겠습니다.

이제 컨트롤러로 넘어가보겠습니다.
컨트롤러에서는 검색어를 받아서 처리하는 부분이 추가되었습니다.
우선 아래 코드가 searchword  라는 파라미터를 받아 php 변수인 $searchword 에 넣는 코드입니다.

$searchword=$this->request->getVar("searchword");

그리고 검색어를 기반으로 책의 갯수를 세는 SQL 문을 실행합니다.
원래 SQL 문을 실행하는 php문은 아래와 같았습니다만,

$query_count = $db->query("SELECT count(*) FROM book");

아래와 같이 변경되었습니다. 검색어가 포함된 책만 골라서 권수를 보여주어야 하기 때문입니다.

$query_count = $db->query("SELECT count(*) FROM book where title like '%".addslashes($searchword)."%'");

'프로그래밍'이란 단어로 검색한 다고 칠 때 생성되는 MYSQL 문은 아래와 같겠지요.

SELECT count(*) FROM book where title like '%프로그래밍%'

물론 책 목록을 검색하는 SQL 문을 실행하는 명령도 이 단계에서

$query = $db->query("SELECT * FROM book order by number desc limit $startlimit, $pageview");

이 단계로 변경되었습니다.

$query = $db->query("SELECT * FROM book where title like '%".addslashes($searchword)."%' order by number desc limit $startlimit, $pageview");

역시 아래와 같이 SQL문이 변경되었습니다.
이 부분은 검색할 때만 이렇게 실행하고 검색하지 않을 때는 이 부분을 빼는 약간의 개선 여지는 있지만
여기서는 단순히 이해목적을 위해 건너 뛰도록 하겠습니다.

SELECT * FROM book where title like '%프로그래밍%' order by number desc limit 0, 20

페이징 부분도 일부 변경되었습니다.
만일 사용자가 'do it'이란 단어를 검색했을 때, 5페이지 가량이 나오는데요.

페이지에 대해 특별한 처리를 해주지 않으면 2페이지를 클릭했을 떄 검색어가 연결이 안됩니다.
페이지 클릭은 <form> ~ </form> 안에 포함되지도 않았고 <form>과 상관없는 하이퍼 링크로 페이지를 연결하기 때문입니다. 결국 'do it'로 검색할때 2페이지를 볼 수가 없을텐데요.

그렇기 때문에 간단히는 페이지 클릭시 링크되는 페이지에도 searchword 파라미터가 전달되도록
URL 을 직접 추가해주는 방법이 있습니다.

그래서 원래 이렇게 되었던 소스가

$pagestr .= "<a href='?page=$i' style='text-decoration:none'>";

아래와 같이 변경되었습니다.

$pagestr .= "<a href='?page=$i&searchword=$searchword' style='text-decoration:none'>";

주소가 길어지는 단점이 있어 그렇게 효율적이진 않지만 제일 단순한 방법입니다.

그렇다면 2페이지를 선택하고 검색어 입력 '검색'을 할 경우 어떻게 해야 할까요?
2페이지를 함께 전달해주어야 할까요?
그럴 필요는 없습니다. 사용자는 검색을 하는 순간 보통 맨 처음부터 보는 것을 기대하기 때문에
검색액션 처음에는 무조건 1페이지가 보여지는 것이 좋습니다.
그래서 검색<form> 내부에는 현재 페이지를 전달하기 위해 고민할 필요가 없습니다.

마지막으로 한가지가 남아 있습니다.
'do it'으로 단어를 검색했을 때 검색된 결과 페이지에 검색입력란은 공란이 되는게 원칙이지만
검색입력란에 마지막에 검색했던 단어를 그대로 표시해주고 싶습니다.

그렇다면 먼저 컨트롤러에서 이 변수를 뷰에 전달해주고 뷰에서 전달받은 변수를 value 값에 넣어주면 됩니다.
컨트롤러에서 뷰에 전달해주는 부분은 아래와 같이 변경되었습니다.
바로 검색어를 포함해주는 것이지요.

$data = [
            'title'=>"도서 목록",
            'booklist'=>$results,
            'pagestr'=>$pagestr,
            'searchword'=>$searchword
        ];

그리고 뷰에서는 전달받은 $searchword 를 
value 값에 넣어주면 검색했던 원본값이 검색어 상자에 그대로 남아 있게 됩니다.

<input type=text name=searchword value="<?=$searchword?>">

 

이렇게 해서 오늘은 코드이그나이터의 '검색기능' 추가에 대해서 알아보았습니다.
필요하신 분에게 도움이 되셨는지 모르겠습니다.
오늘도 여기까지 읽어주셔서 감사합니다.

아무쪼록 현 코로나라는 어려운 시국에 건강 유의하시고
하나님의 보호하심이 함께 하시길 소원합니다 :)