PHP

MySQL 확장

본 수업은 상위 수업인 데이터베이스 토픽의 후속 수업이기 때문에 데이터베이스 토픽을 먼저 보셔야 합니다.

MySQL 확장

PHP의 MySQL  확장 기능은 PHP 5.5부터 폐지 예정 상태(deprecated)가 되었다. 그 이후에는 폐지될 예정이기 때문에 신규 에플리케이션을 개발한다면 사용하지 안아야 한다. 또한 기존의 에플리케이션도 PDO나 mysqli로 이전을 추진해야 한다.

MySQL 확장은 MySQL을 사용하기 위한 확장 기능이다. 곧 폐지될 기능이지만, 기존의 에플리케이션에서 사용하고 있는 경우가 많이 있기 때문에 이에 대한 사용법을 익히는 것은 당분간은 중요할 것이다. 본 수업에서는 예제를 통해서 MySQL 확장을 어떻게 사용하는가를 알아보겠다. 

MySQL 트러블 슈팅

만약 MySQL을 사용하는 과정에서 아래와 같은 에러가 난다면 MySQL 익스텐션을 활성화해야 한다. Bitnami 윈도우 버전의 경우 아래와 같이 처리했다. 다른 운영체제는 이 방법을 참고한다.

Fatal error: Call to undefined function mysql_connect() in D:\BitNami\wampstack-5.4.12-0\apache2\htdocs\mysql\process.php on line 2

php의 디렉토리가 D:\BitNami\wampstack-5.4.21-0\php일 경우 D:\BitNami\wampstack-5.4.21-0\php\php.ini 파일을 열고 아래의 코드 앞의 ;을 제거한다.

extension=php_mysql.dll

그리고 익스텐션의 dll 파일이 설치된 디렉토리의 기본경로를 변경해준다. 아래의 경로는 필자가 설치한 Bitnami를 기준으로 한 것이기 때문에 사용자마다 다를 수 있다. 자신의 환경에 맞게 수정해준다.

extension_dir = "D:\BitNami\wampstack-5.4.21-0\php\ext"

예제

아래의 파일은 전송 버튼을 눌렀을 때 process.php 파일로 데이터를 전송한다.

input.php

<!DOCTYPE html>
<html>
    <head>
		<meta charset="utf-8"/>
	</head>	
	<body>
		<form action="./process.php?mode=insert" method="POST">
			<p>제목 : <input type="text" name="title"></p>
			<p>본문 : <textarea name="description" id="" cols="30" rows="10"></textarea></p>
			<p><input type="submit" /></p>			
		</form>
	</body>
</html>

아래의 파일은 데이터베이스를 조작하는 작업을 모아둔 PHP 에플리케이션이다. URL에 포함된 mode의 값에 따라서 다른 작업을 하도록 switch 문을 사용했다.

process.php

<?php
mysql_connect('localhost', 'root', '111111');
mysql_select_db('opentutorials');
switch($_GET['mode']){
    case 'insert':
		$result = mysql_query("INSERT INTO topic (title, description, created) VALUES ('".mysql_real_escape_string($_POST['title'])."', '".mysql_real_escape_string($_POST['description'])."', now())");
		header("Location: list.php"); 
		break;
	case 'delete':
		mysql_query('DELETE FROM topic WHERE id = '.mysql_real_escape_string($_POST['id']));
		header("Location: list.php"); 
		break;
	case 'modify':
		mysql_query('UPDATE topic SET title = "'.mysql_real_escape_string($_POST['title']).'", description = "'.mysql_real_escape_string($_POST['description']).'" WHERE id = '.mysql_real_escape_string($_POST['id']));
		header("Location: list.php?id={$_POST['id']}");
		break;
}
?>

아래의 파일은 데이터베이스에 저장된 토픽의 리스트와 선택된 토픽의 자세한 정보를 화면에 출력하는 에플리케이션이다.

list.php

<?php
mysql_connect('localhost', 'root', '111111');
mysql_select_db('opentutorials');
$list_result = mysql_query('SELECT * FROM topic');

if(!empty($_GET['id'])) {
    $topic_result = mysql_query('SELECT * FROM topic WHERE id = '.mysql_real_escape_string($_GET['id']));
    $topic = mysql_fetch_array($topic_result);
}
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <style type="text/css">
            body {
                font-size: 0.8em;
                font-family: dotum;
                line-height: 1.6em;
            }
            header {
                border-bottom: 1px solid #ccc;
                padding: 20px 0;
            }
            nav {
                float: left;
                margin-right: 20px;
                min-height: 1000px;
                min-width:150px;
                border-right: 1px solid #ccc;
            }
            nav ul {
                list-style: none;
                padding-left: 0;
                padding-right: 20px;
            }
            article {
                float: left;
            }
            .description{
                width:500px;
            }
        </style>
    </head>
  
    <body id="body">
        <div>
            <nav>
                <ul>
                    <?php
                    while($row = mysql_fetch_array($list_result)) {
                        echo "<li><a href=\"?id={$row['id']}\">".htmlspecialchars($row['title'])."</a></li>";                        }
                    ?>
                </ul>
                <ul>
                    <li><a href="input.php">추가</a></li>
                </ul>
            </nav>
            <article>
                <?php
                if(!empty($topic)){
                ?>
                <h2><?=htmlspecialchars($topic['title'])?></h2>
                <div class="description">
                    <?=htmlspecialchars($topic['description'])?>
                </div>
                <div>
                    <a href="modify.php?id=<?=$topic['id']?>">수정</a>
                    <form method="POST" action="process.php?mode=delete">
                        <input type="hidden" name="id" value="<?=$topic['id']?>" />
                        <input type="submit" value="삭제" />
                    </form>
                </div>
                <?php
                }
                ?>
            </article>
        </div>
    </body>
</html>

아래 파일은 토픽의 내용을 수정하기 위해서 사용할 에플리케이션이다.

modify.php

<?php
mysql_connect('localhost', 'root', '111111');
mysql_select_db('opentutorials');
$result = mysql_query('SELECT * FROM topic WHERE id = '.mysql_real_escape_string($_GET['id']));
$topic = mysql_fetch_array($result);
?>
<!DOCTYPE html>
<html>
    <head>
		<meta charset="utf-8"/>
	</head>	
	<body>
		<form action="./process.php?mode=modify" method="POST">
			<input type="hidden" name="id" value="<?=$topic['id']?>" />
			<p>제목 : <input type="text" name="title" value="<?=htmlspecialchars($topic['title'])?>"></p>
			<p>본문 : <textarea name="description" id="" cols="30" rows="10"><?=htmlspecialchars($topic['description'])?></textarea></p>
			<p><input type="submit" /></p>
		</form>
	</body>
</html>

디버깅

댓글

댓글 본문
작성자
비밀번호
  1. 다시시작
    완료
  2. Warning: Cannot modify header information - headers already sent by (output started at C:\APM_Setup\htdocs\process.php:1) in C:\APM_Setup\htdocs\process.php on line 7

    타이핑해보고 안되서 복붙해서도 해봤는데 안되네요 ㅠㅠ 도와줘세요
  3. 감사합니다.
  4. 아이러브개발
    현재 php는 mysql확장을 지원 안하나보네요

    mysqli 로 이용해야지 정상작동 됩니다.

    자세한건 구글에 php mysqli 검색하시면 사용법 나와요~ mysql확장과 별반 다르지 않지만 코드 구성만 좀 바뀌었습니다
  5. 17-08-07 감사합니다~
  6. nanerwoori
    php 5.6을 이용중인데 아래의 에러가 해결이 안되는 이유가 버전때문인가요?

    에러 : Fatal error: Call to undefined function mysql_connect()

    참고로 extension 설정 해도 에러가 해결이 안되네요
  7. 박지수
    PHP의 My SLQ 확장과 데이터 삭제 첫 화면에 SLQ로 오타 있습니다.
  8. 고맙습니다~
  9. egoing
    auto increment 컬럼은 자동으로 수가 생겨요~
    대화보기
    • 지선
      이고잉님!!저기 말하는 id값이 input예제에는 히든으로 아이디값이 전송되는 폼?이없던데,,
      그렇다면 id생성은 글을 추가할때 자동으로 데이터베이스에 id값이 자동생성되는건가요??????? 그래서 다른예제들에서 &get_[id]값을 가져오는것이 데이터베이스서버에자동으로생성돼있는 id값인가요??
      ㅠㅠㅠㅠㅠ
    • springstar
      고맙습니당
    • NamJin Kim
      감사합니당
    • 김철기
      insert,update,select 하기전에
      mysql_query("set names utf8");
      code를 넣었더니 해결이 됩니다.
      대화보기
      • 김철기
        Linux(ubuntu)에 MySQL 5.5를 설치하고
        PDO 방식 및 MySQL Extension 방식으로 위의 예제를 실행하면
        PDO 방식으로 하면 Web과 MySQL Monitor에서 한글이 깨지지 않는데
        위 방식으로 하면 MySQL Monitor에서 한글이 깨집니다.
        해결책이 있나요?
      • 유진
        질문이요ㅠㅠ
        process.php
        <?php
        mysql_connect('127.0.0.1:3307', 'root', '123456');

        php.ini 수정
        extension=php_mysql.dll
        extension=php_mysqli.dll

        계속 아래와 같은 에러가 나오네요ㅠㅠ
        Fatal error: Call to undefined function mysql_connect() in C:\Bitnami\wampstack-5.6.26-2\apache2\htdocs\firstapp\process.php on line 2

        mysqli로 바꿔도 같은 에러가 나와요ㅠㅠ
        어떻게 해야할까요ㅠㅠ
      • 신입1
        감사합니다`~~
      • dngold@naver.com
        2016 10 02

        Bitnami\wampstack-5.6.26-1 버전에서는 안됩니다.

        왼쪽 글목록에서, 위에 글 PDO를 사용하시면 됩니다.

        지원을 안한다고 애러가 나옵니다.
      • aningang
        process.php 파일을 실행시키면, 계속 'localhost 페이지가 작동하지 않음 (HTTP ERROR 500)'이 나옵니다.

        var_dump로 mysql 함수들 정상 접속여부 확인해봤는데, 전부 정상이구요..

        어디를 손봐야 되는건지.. 누가 힌트라도.. 좀..ㅠㅠ
      • 허민호
        공부하고있는 초보입니다
        mysql 대신 mysqli 쓰시면 됩니다
        끝에 i만 붙이면 되는게 아니고 사용법이 조금씩 달라졌네요
        php 5.4버전 이후쓰시는 분들은 올라와있는 코드 수정하셔야합니다
      • JustStudy
        고맙습니다
      • 이주환
        2016. 04. 18
        bitnami 최신버전으로 사용하고있지만 확인해본 결과 지금 예제에 나와있는대로 모두 제대로 작동됩니다.
        아직까진 특별한 문제는 없는듯 합니다.
      • SK Kim
        웹어플리케이션 수업 복습!
      • kssm1935
        park님
        위에 설명대로 기존의 'MySQL' 확장은 폐지되면서,
        'PDO'와 'mysqli'로 대치 된다고 이해하시면 될것 같네요!
        대화보기
        • park
          정말 개념이 안잡혀서 여쭤봅니다.
          php의 mysql 확장기능이 없어진다면 서버에 저장된 db를 어떤식으로 가져오나요 대체..?
          php공부할 필요가 없는건가요?
        • Jongwoo Choi
          수정하기 기능이 제대로 동작하지 않습니다.
          수정하기 클릭시 주소창에 표시되는 id 는 제대로 표시되는데 기능이 안되네요.
          기존값을 가져오지 못하는 것과 수정이 안됩니다.
          코드를 복사했는데 그러네요.
          다른 추가, 삭제 기능은 제대로 동작합니다.
        • Euiyoung Yi
          form action처리가 잘못된것 같은데요.
          대화보기
          • PAAZ
            '데이터 추가하기' 수업에 있는 코드를 그대로 복사 붙여넣기를 해도 아래의 에러가 뜹니다.

            Notice: Undefined index: mode in C:\Bitnami\wampstack-5.5.29-1\apache2\htdocs\mysql\process.php on line 4

            스택 오버플로우에 제시하는 방법대로 php.ini 내의 error_reporting 파일을 수정을 해도 고쳐지지가 않습니다.

            도와주시면 감사하겠습니다.
          • 간절합니다
            input.php 화면은 잘 뜨는데
            쿼리 전송을 하면 404 에러가 뜹니다.
            디비 연동이 안된건지 도대체 왜이런지 제발 좀 가르쳐주세요
          • egoing
            <?=가 PHP의 설정에서 지원안됨으로 되어 있으면 그럴 수 있습니다.
            대화보기
            • 냥냥이
              리눅스에서 실습중입니다.
              list.php에서 63라인에서 <h2><?=htmlspecialchars($topic['title'])?></h2> 이대로 실행시키면 아무것도 뜨지 않습니다.
              궁여지책으로 이것저것 바꿔보다가 <h2><?php echo htmlspecialchars($topic['title']); ?></h2>
              이런식으로 바꿔서 실행시키니 정상적으로 나오는것 같은데, 제가 한 방식이 맞는건가요?
              그리고 왜 위 소스대로 실행시키면 정상적으로 뜨지 않는지 알고 싶습니다.
            • 육점이
              Legacy를 이해하기 위해 필수적으로 공부해야하는 MySQL 확장!!

              항상 강의 잘 보고있습니다. 감사합니다 ~^_^


              # 'Legacy'라는 말이 정말 매력적으로 다가오네요!!
            • DakButFly
              $sql = mysql_query('SELECT * FROM favrite_actress WHERE tag LIKE \'% $x %\'');
              $row = mysql_fetch_array($sql);
              echo $row[1]; // name 값을 보여줌
              x값은 $_GET[]으로 받아올려고 하는데 방법을 모르겠습니다.
              우선 외부변수$x 값을 만들어서 ($x = smart;) 넣어 봤지만
              아무 화면도 뜨지 않습니다. 에러 조차 뜨지 않습니다.
              아무리 생각해도 마땅한 방법을 모르겠습니다.

              ps. 당연히 변수 x 자리에 직접 데이터(tag 값 = smart)을 입력하면 잘 작동합니다.
            • 금도끼은도끼
              이강의를 보고 구글링을 좀하닌가
              앞강좌 PDO 부분이 전부 이해가 가네요..
              감사합니다(__)
            • primada
              localhost가 아닌 아마존 웹 서비스를 이용해서 접속시에는, mysql 연결전에 ssh방식으로 otkey 암호를 입력해서 접속하잖아요. 그걸 php 코드로 하려면 어떻게 해야하나요?
            • sssssqew
              mysql 확장 => mysqli (강의내용에 한정됨) 함수 변경

              1. mysql_connect => mysqli_connect

              2. mysql_select_db => mysqli_select_db

              3. mysql_query => mysqli_query

              4. mysql_fetch_array => mysqli_fetch_row
            • sssssqew
              이 강의를 계속 따라오셨다면 아마 첨에 db 연동할때 확장모듈 설정 부분에서 잘 안되실 겁니다. (리눅스 사용자)

              * 해결방법

              1. cd /etc/php5/apache2/
              2. vi php.ini
              3. extension=mysql.so (php.ini 에 코드 추가)
              4. extension_dir = /usr/lib/php5/20090626 (php.ini 에 이 부분 변경)
              5. sudo service apache2 reload(or restart)

              4번의 20090626 폴더는 사용자에 따라 다를수 있습니다.
              저 순서로 하시면 mysql 디비가 연동이 되실 겁니다.
            • sssssqew
              따라하시다가 아마 php 파일을 실행하고 나서 mysql 클라이언트로 db에 직접 들어가보면
              한글로 저장한 데이터는 깨져있을 겁니다. php와 mysql 인코딩 방식이 달라서 생기는 문제라고 합니다.

              해결방법은 여러가지가 있지만 크게 php 나 mysql 설정파일(ini)을 건드리는 방법과 php 코드에 코드를
              추가하는 방법이 있습니다. 혼자 하실때는 설정파일을 건드려도 되지만 여럿이 프로젝트를 진행하시는
              미래를 위해 습관적으로 코드를 추가하는 방법이 안전할 것으로 여겨 이 방법을 알려드립니다.

              어떤 php 코드든 db에 접속하는 mysql_connect 와 mysql_select_db 코드 바로 다음에

              mysql_query("set session character_set_connection=utf8;");
              mysql_query("set session character_set_results=utf8;");
              mysql_query("set session character_set_client=utf8;");

              위 세 줄의 코드를 추가하시면 db에 저장될때 한글이 깨짐없이 잘 저장되고 다시 웹으로 불러올때도
              한글이 잘 보이실 겁니다.
            • 적주 z
              리눅스 우분투에서 MySQL 트러블 슈팅해결을 위해 익스텐션의 dll 파일이 설치된 디렉토리의 기본경로를 어떻게 알수 있나요?

              초보이다 보니 조금만 막혀도 더이상 나아갈수가 없군요.

              지금까지 멀리 왔는데 다시 윈도우로 다시 돌아갈수도 없고 많은 도움 부탁드립니다
            • coffee
              htmlspecialchars함수를 사용하시고 난 뒤,
              db에는 한글이 표시가 되는데 list.php에서는 한글이 표시가 되지 않을때 (아예 보이지 않음)
              mysql의 설정에서 (my.ini파일에서) 문자셋이 utf8인지 확인하세요
              자세한 사항은 mysql 문자셋 변경 my.ini로 구글링 하시면 도움이 됩니다.
            • 코코딩
              결론은 잘못알고 잘못하고있었던거였군요.
              답변 갑사합니다.!
              대화보기
              • egoing
                테이블을 만드셔야 합니다.
                대화보기
                • 코코딩
                  역시 계속해서 실험해본바로...
                  데이터베이스를 만들어주고... 테이블까지 만들어줘야
                  비로소 정상적으로 작동하는군요...
                  흠....

                  그렇지 않고서는..

                  Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\Bitnami\wampstack-5.4.30-0\apache2\htdocs\mysql\list.php on line 50
                  라는 오류를 계속해서 보게 되는군요...

                  제가 지금.. 잘못알고 있는건지.. 아니면 잘못하고 있는건지..
                  그것이 알고싶습니다.
                • 코코딩
                  input.php에서 글을 작성하고 제출을 하면 poecss.php를
                  거쳐서 자동으로 데이터베이스, 테이블 및 데이터가 만들어져야하는데..
                  이상하게도 SQL 모니터에서 데이터베이스랑 테이블을 만든 다음에
                  ilst.php가 작동, 및 데이터생성및 추가를 할 수 있게 되더군요...

                  데이터베이스 및 테이블을
                  sql 모니터를 통해 따로 만들지 않고
                  list.php를 실행하면


                  Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\Bitnami\wampstack-5.4.30-0\apache2\htdocs\mysql\list.php on line 50 이란 메시지가 떠요..
                  어떻게 하면 이 난관을 해결할 수 있을까요..?

                  아...

                  $result = mysql_query("INSERT INTO topic (title, description, created) VALUES ('".mysql_real_escape_string($_POST['title'])."', '".mysql_real_escape_string($_POST['description'])."', now())");

                  아.... 데이터베이스는 만들어줘야 했던거였군요...
                  지금 이거랑 씨름하고 있는중이여서.. 자꾸 글을 수정하게되네요.
                  그래도 혹시 모르니까 이렇게 수정하면서도 의견을 더 듣고 싶어서 글을 남기게 되네요.

                  코드를 보면 데이터베이스로 접속하는 부분은 있었지만
                  만들어주는 부분은 없는것이였군요?! 아닌가.... 시원스레.. 설명해주시면 고맙겠습니다. ㅎㅎ


                  좋은 강좌 고맙습니다.!
                  항상 감사한 마음으로 하나하나 보고 있습니다.!
                • ybin
                  mysqli 로 확장해서 문제 해결했습니다 ^^

                  추후에 mysqli 에 대한 강의도 있으면 좋을 것 같습니다!!
                  대화보기
                  • ybin
                    제가 강의를 통해 개인 블로그를 제작중인데요. AWS에 설치된 서버에는 PHP 5.5와 MySQL 5.5가 설치되어있습니다.

                    제가 작업을 개인 노트북에서 APMSETUP(PHP 5.2, MySQL 5.1)을 사용해서. 제작 할 때는 문제가 없었는데, 서버로 옮기니 방명록 제작한게 동작이 안되는데요. 강의를 보니 PHP5.5 에서는 MySQL확장을 지원하지 않기 때문이라고 합니다.

                    mysqli나 PDO 로 이전하려니 아직 배우는 입장에서 좀 버거운데요. 서버 PHP 를 5.5-> 5.2로 downgrade 하는 방법이 없을까요? 아니면 이전하는 방법이 가장 나을까요?
                  • egoing
                    자동으로 됩니다.
                    대화보기
                    • egoing
                      자동으로 됩니다.
                      대화보기
                      • ShotgunBlues
                        예제엔 mysql_close()를 안쓰셨던데, 없어도 이젠 무방한가요?? php를 한 7년전에 봐가지고 -,.-;;
                      • Daniel
                        으아.. 해결되서 후딱지웠는데.. ^^; 웹호스팅도 그냥 localhost로 하니 되네요. 답글 고맙습니다.
                        대화보기
                        • egoing
                          그건 웹호스팅 쪽에문의하시면됩니다
                          대화보기
                          버전 관리
                          egoing
                          현재 버전
                          선택 버전
                          graphittie 자세히 보기