...
MySQLi 와 PDO
현재 PHP에서 MySQL 데이터베이스에 연결하기 위해 사용할 수 있는 API는 다음과 같다.
- MySQL improved extension(MySQLi extension)
- PHP Data Objects(PDO)
이 두 확장 라이브러리는 각각 장단점이 있으며, 사용 방법과 기능도 조금씩 다르다. 다만 두 가지 API는 각각 장단점을 가지지만, MySQL 환경에서 성능상의 큰 차이를 보이지는 않는다. 따라서 자신이 사용하기 편한 API를 선택하는 것이 좋다.
MySQLi
MySQLi는 MySQL 데이터베이스와 상호작용하기 위한 PHP의 확장 라이브러리이다. MySQLi는 객체 지향적인 접근 방식을 사용하며, 이전 버전의 MySQL과의 호환성도 지원한다. MySQLi의 장점은 다음과 같다.
- 성능 : MySQLi는 MySQL과 직접 통신하기 때문에 PDO보다 더 빠르다
- 객체 지향 : MySQLi는 객체 지향적인 접근 방식을 사용하기 때문에 코드의 가독성이 좋아지고, 유지보수가 쉬워진다
- 보안 : MySQLi는 Prepared Statements와 같은 보안 기능을 지원한다
PDO
PDO는 PHP에서 여러 종류의 데이터베이스와 상호작용하기 위한 추상화 레이어이다. PDO는 MySQL, PostgreSQL, SQLite 등 다양한 데이터베이스에 대해 호환성이 있으며, 같은 방법으로 작성된 코드를 다른 데이터베이스로 쉽게 이전할 수 있다는 특징이 있다. PDO의 장점은 다음과 같다.
- 호환성 : PDO는 여러 종류의 데이터베이스와 호환성이 있다.
- 보안 : PDO는 Prepared Statements와 같은 보안 기능을 지원한다.
- 가독성 : PDO는 바인딩 변수를 사용하여 SQL 쿼리를 작성하기 때문에 가독성이 좋아진다.
MySQLi 사용법
서버 연결
<?php
$servername = "localhost";
$user = "choi";
$password = "0219";
$dbname = "testDB";
$connect = mysqli_connect($servername, $user, $password, $dbname);
if (!$connect) {
// die() 함수는 인수로 전달받은 메시지를 출력하고, 현재 실행 중인 PHP 스크립트를 종료시키는 함수입니다.
die("서버와의 연결 실패! : ".mysqli_connect_error());
}
echo "서버와의 연결 성공!";
?>
서버 연결 종료
<?php
mysqli_close($connect);
?>
DB 생성
mysqli_query() 함수는 인수로 전달받은 SQL 구문을 실행하여, 그 결과를 반환하는 함수입니다.
이 함수는 해당 구문의 실행에 실패하면 FALSE를 반환합니다.
그리고 SELECT, SHOW, DESCRIBE, EXPLAIN 문을 성공적으로 실행했을 경우에는 해당 결과가 저장된 결과 집합인 mysqli_result 객체를 반환하며, 그 외의 구문이 성공적으로 실행되면 TRUE를 반환합니다.
<?php
$sql = "CREATE DATABASE Hotel";
if (mysqli_query($connect, $sql)) {
echo "데이터베이스 생성 성공!";
} else {
echo "데이터베이스 생성 실패! : ".mysqli_error($connection);
}
mysqli_close($connection);
?>
테이블 생성
<?php
$sql = "CREATE TABLE Reservation
(
ID INT PRIMARY KEY,
Name VARCHAR(30) NOT NULL,
ReservDate DATE NOT NULL,
RoomNum INT
)";
if (mysqli_query($connect, $sql)) {
echo "테이블 생성 성공!";
} else {
// mysqli_error() 함수는 마지막으로 발생한 에러에 대한 정보를 문자열로 반환하는 함수
echo "테이블 생성 실패! : ".mysqli_error($connection);
}
?>
레코드 추가
<?php
// VALUES 절을 통해 전달한 데이터로 Reservation 테이블에 새로운 레코드를 추가하는 SQL 구문
$sql = "INSERT INTO Reservation(ID, Name, ReserveDate, RoomNum)
VALUES(5, '이순신', '2016-02-16', 1108)";
if (mysqli_query($connect, $sql)) {
echo "레코드 추가 성공!";
} else {
echo "레코드 추가 실패! : ".mysqli_error($connection);
}
?>
여러 레코드 추가
mysqli_multi_query() 함수를 사용하면, 여러 레코드를 한 번에 추가할 수 있습니다.
이때 각각의 INSERT 문은 반드시 세미콜론(;)으로 구분하여 하나의 문자열로 전달해야 합니다.
<?php
$sql = "INSERT INTO Reservation(ID, Name, ReserveDate, RoomNum)
VALUES(1, '홍길동', '2016-01-05', 2014);";
$sql .= "INSERT INTO Reservation(ID, Name, ReserveDate, RoomNum)
VALUES(2, '임꺽정', '2016-02-12', 918);";
$sql .= "INSERT INTO Reservation(ID, Name, ReserveDate, RoomNum)
VALUES(3, '장길산', '2016-01-16', 1208)";
if (mysqli_multi_query($connect, $sql)) {
echo "레코드 추가 성공!";
} else {
echo "레코드 추가 실패! : ".mysqli_error($connection);
}
?>
레코드 수정
<?php
$sql = "UPDATE Reservation
SET RoomNum = 2002
WHERE Name = '홍길동'";
if (mysqli_query($connect, $sql)) {
echo "레코드 수정 성공!";
} else {
echo "레코드 수정 실패! : ".mysqli_error($connection);
}
?>
레코드 삭제
<?php
$sql = "DELETE FROM Reservation
WHERE Name = '홍길동'";
if (mysqli_query($connect, $sql)) {
echo "레코드 삭제 성공!";
} else {
echo "레코드 삭제 실패! : ".mysqli_error($connection);
}
?>
레코드 가져오기
Reservation 테이블에 존재하는 모든 레코드의 Name 필드와 ReserveDate 필드의 값을 선택하는 SQL 구문을 작성합니다.
이렇게 작성된 SQL 구문은 mysqli_query() 함수를 통해 실행되고, 그 결과 집합은 변수 $result에 저장됩니다.
if문에서 mysqli_stmt_num_rows() 함수를 사용하여 결과 집합의 총 행(row)의 수를 검사하며, 그 결과가 하나 이상일 때만 while 문을 실행시키고 있습니다.
while문에서 mysqli_fetch_assoc() 함수는 인수로 전달받은 결과 집합에서 하나의 행(row)을 불러와 연관 배열(associative array)로 반환합니다. 따라서 선택한 필드의 이름을 인덱스로 사용하여 결과를 출력할 수 있게 됩니다.
<?php
$sql = "SELECT Name, ReserveDate FROM Reservation"; // 쿼리
$result = mysqli_query($connection, $sql); // 쿼리 실행
if (mysqli_stmt_num_rows($result) > 0) { // 집합이 1이상 있을 경우
while ($row = mysqli_fetch_assoc($result)) { // 집합에서 하나씩 레코드를 꺼내 연관배열로 저장
echo $row['Name']."님의 예약일자 : ".$row['ReserveDate']."<br>"; // 연관배열 인덱스 접근
}
} else {
echo "검색된 결과가 없습니다.";
}
?>
# 참고자료
http://www.tcpschool.com/mysql/mysql_php_connection
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.