▣ MySQLi 함수

 

   - MySQLi 는 MySQL Improved Extension 의 약자로 기존 MySQL 함수의 확장된 함수이다.

 

     MySQLi 함수는 기존의 함수 방식과 객체 방식 두 가지 형태로 사용할 수 있지만 PHP 5 이상에서만

 

     사용할 수 있기 때문에 호환성 문제가 있다면 MySQL 함수를 사용하도록 한다.



⊙ mysqli_connect()

 

resource mysqli_connect([string host], [string username], [string password],

                                [string dbname], [int port], [string socket])

 

   - host : MySQL 서버 주소

   - username : 데이터베이스 사용자 계정

   - password : 데이터베이스 사용자 비밀번호

   - dbname : 선택할 데이터베이스 이름

   - port : MySQL 서버 포트 번호

   - socket : 소켓 또는 명명된 파이프

 

=> 데이터베이스에 접속한다.

 

=> 데이터베이스에 접속하고 연결이 되면 MySQL 연결 정보를 객체로 되돌려준다.

 

  

 

⊙ mysql_close()

 

bool mysqli_close(mysqli link)

 

   - link : MySQL 연결 객체

 

=> 데이터베이스의 접속을 종료한다.

 

 

  

⊙ mysqli_select_db()

 

bool mysqli_select_db(mysqli link, string dbname)

 

   - link : MySQL 연결 객체

   - dbname : 선택할 데이터베이스 이름

 

=> 사용할 데이터 베이스를 선택한다. mysqli_connect() 함수 자체에 데이터베이스를 선택하는 옵션이 있기에

 

    실제로는 데이터베이스를 중간에 변경할때 사용한다.

 

  

 

⊙ mysqli_real_query()

 

bool mysqli_real_query(mysql link, string query)

 

   - link : MySQL 연결 객체

   - query : 쿼리

 

=> 데이터베이스에 쿼리를 전송한다.

 

=> 쿼리 결과를 얻으려면 mysqli_use_result() 나 mysql_store_result() 함수를 사용해야 한다.

 

  

 

⊙ mysqli_store_result()

 

mysqli_result mysqli_store_result(mysqli link)

 

   - link : MySQL 연결 객체

 

=> 마지막 쿼리의 결과 레코드를 전송한다.

 

=> insert 와 같은 쿼리는 FALSE를 반환하고, 결과 레코드를 읽어오지 못한 때에도 FALSE를 반환

 

  

 

⊙ mysqli_use_result()

 

mysqli_result mysqli_use_result(mysqli link)

 

   - link : MySQL 연결 객체

 

=> 마지막에 수행된 쿼리의 결과 레코드를 조회한다.

 

=> mysqli_use_result() 혹은 mysqli_store_result() 중 하나는 쿼리의 결과를 취득하기 전에 반드시

 

   호출되어야한다. 그렇지 않으면 다른 쿼리를 전송할 수 없다.

 

  

 

⊙ mysqli_query()

 

mixed mysqli_query(mysqli link, string query, [int resultmode])

 

   - link : MySQL 연결 객체

   - query : 쿼리

   - resultmode : mysqli_use_result / mysqli_store_result

 

=> mysqli_real_query() 함수를 호출한 후 mysqli_use_result() / mysqli_store_result() 함수를 호출한것과 같다.

 

=> resultmode의 디폴트 값은 mysqli_store_result 이다.

 

  

 

⊙ mysqli_multi_query

 

bool mysql_multi_query(mysql link, string query)

 

   - link : MySQL 연결 객체

   - query : 쿼리

 

=> 데이터베이스에 하나 이상의 쿼리를 전송한다.

 

=> MySQLi 클래스에서 새롭게 지원하는 함수로 여러 개의 쿼리를 한 번에 전송하는 기능을 한다.

 

=> 쿼리의 결과 레코드를 얻으려면 mysqli_use_result() 함수나 mysql_store_result() 함수를 사용해야 한다.

 

  

 

⊙ mysqli_next_result()

 

bool mysqli_next_result(mysqli link)

 

   - link : MySQL 연결 객체

 

=> mysqli_multi_query() 함수에 의해서 실행된 결과의 다음 레코드를 가져올 수 있도록 준비한다.

 

  

 

⊙ mysqli_more_result()

 

bool mysqli_more_result(mysqli link)

 

   - link : MySQL 연결 객체

 

=> mysqli_multi_query() 함수에 의한 결과 레코드가 더 남아있는지 확인한다.

 

=> 결과가 남아있다면 TRUE, 남아있지 않다면 FALSE 를 반환한다.

 

 

  

⊙ mysqli_fetch_array()

 

mixed mysqli_fetch_array(mysqli_result result, [int resulttype])

 

   - result : MySQLi 결과 객체

   - resulttype : MYSQLI_ASSOC, MYSQLI_NUM, MYSQLI_BOTH

 

=> mysqli_query(), mysqli_use_result(), mysqli_store_result() 함수의 결과인 mysqli_result 객체를 입력받아

 

    결과 레코드를 배열로 반환한다.

 

=> mysql_fetch_array() 함수와 동일하다.

 

=> mysqli_fetch_row(), mysqli_fetch_assoc() 함수도 역시 확장 전의 mysql 함수들과 같다.

 

  

 

⊙ mysqli_free_result()

 

void mysqli_free_result(mysqli_result result)

 

   - result : MySQLi 결과 객체

 

=> 쿼리 결과를 메모리에서 해제한다.

  


 

▣ 트랜잭션의 개념

 

   - 트랜잭션이란, 일련의 작업 과정을 하나로 묶은 더 큰 단위이다.

 

     예를들어 설명하면, 현금인출기의 동작을 세 가지로 요약해 보겠다.

 

     1. 계좌의 잔고를 확인한다.

 

     2. 계좌에서 인출금액을 감액한다.

 

     3. 인출금액을 내보낸다.

 

     이러한 과정에서 만약 2번까지 수행하고 에러가 발생한다면 고객은 잔고는 깎였는데 돈은 받지 못하는

 

     상황이 생길 수 있다. 이때 위의 3가지 과정을 하나의 트랜잭션으로 묶어서 처리하게 된다.

 

     2번 이후에 에러가 발생한다면 1,2번 과정을 모두 취소하게 되는데 이를 Rollback 이라 한다.

 

     모든 과정이 정상적으로 처리되었을때 확정을 하여 시스템에 적용하는데 이를 Commit 이라 한다.

 


  

⊙ mysqli_autocommit

 

bool mysqli_autocommitbmysqli link, bool mode)

 

   - link : MySQLi 결과 객체

   - mode : 자동 커밋의 경우 TRUE

 

=> 함수를 자동으로 커밋을 실행할지 결정하는 함수 (commit : 트랜잭션이 종료되었음을 데이터베이스에 알려줌)

 

 

  

⊙ mysqli_commit

 

bool mysqli_commit(mysqli link)

 

   - link : MySQLi 결과 객체

 

=> 현재의 트랜잭션을 커밋한다.

 

=> 커밋을 하면 수행한 트랜잭션이 실제 데이터베이스에 적용되므로 취소할 수 없다.

 

  

 

⊙ mysqli_rollback

 

bool mysqli_rollback(mysqli link)

 

   - link : MySQLi 결과 객체

 

=> 현재의 트랜잭션을 롤백한다.

 

=> 트랜잭션 중에서 수행하던 작업들을 모두 원상태로 되돌림.





1. 과거에 사용하던 트랜잭션 처리방법


$link = mysql_connect("localhost", "mysql_user", "mysql_password");

mysql_select_db("mysql_db");

mysql_query("set autocommit=0",$link);

mysql_query("begin",$link);

$ret = mysql_query("insert into aaa(no,name) values(null,'홍길동')",$link);

if ( mysql_error($link) ){

    echo "에러발생!! 확인해보세요!!";

    mysql("rollback",$link);

} else{

    echo "성공!!";

    mysql("commit",$link);

}

 


2. mysqli OOP 사용시 트랜잭션 처리방법


$mysqli = new mysqli("localhost", "mysql_user", "mysql_password", "mysql_db");

$mysqli->autocommit(false);

$ret = $mysqli->query("insert into aaa(no,name) values(null,'홍길동')");

if ( $mysqli->error ){

    echo "에러발생!! 확인해보세요!!";

    $mysqli->rollback();

} else{

    echo "성공!!";

    $mysqli->commit();

}



----------------------------------------------------------------------- MySQLi 사용예

<?php
header('Content-Type: text/html; charset=utf-8');
// DB에 접속을 합니다. 아래의 예제코드는 OOP 스타일로 했습니다.
// 물론, 기존의 함수 형태 (mysqli_*)로도 사용이 가능합니다. (PHP매뉴얼을 참조해 봅시다!)

$mysqli = new mysqli('localhost', 'root', 'password', 'dbname');

// 접속 실패시 처리
if(mysqli_connect_errno()) {
    // 여기에 접속 실패시 처리 코드 추가
}

// DB접속이 되었다 치고, 일단 테스트용 테이블을 dbname DB에 생성해 보겠습니다.
$mysqli->query("create table just_test ( uid int(11) not null auto_increment,".
    "var varchar(255) not null default '', primary key(uid))");

// dbname DB에 just_test 라는 테이블을 생성했으니, 이제 테스트용으로 데이터를 추가해 봅시다.
$mysqli->query("insert into just_test set uid = '', var = 'This is test code (English)'");
$mysqli->query("insert into just_test set uid = '', var = '이 것은 실험용 코드입니다. (한글)'");

// 데이터를 넣었으니, 이제 뽑아봅시다.
$getData = $mysqli->query("select * from just_test");
while($list = $getData->fetch_array()) {
    echo $list['var'] . ' ('.$list['uid'].') <br />';
}

// 데이터 연결을 해제합니다. (개발자가 명시해도 되고, 안해도 PHP가 알아서 해제해 줍니다.)
$mysqli->close();
?>




----------------------------------------------------------------- prepare, bind_param, bind_result, execute 효과내기


<?php 
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 
?> 



참고 : 따라하기(흉내내기) 
<?php 

class dbMySqli extends mysqli implements dbSwitch 


    # @ interface : bindParamsResult 
    # ("SELECT * FROM `TABLE` WHERE name=':1' and age=':2'",array('php',26)); 
    # ("INSERT `TABLE` (name,age) VALUES (':a',':b')",array('ajax',27)); 
    # ("DELETE FROM `TABLE` WHERE name=':A' and age=':B'",array('ax',28)); 
    public function bindParams($query,$args=array()){ 
        if(strpos($query,':') !==false){ 
            preg_match_all("/(\:[a-zA-Z0-9])/s",$query,$matches); 
            if(is_array($matches)){ 
                foreach($matches[0] as $n => $s){ 
                    $query = str_replace($s,$args[$n],$query); 
                } 
            } 
        } 
    return $query; 
    } 




## 사용방법 (영문 대소문자 , 숫자 어떤거든 상관없음 중복되면 안됨) 
@숫자 
$mysqli->bindParams("SELECT * FROM `TABLE` WHERE name=':1' and age=':2'",array('나당',27)); 
); 

@영문 소문자 
$mysqli->bindParams("SELECT * FROM `TABLE` WHERE name=':a' and age=':b'",array('나당',27)); 
); 


@ 영문 대문자 
$mysqli->bindParams("SELECT * FROM `TABLE` WHERE name=':1' and age=':2'",array('나당',27)); 
); 


@ 숫자,영문 
$mysqli->bindParams("SELECT * FROM `TABLE` WHERE name=':1' and age=':a'",array('나당',27)); 
);

?>


---------------------------------------------------------------------------------------------------------------------------------------------------------------------


Example #1 Object oriented style

<?php
$mysqli 
= new mysqli("localhost""my_user""my_password""world");

/* check connection */
if (mysqli_connect_errno()) {
    
printf("Connect failed: %s\n"mysqli_connect_error());
    exit();
}

$mysqli->query("CREATE TABLE myCity LIKE City");

/* Prepare an insert statement */
$query "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)";
$stmt $mysqli->prepare($query);

$stmt->bind_param("sss"$val1$val2$val3);

$val1 'Stuttgart';
$val2 'DEU';
$val3 'Baden-Wuerttemberg';

/* Execute the statement */
$stmt->execute();

$val1 'Bordeaux';
$val2 'FRA';
$val3 'Aquitaine';

/* Execute the statement */
$stmt->execute();

/* close statement */
$stmt->close();

/* retrieve all rows from myCity */
$query "SELECT Name, CountryCode, District FROM myCity";
if (
$result $mysqli->query($query)) {
    while (
$row $result->fetch_row()) {
        
printf("%s (%s,%s)\n"$row[0], $row[1], $row[2]);
    }
    
/* free result set */
    
$result->close();
}

/* remove table */
$mysqli->query("DROP TABLE myCity");

/* close connection */
$mysqli->close();
?>

Example #2 Procedural style

<?php
$link 
mysqli_connect("localhost""my_user""my_password""world");

/* check connection */
if (mysqli_connect_errno()) {
    
printf("Connect failed: %s\n"mysqli_connect_error());
    exit();
}

mysqli_query($link"CREATE TABLE myCity LIKE City");

/* Prepare an insert statement */
$query "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)";
$stmt mysqli_prepare($link$query);

mysqli_stmt_bind_param($stmt"sss"$val1$val2$val3);

$val1 'Stuttgart';
$val2 'DEU';
$val3 'Baden-Wuerttemberg';

/* Execute the statement */
mysqli_stmt_execute($stmt);

$val1 'Bordeaux';
$val2 'FRA';
$val3 'Aquitaine';

/* Execute the statement */
mysqli_stmt_execute($stmt);

/* close statement */
mysqli_stmt_close($stmt);

/* retrieve all rows from myCity */
$query "SELECT Name, CountryCode, District FROM myCity";
if (
$result mysqli_query($link$query)) {
    while (
$row mysqli_fetch_row($result)) {
        
printf("%s (%s,%s)\n"$row[0], $row[1], $row[2]);
    }
    
/* free result set */
    
mysqli_free_result($result);
}

/* remove table */
mysqli_query($link"DROP TABLE myCity");

/* close connection */
mysqli_close($link);
?>

위 예제의 출력:

Stuttgart (DEU,Baden-Wuerttemberg)
Bordeaux (FRA,Aquitaine)