[PHP] MySQLi 확장을 이용하여 MySQL에 연결하는 방법

[PHP] MySQLi 확장을 이용하여 MySQL에 연결하는 방법

PHP는 매우 다양한 데이터베이스 관리 시스템을 활용할 수 있습니다. 오라클 데이터베이스, MS-SQL, PostgreSQL, SQLite, Cubrid 등 사용할 수 있는 DBMS는 매무 많지만, 특히 PHP에서는 MySQL 데이터베이스 시스템이 가장 많이 사용되고 있습니다. MySQL도 PHP와 같이 오픈소스이고 무료로 이용할 수 있다는 점에서 PHP와 MySQL의 조합은 전 세계적으로 가장 유명한 웹 프로그래밍 조합입니다. PHP에서 MySQL을 사용하는 방법으로는 몇 가지가 있는데 가장 권장되는 사용되는 방법은 MySQLi 확장을 이용하는 방법입니다.

※ PHP MySQLi 확장 매뉴얼
http://php.net/manual/en/book.mysqli.php

MySQL 확장과 MySQLi 확장의 차이점은?

PHP가 웹프로그래밍 언어로서 큰 인기를 얻고 있을 1990년대 무렵부터 MySQL 확장이 이용되었습니다. MySQL 버전이 업데이트되거나 PHP 버전이 업데이트될 때마다 MySQL 확장도 발전을 거듭하면서 PHP에서 MySQL 데이터베이스를 이용할 때 반드시 활용되는 필수적인 확장이 되었습니다. PHP 5.0이 발표되기 전까지 MySQL은 PHP와의 연동성에서 좋은 성능을 보여주었습니다.

하지만, 개발상의 어려움이 찾아오면서 MySQL 확장의 추가적인 개발은 더이상 힘들어지게 됩니다. 아무래도 MySQL의 구조가 매우 복잡했었기 때문에 버전업을 할 때마다 큰 어려움을 겪은 것 같습니다. 이와 같은 문제를 해결하기 위하여 PHP 5에 대응할 수 있고 MySQL 4.1을 완벽하게 지원할 수 있는 새로운 MySQL 확장이 개발되었습니다. 바로 MySQLi입니다.

MySQLi의 i는 향상된(improved), 연결(interface), 독창적인(ingenious), 비호환적인(incompatible), 미완성인(incomplete)을 의미한다고 합니다. PHP MySQL의 새로운 확장, MySQLi의 주요한 특징은 다음과 같습니다.

  • MySQL 확장의 소스코드는 다소 복잡하고 조잡했었다. MySQLi 확장은 이 문제를 해결하였다.
  • MySQL 클라이언트 라이브러리와의 호환성이 높아졌다.
  • MySQL 확장과의 호환성은 완벽하지 않지만, 약간의 수고만 하면 MySQL 기반 소스코드를 MySQLi 기반 소스코드로 포팅할 수 있다.
  • MySQL 확장보다 최대 40% 빠른 속도를 지원한다.
  • MySQL 확장보다 패스워드 생성 등의 보안 기능이 강화되었다.

MySQL 4.1 이상의 버전을 사용하기 위해서는 MySQLi 확장을 이용하는 것이 좋습니다. 기존의 MySQL 확장에서는 MySQL 4.1 이상을 완벽하게 지원하지 않기 때문입니다. MySQLi 확장은 PHP 5에서부터 지원하는 확장입니다. PHP 4 이하 버전을 사용하고 있다면 MySQLi 확장을 이용할 수 없습니다.

MySQLi 확장 사용 방법

MySQLi 확장의 사용 방법은 MySQL 확장의 사용 방법과 상당히 비슷합니다. 한 가지 차이점을 들어보자면, MySQLi 확장에서는 객체 지향적인 인터페이스를 사용할 수 있다는 점입니다. MySQL 확장은 단독 함수들만을 제공했었지만, MySQLi 확장은 객체 지향적인 클래스를 기본적으로 제공합니다.

아래의 예제는 MySQLi 확장 함수를 사용하여 MySQL 데이터베이스에 연결한 후 쿼리문을 서버에 전송하는 소스코드입니다. MySQLi 확장에서도 단독 함수를 사용하여 데이터베이스에 연결하는 것은 가능합니다. MySQL 확장 함수에 i만 붙여주면 됩니다.

<?php
// MySQL 데이터베이스 연결
$link = mysqli_connect($host, $user, $password, $dbname);
  
// 연결 오류 발생 시 스크립트 종료
if (mysqli_connect_errno()) {
    die('Connect Error: '.mysqli_connect_error());
}
  
// 쿼리문 전송
if ($result = mysqli_query($link, 'SELECT * FROM `temp`, MYSQLI_USE_RESULT)) {
    // 레코드 출력
    while ($row = mysqli_fetch_object($result)) {
        echo $row->name.' / '.$row->desc.'<br />';
    }
     
    // 메모리 정리
    mysqli_free_result($result);
}
 
// 접속 종료
mysqli_close($link);

클래스가 아닌 함수를 사용할 때에는 데이터베이스 연결 리소스가 저장되어 있는 $link 함수를 함수에 전달해야 하는 불편함이 있습니다. 그리고 쿼리문의 결과(result)를 별개의 변수에 따로 저장해야 하는 불편함도 있습니다. 이 문제는 클래스 객체를 사용함으로써 해결할 수 있습니다. MySQLi 확장은 객체 지향적인 클래스를 제공합니다. MySQLi 확장의 가장 큰 장점이 바로 객체 지향 인터페이스를 제공한다는 점입니다.

PHP 4 버전까지는 상당히 부실하였던 객체 지향적인 요소가 PHP 5에 많이 추가되었는데, PHP가 자바(Java)와 같은 객체 지향적인 프로그래밍 언어를 지향하는 데에는 객체 지향 인터페이스는 속도가 빠르고 캡슐화할 수 있다는 장점을 가지고 있기 때문입니다. MySQLi 확장도 PHP의 개발 흐름에 맞추어 객체 지향적인 속성를 기본으로 합니다.

아래의 예제는 MySQLi 확장의 객체 지향 인터페이스를 사용하는 소스코드입니다.

<?php
// MySQL 데이터베이스 연결
$mysqli = new mysqli($host, $user, $password, $dbname);
 
// 연결 오류 발생 시 스크립트 종료
if ($mysqli->connect_errno) {
    die('Connect Error: '.$mysqli->connect_error);
}
 
// 쿼리문 전송
if ($result = $mysqli->query('SELECT * FROM `temp`)) {
    // 레코드 출력
    while ($row = $result->fetch_object()) {
        echo $row->name.' / '.$row->desc.'<br />';
    }
     
    // 메모리 정리
    $result->free();
}
 
// 접속 종료
$mysqli->close();

객체 지향 인터페이스를 사용하면 데이터베이스 연결 리소스를 함수에 전달할 필요 없이, 해당 객체가 하나의 데이터베이스 연결 객체로서 작동합니다. 개발자는 이 객체만 따로 저장해두면 스크립트의 어디에서든지 이 객체를 불러와 데이터베이스 연결 리소스로서 사용할 수 있는 것입니다. 객체 지향 인터페이스를 사용함으로써 한 개의 스크립트에서 여러 MySQL 데이터베이스에 연결하는 것이 굉장히 편리해졌습니다.

mysqli::query 메소드는 mysqli_result 객체를 반환합니다. mysqli_result 객체는 실행된 쿼리문의 결과가 저장되는 객체입니다. MySQL 확장에서의 쿼리문 실행 결과 값은 하나의 리소스로 구성되었지만, MySQLi 확장에는 하나의 객체가 쿼리문 결과 값이 됩니다. 이 객체에 포함되어 있는 각종 메소드를 실행함으로써 데이터베이스에서 반환된 레코드를 사용할 수 있는 것입니다.

마무리

지금까지 PHP에서 MySQL 데이터베이스를 이용하는 방법 중 하나인 MySQLi 확장에 대하여 알아보았습니다. 아직도 몇몇 웹 프로그램에서는 MySQL 확장을 사용하고 있습니다. 물론 PHP 5 미만의 버전을 사용하고 있다면 어쩔 수 없지만, PHP 5 이상의 버전을 사용하고 있다면 MySQL 데이터베이스에 연결함에 있어서는 반드시 MySQLi 확장을 사용해야 합니다. MySQLi 확장이 속도도 빠르고 보안성도 높기 때문입니다.

이 글에서는 MySQL 데이터베이스에 연결하는 방법에 대해서만 알아보았지만, 다음 글에서는 데이터베이스에서 자료를 얻어 목록을 만들고 가공하는 방법에 대하여 알아보도록 하겠습니다.

타이틀 이미지: Andy Melton, Beginner’s Bible, Flickr. CC BY-SA 2.0.

4 Comments
  1. php_network_getaddresses: getaddrinfo failed: Name or service not known 이런 에러가 뜨는데 혹시 해결방법을 알고 계신가요?

    1. 함수 사용이 잘못된 것 같습니다. getaddrinfo() 함수가 사용되었는지 확인해보세요.

      1. getaddrinfo() 사용법을 알려주실수 있나요? 구글링을 해봐도 php에서 사용하는법이 나오질 않네요ㅠㅠ 제가 php는 처음 해봐서 ㅠㅠ

        1. 알아보니 getaddrinfo() 이 함수는 PHP 내부적으로 사용되는 함수이고, PHP 스크립트에서 다른 웹서버에 연결을 시도할 때 해당 서버에 연결할 수 없을 때 오류가 발생한다고 합니다. PHP 스크립트에 문제가 있는 것은 아니고 웹서버에 문제가 있는 것으로 보입니다.

Leave a reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다