Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

PHP 스크립트로 기존 MySQL 테이블에 데이터 삽입하는 방법

PHP에서는 mysql_query() 함수를 사용해 기존 MySQL 테이블에 새로운 데이터를 삽입할 수 있습니다. 이 함수는 서버에 전달할 SQL 쿼리를 실행하며, 정상적으로 처리되면 참(true)을 반환합니다.

데이터 삽입 과정

PHP 스크립트로 MySQL 테이블에 데이터를 추가하는 흐름은 대체로 다음과 같습니다.

  1. DB 연결 – mysql_connect()로 호스트, 사용자명, 비밀번호를 이용해 MySQL 서버에 접속합니다.
  2. 입력값 정제 – 폼에서 전송된 값에 따옴표 등 특수문자가 포함되어 있으면 addslashes()로 이스케이프 처리합니다.
  3. 쿼리 작성 – INSERT INTO 문에 테이블 이름, 컬럼 목록, 삽입할 값들을 지정합니다.
  4. 쿼리 실행 – mysql_select_db()로 데이터베이스를 선택한 뒤 mysql_query()로 쿼리를 실행합니다.
  5. 결과 처리 및 연결 종료 – 성공 여부를 사용자에게 알리고 mysql_close()로 연결을 닫습니다.

예제: Tutorials_tbl 테이블에 레코드 추가하기

다음 예제는 'Tutorials_tbl' 테이블에 튜토리얼 제목, 작성자, 제출일을 입력받아 저장하는 완전한 PHP 스크립트입니다. 사용자가 폼을 작성해 제출하면 POST 방식으로 값이 전달되고, 같은 페이지에서 이를 처리해 데이터베이스에 삽입합니다.

<html>
   <head>
      <title>MySQL 데이터베이스에 새 레코드 추가</title>
   </head>

   <body>
      <?php
         if(isset($_POST['add'])) {
            $dbhost = 'localhost:3036';
            $dbuser = 'root';
            $dbpass = 'rootpassword';
            $conn = mysql_connect($dbhost, $dbuser, $dbpass);

            if(! $conn ) {
               die('연결할 수 없습니다: ' . mysql_error());
            }

            if(! get_magic_quotes_gpc() ) {
               $tutorial_title = addslashes($_POST['tutorial_title']);
               $tutorial_author = addslashes($_POST['tutorial_author']);
            } else {
               $tutorial_title = $_POST['tutorial_title'];
               $tutorial_author = $_POST['tutorial_author'];
            }

            $submission_date = $_POST['submission_date'];
            $sql = "INSERT INTO tutorials_tbl ".
               "(tutorial_title,tutorial_author, submission_date) "."VALUES ".
               "('$tutorial_title','$tutorial_author','$submission_date')";

            mysql_select_db('TUTORIALS');
            $retval = mysql_query( $sql, $conn );
            if(! $retval ) {
               die('데이터를 입력할 수 없습니다: ' . mysql_error());
            }
            echo "데이터가 성공적으로 입력되었습니다\n";
            mysql_close($conn);
         } else {
      ?>

      <form method = "post" action = "<?php $_PHP_SELF ?>">
         <table width = "600" border = "0" cellspacing = "1" cellpadding = "2">
            <tr>
               <td width = "250">튜토리얼 제목</td>
               <td><input name = "tutorial_title" type = "text" id = "tutorial_title"></td>
            </tr>
            <tr>
               <td width = "250">튜토리얼 작성자</td>
               <td><input name = "tutorial_author" type = "text" id = "tutorial_author"></td>
            </tr>
            <tr>
               <td width = "250">제출일 [ yyyy-mm-dd ]</td>
               <td><input name = "submission_date" type = "text" id = "submission_date"></td>
            </tr>
            <tr>
               <td width = "250">&nbsp;</td>
               <td>&nbsp;</td>
            </tr>
            <tr>
               <td width = "250">&nbsp;</td>
               <td><input name = "add" type = "submit" id = "add" value = "튜토리얼 추가"></td>
            </tr>
         </table>
      </form>
      <?php
         }
      ?>
   </body>
</html>

주요 코드 해설

  • isset($_POST['add']) – 'Add Tutorial' 버튼 클릭 여부를 판단합니다. 버튼이 눌렸을 때는 DB 처리 로직을, 그렇지 않을 때는 입력 폼을 화면에 출력합니다.
  • get_magic_quotes_gpc() / addslashes() – 매직 쿼터 설정 상태에 따라 문자열의 작은따옴표 앞에 백슬래시를 붙여, 쿼리문이 깨지는 것을 방지합니다.
  • INSERT INTO ... VALUES – 폼에서 받은 세 개의 값을 tutorials_tbl 테이블의 tutorial_title, tutorial_author, submission_date 컬럼에 각각 저장합니다.
  • die()와 mysql_error() – 연결 실패나 쿼리 실행 실패 시 오류 메시지를 출력하고 스크립트를 즉시 종료합니다.

참고: mysql 확장 함수는 더 이상 권장되지 않습니다

위 예제에 사용된 mysql_* 계열 함수(mysql_connect, mysql_query 등)는 PHP 5.5부터 지원이 중단(deprecated)되었고, PHP 7.0부터는 완전히 제거되었습니다. 최신 환경에서는 아래 두 가지 방법을 사용하는 것이 좋습니다.

  • MySQLi – 절차적 방식과 객체 지향 방식을 모두 지원하며, prepared statement를 통해 SQL 인젝션을 효과적으로 방어할 수 있습니다.
  • PDO(PHP Data Objects) – MySQL뿐 아니라 다양한 데이터베이스를 동일한 인터페이스로 다룰 수 있어 코드의 이식성이 뛰어납니다.

또한 사용자 입력값을 쿼리 문자열에 직접 삽입하는 방식은 SQL 인젝션 공격에 매우 취약합니다. 실무에서는 반드시 prepared statement와 파라미터 바인딩을 활용해 안전하게 데이터를 처리하시기 바랍니다.