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

코드이그나이터! MySQL 에 입력하다! ( insert )

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 )


MySQL 에서 insert 명령을 이용해서 책 정보를 추가하는 방법을
13챕터에서 보신 적이 있으실 텐데요.

인터넷으로 책을 판매하는 상점주인이 MySQL콘솔에 접속해서 insert 명령문으로 책을 추가한다?
아마도 귀찮고 번거롭고 어려워서 "못하겠다!"라는 소리가 들려올 것 같습니다.
따옴표 하나만 잘 못 사용해도 입력이 안되거든요,

그래서 보통은 책 정보를 추가하는 웹페이지를 만들어 제공하고
실제 상점주인은 웹페이지를 통해 수월한 방법으로 책 정보를 추가하곤 하지요.
현 시대에서는 이것이 대중화된 정보 입력 방법입니다.

이번 챕터에서는 코드이그나이터4를 이용하여 웹페이지에서 
책 정보를 입력, 추가하는 방법을 살펴보겠습니다.

이를 위해 총 3개의 페이지(소스파일)가 필요합니다.

- 책정보를 입력받는 컨트롤러
- 책정보를 입력받는 뷰
- 책정보 입력 액션을 실행하는 컨트롤러

원래는 '책정보 입력 액션 후 결과를 표시할 뷰'도 있으면 좋을것 같지만,
학습하는 연습단계에서는 되도록 페이지 수를 줄이는게 좋아 3개 정도로 만족(?)할까 합니다 :)

먼저 소스를 구성해보겠습니다.

CODEIGNITER4\app\Controllers\BookInput.php 파일을 생성하고 아래 소스를 입력합니다.

<?php

namespace App\Controllers;

use CodeIgniter\Controller;

class BookInput extends Controller

{

    public function index()

    {

        return view('bookinput');

    }

}

CODEIGNITER4\app\Views\bookinput.php 파일을 생성하고 아래 소스를 입력합니다.

<b><u>책 정보 입력</u></b><br/>

<form method=POST action="bookInputAct">

<div class=body_style>

    제목 : <input type=text name=title value=""><br/>

    본문 : <input type=text name=body value=""><br/>

    페이지수 : <input type=text name=totalpage value=""><br/>

    작성자 : <input type=text name=author value=""><br/>

    <input type=submit value="도서 추가">

</div>

</form>

마지막으로 CODEIGNITER4\app\Controllers\BookInputAct.php 파일을 생성하고 아래 소스를 입력합니다.

<?php

namespace App\Controllers;

use CodeIgniter\Controller;

class BookInputAct extends Controller

{

    public function index()

    {

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

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

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

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

        $db = \Config\Database::connect("default", false);

        $db->query("insert into book set

            title='".addslashes($title)."',

            body='".addslashes($body)."',

            totalpage='".addslashes($totalpage)."',

            author='".addslashes($author)."'");

        echo $title . " 책 정보가 입력되었습니다.";

    }

}

오토셋이 실행되어 있다면 아래 웹페이지에 접속이 가능하실 겁니다.
간결하게 책 정보를 입력하라는 페이지가 나오지요.

http://localhost/bookInput

입력을 요구하는 4가지 책의 정보를 입력해볼까요?
자유롭게 생각하셔서 입력하셔도 좋고
생각이 떠오르지 않으신다면 크레이를 따라하셔서 아래와 같이 입력하셔도 좋습니다.
그리고 '도서추가' 버튼을 눌러 주세요.

그러면 아래와 같은 정보가 표시가 될 것입니다.

책 정보가 추가되었습니다!
정말로 그런가 볼까요?

지난번에 만든 아래 페이지로 접속해 봅시다.

http://localhost:8080/mysqltest2

오!!

금방 입력한 "아두이노와 함께 춤을" 책 정보가 책 목록에 함께 나오는 것을 보실 수 있지요.
이런 식으로 책 정보를 계속해서 추가, 추가하실 수 있습니다.


이제 소스의 흐름을 한번 살펴볼까요?

http://localhost/bookInput 페이지에 처음 접속하면,
CODEIGNITER4\app\Controllers\BookInput.php 파일index() 메소드가 실행이 되는데요.

기본 소스를 제외하고는

<?php

namespace App\Controllers;

use CodeIgniter\Controller;

class BookInput extends Controller

{

    public function index()

    {

        :

    }

}

실행되는 코드는 단 한줄입니다.
bookinput.php 라는 뷰를 호출하는데 이 부분은 원리 이해보다는 
컨트롤러와 뷰는 항상 이런 형태로 연결한다고 생각하시면 되겠습니다.
이 코드는 CODEIGNITER4\app\Views\bookinput.php 뷰 소스 파일을 연결하여 화면을 보여줍니다.

return view('bookinput');

이제 뷰로 넘어갑니다.
뷰는 아주 단순한 웹페이지입니다.
하나의 <form> 과 그 안에 입력 필드로 구성되어 있는 웹페이지이지요.
보통 입력 항목을 다른 php 파일로 넘길 때는 HTML 태그를 아래와같이 구성하여야 합니다.

<b><u>책 정보 입력</u></b><br/>

<form method=POST action="bookInputAct">

<div class=body_style>

    제목 : <input type=text name=title value=""><br/>

    본문 : <input type=text name=body value=""><br/>

    페이지수 : <input type=text name=totalpage value=""><br/>

    작성자 : <input type=text name=author value=""><br/>

    <input type=submit value="도서 추가">

</div>

</form>

<form> 의 구조는 아래와 같지요.

    :

<form method=POST action="넘겨줄페이지URL">

      <input type=text name=항목명 value="값">

   <input type=text name=항목명 value="값">

    :

   <input type=submit value="저장문구">

</form>

    :

<form> 태그로부터 시작해서 </form> 태그까지가 하나의 양식(Form)인데요.
해당 Form 범위 안에 <input> 이나 <select> 등의 입력 가능한 요소들을 배치하는 것이 일반적입니다.

도서 정보를 입력하는 소스의 <form> 태그를 살펴보시면
각각 method=POST action="bookInputAct" 라는 내용이 붙어 있는 것을 보실 수 있을텐데요.

method 나 action 을 파라미터라고 부릅니다.
그리고 등호(=)기호 뒤에 있는 내용을 값이라고 부르지요.

<form method=POST action="bookInputAct">

"method=POST" 라고 되어 있는 부분을 보통 이렇게 표현합니다.

"method 파라미터값이 POST 이다"

그렇다면 action 은 이렇게 표현하겠지요

"action 파라미터값이 bookInputAct 이다"

이걸 자세히 설명드리는 이유는 이 파라미터가 입력한 책 정보를 저장하는데 매우 중요하기 때문입니다.

우선 method 파라미터는 기능성 옵션입니다.
보통 GET / POST 2가지중 1가지를 사용하는데요.
GET 값을 사용해도 작동은 되지만, POST 가 GET 보다는 보안에 안전합니다.

GET 을 사용할 경우 해커들이 해킹하기 매우 쉽기 때문에 
특별한 경우를 제외하고는 항시 POST 를 사용하는 것이 좋습니다.

action 파라미터는 책 정보를 저장할 때 이동할 URL 주소입니다.
절대 경로 URL을 적어주셔도 되지만,  => http://localhost/bookInputAct
상대경로로 적어주셔도 됩니다. => ./bookInputAct

코드이그나이터에서는 일부 개념은 다른 부분은 있지만,
보통 현재 폴더와 동일한 위치의 파일을 호출하는 경우 상대 경로 또한 적어주지 않으셔도 되지요. => bookInputAct

하나 더 설명 드릴부분은 submit 버튼입니다.

<input type=submit value="도서 추가">

이 태그는 특수 기능성 버튼에 해당합니다.
통상적으로 버튼 태그는 아래와 같습니다. 버튼은 항상 특정한 자바스크립트를 심어야 무언가가 작동합니다.

<input type=button value="버튼표시명">

하지만 submit 버튼의 경우는 다릅니다. 특정한 자바스크립트를 심지 않아도 누르면 무조건 작동하는 기능이 있는데,
바로 폼(Form)을 action 파라미터에 정한 URL 로 전송하는 기능입니다.
이 버튼을 누르는 순간 양식 안에 있는 모든 입력 항목들이 다음 페이지로 전달되지요..

주의하실 점은 submit 버튼도 반드시 <form> ~ </form> 범위 안에 있어야 작동된다는 점이지요.

이제 책 정보를 모두 입력한 다음, submit 버튼을 누르면 action 에 기재한 URL, bookInputAct 페이지로 이동하는데요.


코드 이그나이터 컨트롤러 소스파일 CODEIGNITER4\app\Controllers\BookInputAct.php 을 호출합니다.

이 컨트롤러에서 실제로 금방 입력한 책정보를 MySQL의 book 테이블에 삽입하는 기능을 실행하게 되는데요.
어디 한번 소스를 살펴볼까요?

<?php

namespace App\Controllers;

use CodeIgniter\Controller;

class BookInputAct extends Controller

{

    public function index()

    {

        :

    }

}

기본 틀이 되는 소스는 위와 같고 그 내부에서 한줄씩 코드가 실행됩니다.

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

$title 이라는 변수를 정의하고, 앞에서 책 제목 입력상자의 입력된 값을 받아서 저장하는 기능입니다.
보통 폼 항목을 받아올 때는 아래와 같이 사용하는 것이 일반적인데요.

$변수=$this->request->getVar("입력항목명");

입력항목명은 바로 전, 책정보를 입력하는 페이지에서 반드시 name 파라미터로 그 이름이정의되어 있어야 합니다.
이렇게 말이지요. 앞 페이지에서 name=title 이라고 정해주었기 때문에 여기서 그 이름으로 받아올 수 있는 것입니다.

<input type=text name=title value="">

'변수'라는 용어를 처음 접하시는 분을 위해 잠깐 설명드리자면,
변수라는 것은 고정되어 있지 않고 내용이 계속 변하는 이른바 상자같은 것인데요.
php 에서는 $ 기호를 앞에 붙여서 변수이름를 정의하고 한글로도 정의가 가능합니다.

보통 오른쪽의 내용을 왼쪽 변수 상자에 넣어라~ 라는 의미로 다음과 같이 사용합니다.

$변수 = 저장할값;

참고로, php 기존 사용자분이시라면 $_POST['title'] 또는 $_REQUEST['title']로 받아와도 되지 않겠느냐고 하실 수 있지만
코드이그나이터에서 전역변수는 특정환경에서 사용이 불가한 경우도 있기 때문에 코드이그나이터에서 공식적으로 지원하는 아래 3개 함수중 하나를 사용하는 것이 좋습니다.

$this->request->getVar("name파리미터");

$this->request->getPost("name파리미터");

$this->request->getGet("name파리미터");

이제 $title 변수에는 금방 입력한 책 제목 "아두이노와 함께 춤을" 값이 입력되었습니다.

$title="아두이노아 함께 춤을";

그 다음 코드가 이어서 순서대로 실행됩니다.

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

책의 본문 내용을 받아와 $body 변수에 저장하는 부분입니다.
$title 변수를 받아 오는 부분과 별 차이는 없습니다.

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

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

이어지는 코드도 각각 입력한 총페이지수, 저자 정보를 $totalpage, $author 변수에 받아와 저장합니다.
이렇게 저장한 정보를 MySQL 콘솔에서 실행했던 insert 명령문처럼 문장을 구성해서 실행해주면 되는데요.
바로 그 다음 코드가 이어집니다.

$db = \Config\Database::connect("default", false);

먼저 MySQL 데이터베이스에 명령문을 실행하려면 코드이그나이터에 설정된 DB 연결 설정을 받아와야 합니다.
위 코드는 DB 연결 설정을 받아와 $db 변수에 그 자원을 연결해 놓습니다.

$db->query("insert into book set

    title='".addslashes($title)."',

    body='".addslashes($body)."',

    totalpage='".addslashes($totalpage)."',

    author='".addslashes($author)."'");

위 명령문이 바로 입력된 값으로 책 정보를 새로추가하는 SQL 쿼리 문장입니다. 좀 복잡해 보이시지요?
좀 더 보기 쉽도록 addslashes 를 잠깐 빼보도록 하겠습니다.

$db->query("insert into book set

    title='".$title."',

    body='".$body."',

    totalpage='".$totalpage."',

    author='".$author."'");

좀 더 간결해보이시나요?
우선 $db->query 명령문은 MySQL 명령문을 php 에서 직접 실행해주는 명령문입니다.
사용법은 아래와 같지요.

$db->query("MySQL명령문");

"MySQL 명령문"만 추려서 보신다면 아래와 같은 모양입니다.

"insert into book set

    title='".$title."',

    body='".$body."',

    totalpage='".$totalpage."',

    author='".$author."'"

위 문장은 여러개의 문자열(string)과 변수(variable)를 조합해서 구성하는 형태로 되어 있습니다.
겹 따옴표가 바로 문자열을 구분짓는 수단인데요.

겹 따옴표가 처음 나오는 부분이 문자열의 시작이 되고
겹 따옴표의 두번째 나오는 부분이 문자열의 끝이 됩니다.

처음 문자열은 아래와 같습니다. 겹따옴표가 2번째 나오는 순간까지가 첫번째 문자열이 되는 것이지요

"insert into book set

    title='"

그리고 다음으로 점(.) 기호가 이어집니다.
이 점 기호는 앞의 문자열이나 변수에 그 내용을 붙여 써라~ 라는 의미가 되는데요.

.

그 다음으로는 변수가 위치합니다.

$title

$title 변수에는 금방 입력했던 책의 제목이 내용으로 들어 있는데요
만일 "아두이노와 춤을" 이란 값을 입력했다면,

아래 문장의 결과는

"insert into book set

    title='".$title

이렇게 됩니다.

"insert into book set

    title='아두이노와 춤을"

이런 식으로 문자열과 변수 내용이 연이어서 뒤에 붙여 최종적인 문자열을 구성하는 것인데요.
아래 php 명령문은 이런 규칙에 따라

"insert into book set

    title='".$title."',

    body='".$body."',

    totalpage='".$totalpage."',

    author='".$author."'"

최종적으로 이런결과를 해석해서 만들어냅니다.
이 문장이 실제적으로 MySQL 명령문으로 실행되는 것이지요.

"insert into book set

    title='아두이노와 춤을',

    body='아두이노를 제어하는 방법을 알아봅니다.',

    totalpage='500',

    author='크레이'"

그리고 나서 마지막으로 echo 문장을 이용, 웹페이지에 입력이 완료되었다는 문구를 출력합니다.

echo $title . " 책 정보가 입력되었습니다.";

역시 앞의 변수, 문자열 구성 규칙에 따라 최종적으로는 아래 문장을 웹페이지에 고객분에게 보여주는 것이지요.

아두이노와 춤을 책 정보가 입력되었습니다.

여기까지의 책 정보를 추가하는 모든 것인데, 컴퓨터는 이 모든 과정을 순식간에 처리합니다.

그렇다면 아직 다루지 않은 addslashes 는 무엇일까요?
이 부분은 보안적 이슈에 대한 부분인데, 내용이 길어질 수 있기 때문에 다음 챕터에서 살펴보도록 하겠습니다.


코드이그나이터4 시스템 내 웹페이지에서 정보를 입력받아 MySQL에 삽입하는 과정을 살펴보았는데요.
필요하신 분에게 도움이 되셨는지 모르겠습니다.
아무쪼록 코로나 사태에 건강 유의하시고 이 사태가 빨리 진정되기를 소원합니다.
다음 챕터에서 또 뵙도록 하겠습니다.

여기까지 읽어주셔서 감사합니다 :)