Programming

MySQL 데이터베이스에서 mysqli(MySQL Improved) 사용법

flcat 2019. 6. 30. 05:45

PHP에서 MySQL 데이터베이스에 연결해서 작업하는데 사용되는 API 가 세 종류 있다.

 

1. mysql API : 가장 오래전 부터 사용되어져 오는 것으로 mysql_ 로 시작하는 함수들로 구성되어 있다. 현재는 deprecated 되어서 더이상 사용하지 않는 것이 좋다.

 

2. mysqli (mysql improved) API (PHP 5, PHP 7) : mysql 함수를 개선한 것으로 prepared statement 를 사용할 수 있다.

 

3. PDO (PHP Data Object) API (PHP 5 >= 5.1.0, PHP 7) : PDO 는 PHP 를 사용하여 서로 다른 종류의 데이터베이스에 접근하는 공통 API 를 제공하는 것을 목표로 만들어 졌다. 객체 기반의 API 이고, prepared statement를 제공다.


이 중에서 mysqli 를 사용하는 방법을 알아 보려한다. mysqli 에서는 prepared statement 를 사용할 수 있게 되어서, 입력값에 대한 복잡한 제거나, 치환 작업 없이 SQL 인젝션 공격에 대한 방어를 할 수 있다. mysqli 는 객체지향 스타일(객체 메소드 호출 형태)의 API 와 절차지향 스타일(함수 호출 형태)의  API 를 제공한다. 여기에서는 절차지향 스타일의 예를 하려고 한다.

 

 

1. 데이터베이스 연결하기

 

<?php $db_conn = @mysqli_connect("localhost", "my_userid", "my_password", "my_db");
if (!$db_conn) {
$error = mysqli_connect_error();
$errno = mysqli_connect_errno();
print "$errno: $error\n";
exit();
}
mysqli_close($db_conn);
?>

 

mysqli_connect 함수의 인자는 다음과 같다.


"localhost" : 데이터베이스 서버의 IP 또는 도메인 주소
"my_userid" : 데이터베이스 사용자 아이디
"my_password" : 데이터베이스 사용자 비밀번호
"my_db" : 사용할 데이터베이스명

 

이외에 기본 포트 3306 을 다른 것으로 변경하였다면, 다섯번째 인자에 새 포트를 입력하면 된다.


 

2. 간단한 조회 쿼리 사용하기

 

<?php
$query = "SELECT no, title, content FROM board";
$result = mysqli_query($db_conn, $query);
if ( $result ) {
echo "조회된 행의 수 : ".mysqli_num_rows($result)."<br />";
while ($row = mysqli_fetch_assoc($result)) {
printf ("%s : %s <br />", $row["no"], $row["title"]); }
// 결과 해제
mysqli_free_result($result);
} else {
echo "Error : ".mysqli_error($db_conn); }
?>

 

$result로 부터 결과를 가져오는데는 다음 세 가지 함수를 사용할 수 있다.

 

- $row = mysqli_fetch_assoc($result); :  연관배열을 반환합니다. 컬럼명 ( $row['no'] ) 으로 값을 가져 올 수 있다.

컬럼명은 대소문자를 구분한다.
- $row = mysqli_fetch_row($result); : 숫자 인덱스의 배열을 반환한다. ( $row[0] )
- $row = mysqli_fetch_array($result); :  연관배열과 숫자 인덱스 배열을 모두 사용할 수 있다.

 

 

3. 파라미터를 가지는 조회 (prepared statement 사용하기)

 

<?php

$query = "SELECT no, title FROM board WHERE title LIKE ? AND no > ?";

$keyword = "%제목%";

$no = 5;

$stmt = mysqli_prepare($db_conn, $query);

if($stmt === false) {

echo('Statement 생성 실패 : ' . mysqli_error($db_conn));

exit(); }

$bind = mysqli_stmt_bind_param($stmt, "si", $keyword, $no);

if($bind === false) {

echo('파라미터 바인드 실패 : ' . mysqli_error($db_conn)); exit(); }

$exec = mysqli_stmt_execute($stmt);

if($exec === false) {

echo('쿼리 실행 실패 : ' . mysqli_error($db_conn)); exit(); }

$result = mysqli_stmt_get_result($stmt);

if ( $result ) {

echo "조회된 행의 수 : ".mysqli_num_rows($result)."<br />";

while ($row = mysqli_fetch_assoc($result)) {

printf ("%s : %s <br />", $row["no"], $row["title"]); } // 결과 해제

mysqli_free_result($result); // statement 해제

mysqli_stmt_close($stmt);

} else {

echo "Error : " . mysqli_error($db_conn); }

?>

 

mysqli_stmt_bind_param($stmt, "si", $keyword, $no); 에서 처럼 파라미터 타입을 나타내는 문자열이  두 번째 인자로 주어지고, 그 위에 파라미터들을 입력한다. $keyword 는 문자열이므로 "s", $no 는 정수이므로 "i" 를 각각 지정한다.

 

파라미터 타입 문자열에 사용되는 값은 다음과 같다.

- i : integer
- d : double
- s : string
- b : blob

 

 

4. 입력, 수정, 삭제 쿼리 수행하기

 

<?php

$query = "INSERT board (no, title) values (?,?)";

$no = 5;

$title = "제목";

$stmt = mysqli_prepare($db_conn, $query);

if($stmt === false) {

echo('Statement 생성 실패 : ' . mysqli_error($db_conn)); exit(); }

$bind = mysqli_stmt_bind_param($stmt, "is", $no, $title);

if($bind === false) {

echo('파라미터 바인드 실패 : ' . mysqli_error($db_conn)); exit(); }

$exec = mysqli_stmt_execute($stmt);

if($exec === false) {

echo('쿼리 실행 실패 : ' . mysqli_error($db_conn)); exit(); }

echo "영향을 받은 행의 수 : ".mysqli_stmt_affected_rows($stmt)."<br />"; // statement 해제 mysqli_stmt_close($stmt);

?>

 

5. 자동증가 값 알아내기

 

$newNo = mysqli_insert_id($db_conn);

 

mysqli_stmt_execute($stmt) 가 성공하면 바로 호출하면 된다.

 


6. 트랜잭션 사용하기

 

PHP 5 이상 이고, MySQL은  InnoDB 엔진을 사용해야 한다.

 

- 자동 커밋을 끄면 트랜잭션의 시작이 된다.

mysqli_autocommit($db_conn, FALSE);


- 성공하면 다음을 호출하여 커밋한다.
mysqli_commit($db_conn);

 

- 실패하면 다음을 호출하여 롤백 한다.
mysqli_rollback($db_connd);



출처: https://offbyone.tistory.com/2 [쉬고 싶은 개발자]