선생님을 위한 프로그래밍 수업

MySQL 확장

토픽 선생님을 위한 프로그래밍 수업 > 웹 애플리케이션 만들기 > PHP
본 수업은 상위 수업인 데이터베이스 토픽의 후속 수업이기 때문에 데이터베이스 토픽을 먼저 보셔야 합니다.

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. Hyo Jin Song
    deprecated 되었다는 작은 경고창으로는 부족하다고 생각됩니다.
    아예 시도도 하지 않도록 본문을 접어놓은 상태로
    '기존의 낡은 코드를 부득이하게 다뤄야 해서 배우겠습니다. 이로 인한 모든 문제 발생시 책임은 본인에게 있음을 인정합니다.'
    같은 문구에 동의 할 경우에만 본문이 노출되는 정도의 강력한 조치가 필요합니다.
    감사합니다.
  2. 코랑아빠
    최고입니다. 정말 열심히 공부해보겠습니다. 너무너무 감사합니다.
    네트워크 강의도 있다면 더더 열심히 공부하겠습니다!
  3. 뭉치우석
    아래 이요한 님 댓글 보고 살았어요.
    mysqli... 후우. 감사합니다.
  4. 드림보이
    2021.10.23. MySQL 확장 파트 수강완료
  5. jeisyoon
    2021.08.01 MySQL 확장 - PASS

    PC를 교체하여 Bitnami를 새로 Install 하였는데 bitnami-wampstack-8.0.9-0 으로 Version이 바뀌었고
    이전 Version 인 bitnami-wampstack-7.4.15-1 과 다른 점이 있어 알려 드립니다.

    1. MySQL 대신 MariaDB 로 DB가 바뀌었음.
    2. MariaDB Extension 에는 php_mysql.dll 확장자가 없어 MySQL 확장 수업을 할 수가 없음.
    3. DB만 바뀌었을 뿐 MySQL PDO 코드 수정없이 잘 작동 됨.
    4. 명령 프롬프트(cmd) 상에서 사용했던 모든 command 도 한자 수정없이 잘 작동됨.

    이후 수강하시는 분은 Bitnami 를 Install 할 때 당황하지 마시고 수업내용 그대로 따라 하시면 됩니다.
  6. 미댈
    한참 헤매다가 겨우 해결했네요..

    1. php.ini파일에 extension=php_mysqli.dll 추가후 서버 재시작

    2. list.php
    <?php
    $conn = mysqli_connect('localhost', 'root', '111111', 'opentutorials');
    $list_result = mysqli_query($conn, 'SELECT * FROM topic');

    if(!empty($_GET['id'])) {
    $topic_result = mysqli_query($conn, 'SELECT * FROM topic WHERE id = '.mysqli_real_escape_string($conn, $_GET['id']));
    $topic = mysqli_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 = mysqli_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>

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

    4. modify.php
    <?php
    $conn = mysqli_connect('localhost', 'root', '111111', 'opentutorials');
    $result = mysqli_query($conn, 'SELECT * FROM topic WHERE id = '.mysqli_real_escape_string($conn, $_GET['id']));
    $topic = mysqli_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>

    5. input.php는 그대로 사용하시면 됩니다.
  7. 이요한
    PHP7에서는 mysql 함수를 사용하지 못하고, mysqli 클래스의 구성요소만 사용가능합니다. 다만 mysql_connect같은 함수들을 mysqli_connect로 대체할 수 있기는 합니다.

    그런데 주의할 점이 하나 더 있는데 기존의 mysql_select_db 함수는 mysql_connect 명령어가 실행한 뒤에 알아서 계정을 연결하지만 함수명을 mysqli_select_db로 바꾸면 변수명으로 앞에 반드시 "mysqli_connect" 정보를 요구합니다. PHP7 업데이트해서 mysql 함수가 작동하지 않으면...

    1. mysql_connect('localhost', ... ); 이 부분을 $connect=mysqli_connect('localhost', ...); 이렇게 정의해서 변수명 형태로 지정해주신 뒤에

    2. mysql_select_db('dbname'); 형태는 mysqli_select_db($connect, 'dbname');으로,

    3. mysql_query('(MySQL문)'); 부분은 mysqli_query($connect, '(MySQL문)'); 형태로 바꾸면 문제가 해결될 것 같습니다.
  8. fletbel
    php는 언어가 오래되었다 보니 버전에 따라 deprecated 된 함수가 있는 경우 오류가 날 수 있으니 버전확인을 해보시기 바랍니다.
  9. jslee
    휴우 님이 2년 전에 작성한글...


    현재 php가 아랫분 말대로 mysql 지원이 안되는지 저도 구글링후 mysqli로 해서 해결하였어요~
    이 후에 공부하시는분들 참고하시길
    대화보기
    • jslee
      iis 웹서버를 첨부터 쓰는 지라...mysql 과 php 설치하느라
      삽질좀 했네요. 제가 초보라서...ㅎㅎ
      그리고
      php 버전에따른 명령어가 살짝 달라서...이것도 고생했네요..
      뭐든지 고생하며 배우면 기억이 오래가진 않더군요...오히려 헛갈려서..ㅋㅋ 모두들 열공하며 같이 해요.ㅎ
      대화보기
      • hyun222
        저도 Uncaught Error: Call to undefined function mysqli_connect() in 에러 떴는데
        php.ini 파일 위치 변경하니까 해결됐어요

        https://blog.naver.com......779

        여기 들어가셔서 따라해보세요
      • 들국화
        잘봤습니다
      • minhyeok9401
        php 에서 mysql 이 아닌 Redshift 서버도 연결할수있나요?
      • hankh0821
        <?php
        $conn = mysqli_connect("localhost", "root", "비밀번호", "opentutorials");
        mysqli_select_db($conn, "opentutorials");
        이런식으로 mysqli로 변경하였는데
        Uncaught Error: Call to undefined function mysqli_connect() in ~~ 이런오류가 발생하는데
        어떻게 해결해야 할까요??
      • 휴우
        현재 php가 아랫분 말대로 mysql 지원이 안되는지 저도 구글링후 mysqli로 해서 해결하였어요~
        이 후에 공부하시는분들 참고하시길
      • 다시시작
        완료
      • 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

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

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

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

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

        참고로 extension 설정 해도 에러가 해결이 안되네요
      • 박지수
        PHP의 My SLQ 확장과 데이터 삭제 첫 화면에 SLQ로 오타 있습니다.
      • 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 코드로 하려면 어떻게 해야하나요?
                • 적주 z
                  리눅스 우분투에서 MySQL 트러블 슈팅해결을 위해 익스텐션의 dll 파일이 설치된 디렉토리의 기본경로를 어떻게 알수 있나요?

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

                  지금까지 멀리 왔는데 다시 윈도우로 다시 돌아갈수도 없고 많은 도움 부탁드립니다
                • coffee
                  htmlspecialchars함수를 사용하시고 난 뒤,
                  db에는 한글이 표시가 되는데 list.php에서는 한글이 표시가 되지 않을때 (아예 보이지 않음)
                  mysql의 설정에서 (my.ini파일에서) 문자셋이 utf8인지 확인하세요
                  자세한 사항은 mysql 문자셋 변경 my.ini로 구글링 하시면 도움이 됩니다.