# Database 소개

## 📌 주요 function <a href="#function" id="function"></a>

### **bind\_param\_push**

```php
bind_param_push($bindParam, $type, $value)
```

* binding처리를 위한 파라미터를 정의하고 배열형태로 저장합니다.
* WHERE 절에 저장될 파라미터 정보 타입인 `$type`과 파라미터 값인 `$value` 를 배열형태의 `$bindParam`값으로 저장하여 반환합니다.

### **query\_complete**

```php
query_complete($isReset)
```

* 멤버 변수에 저장했던 쿼리문의 각 요소`(field, join, where, group, order. limit)`값에 조건절에 맞는 쿼리문을 추가하여 값을 생성합니다.
* `bool`타입의 `$isReset` 파라미터로 사용한 멤버 변수의 리셋 여부를 설정할 수 있습니다.

### **query\_fetch**

```php
query_fetch($strSQL, array $arrBind, bool $dataArray)
```

* `$strSQL`에 쿼리문을 저장하고, binding처리된 파라미터가 저장된 `$arrBind`로 쿼리 결과를 출력합니다.
* `$arrBind`는 반드시 배열타입으로 지정해야 합니다.
* `bool`타입의 `$dataArray` 파라미터로 결과 데이터의 배열 타입 출력 여부를 결정합니다.

### **get\_binding**

```php
get_binding($defaultSetting, $arrData, $dbType, $arrInclude, $arrExclude)
```

* binding 데이터를 배열처리하여 결과를 반환합니다.
* `$defaultSetting`에는 처리할 테이블의 기본값 배열을 저장하고 `$arrInclude`에는 `$defaultSetting`에 저장된 기본값 배열에서 사용할 필드명을, `$arrExclude`에는 제외할 필드명을 저장합니다. `$arrData`에는 처리할 데이터, `$dbType`에는 처리 방식`(insert|update|select|delete)`을 저장하여 기본값 데이터에서 처리할 데이터를 추출하여 배열형태로 결과를 반환합니다.

### **set\_insert\_db**

```php
set_insert_db($dbTable, $arrTableField, $arrTableValue, $bindChk, $debug)
```

* `$dbTable`에 저장할 테이블 명을 넣고 해당 테이블 데이터 필드 정보가 담긴 `$arrTableField`와 값 정보가 담긴 `$arrTableValue`로 insert 쿼리를 실행합니다.
* `$bindChk` 파라미터에 `‘y’` 값을 저장하면 쿼리에 저장되어있는 파라미터를 binding 처리하여 쿼리를 실행합니다.

### **set\_update\_db**

```php
set_update_db($dbTable, $arrTableParam, $strWhere, $arrBindParam, $debug)
```

* `$dbTable`에 수정할 테이블 명을 넣고 수정할 테이블의 필드 및 값 정보가 담긴 `$arrTableParam`과 WHERE 절이 담긴 `$strWhere`, binding처리된 파라미터 배열 값인 `$arrBindParam`을 받아 update 쿼리를 실행합니다.
* 실행 후 update가 적용된 레코드 개수를 반환합니다.

### **set\_delete\_db**

```php
set_delete_db($dbTable, $strWhere, $arrBindParam, $debug)
```

* `$dbTable`에 내용을 삭제할 테이블 명을 넣고 WHERE 절이 담긴 `$strWhere`, binding처리된 파라미터 배열 값인 `$arrBindParam`을 받아 delete 쿼리를 실행합니다.
* 실행 후 delete가 적용된 레코드 개수를 반환합니다.

### **bind\_query**

```php
bind_query($strSQL, $arrBind)
```

* 쿼리문이 담긴 `$strSQL` 값과 binding 처리할 파라미터가 담긴 `$arrBind` 값을 받아 쿼리를 실행합니다.

### **getCount**

```php
getCount($tableName, $column, $appendQuery)
```

* 해당 테이블의 쿼리 결과에 대한 row count를 반환합니다.

## 📌 Usage <a href="#usage" id="usage"></a>

### **선언**

#### 생성자에서 선언

```php
class MyComponent
{
    protected $db = null;

    /**
     * 생성자
     */
    public function __construct()
    {
         $this->db = \App::load('DB');
    }

    public function updateData($arrData)
    {
        $arrBind = $this->db->get_binding(DBTableField::tableTestInfo(), $arrData, 'update');
        $this->db->bind_param_push($arrBind['bind'], 'i', $ arrData ['sno']);
        $this->db->set_update_db('es_testTable', $arrBind['param'], 'sno = ?', $arrBind['bind']);
    }
}
```

#### 메소드 내에서 선언

```php
public function selectData($bdId, $bdSno)
{
    $db = \App::load('DB');
    $arrBind = [];
    $query = sprintf("SELECT MIN(sno) FROM %s WHERE field1 = ? AND field2 = ? ", 'es_testTable');
    $db->bind_param_push($arrBind, 's', $field1);
    $db->bind_param_push($arrBind, 'i', $field2);
    $result = $db->query_fetch($query, $arrBind, false);

    return $result;
}
```

### **SELECT**

#### **예제 코드 1**

```php
$this->db->strField = 'field1, field2';
$this->db->strJoin = ' LEFT JOIN es_testTable AS t1 ON t2.testSno = t1.sno';
$this->db->strWhere = 't1.field3 = ?';
$this->db->strOrder = 't1.field DESC';
$this->db->strLimit = '0, 10';

$this->db->bind_param_push($bindParam, $type, $value);

$query = $this->db->query_complete();
$strSQL = sprintf('SELECT %s FROM es_testTable1 %s', array_shift($query), implode(' ', $query));

return $this->db->query_fetch($strSQL, $bindParam, false);
```

* 위와 같이 필드와 조인, WHERE 절, GROUP BY 절, ORDER BY 절, LIMIT 값을 멤버 변수에 설정 한 후에 `query_complete()` 메소드로 설정한 조건들을 적용시킵니다.
* WHERE 절이 있다면 `bind_param_push()` 메소드로 해당 파라미터를 binding 처리해줍니다.
* 쿼리문 설정 후, `query_fetch()` 메소드를 통해 실행 결과를 출력합니다.

#### **예제 코드 2**

```php
$strSQL = sprintf("SELECT * FROM es_testTable WHERE field = '%s'", $field);
$data = $this->db->query_fetch($strSQL, null);
```

* 쿼리문 내에 조건절까지 포함하여 쿼리문 변수를 선언한 후에 `query_fetch()` 메소드로 결과를 반환합니다.

### **INSERT**

#### **예제 코드 1**

```php
$arrBind = $this->db->get_binding($defaultSetting, $arrData, 'insert');
$this->db->set_insert_db('es_testTable', $arrBind['param'], $arrBind['bind'], 'y');
```

* `get_binding()` 메소드를 통해 INSERT할 테이블 데이터 배열을 가져옵니다.
* `set_insert_db()` 메소드를 통해 `get_binding()` 메소드로 변환된 배열 값을 해당 테이블에 INSERT 해줍니다.

#### **예제 코드 2**

```php
$strSQL = "INSERT INTO es_testTable SET `field1` = ?, `field2` = ?";
$this->db->bind_param_push($arrBind, 'i', $field1);
$this->db->bind_param_push($arrBind, 's', $field2);
$this->db->bind_query($strSQL, $arrBind);
```

* insert 쿼리문을 선언합니다.
* INSERT할 파라미터를 `bind_param_push()` 메소드로 정의하고 `bind_query()` 메소드를 통해 쿼리문을 실행합니다.

### **UPDATE**

#### **예제 코드 1**

```php
$arrBind = $this->db->get_binding(DBTableField::testTable(), $arrData, 'update', $arrInclude);
$this->db->bind_param_push($arrBind['bind'], 's', $data);
$this->db->set_update_db('es_testTable', $arrBind['param'], 'field1 = ?', $arrBind['bind']);
```

* `get_binding()` 메소드로 수정할 테이블 정보를 배열 형태로 받아온 후, `bind_param_push()`로 WHERE 절 파라미터를 정의합니다.
* `set_update_db()` 메소드를 통해 수정합니다.

#### **예제 코드 2**

```php
$strSQL = "UPDATE es_testTable SET `field1` = ? WHERE `field2` = ?";
$this->db->bind_param_push($arrBind, 's', $field1);
$this->db->bind_param_push($arrBind, 'i', $field2);
$this->db->bind_query($strSQL, $arrBind);
```

* `bind_param_push()` 메소드로 WHERE 절 파라미터를 정의 후, `bind_query()` 메소드로 쿼리문을 실행합니다.

#### **예제 코드 3**

```php
$arrBind = $this->db->updateBinding(DBTableField::testTable(), $arrData);
$this->db->bind_param_push($arrBind['bind'], 'i', $ arrData ['sno']);
$this->db->set_update_db('es_testTable', $arrBind['param'], 'sno = ?', $arrBind['bind']);
```

* `updateBinding()` 메소드로 수정할 테이블 배열 값을 받아 온 후 `bind_param_push()` 메소드로 WHERE 절 파라미터를 정의합니다.
* `set_update_db()` 메소드로 데이터를 수정합니다.

### **DELETE**

#### **예제 코드 1**

```php
$this->db->bind_param_push($arrBind, 's', $arrData['field1']);
$this->db->bind_param_push($arrBind, 's', $arrData['field2']);
$this->db->set_delete_db('es_testTable', 'field1 = ? AND field2 = ?', $arrBind);
```

* `bind_param_push()` 메소드로 삭제할 쿼리의 WHERE 절 파라미터를 정의합니다.
* `set_delete_db()` 메소드로 삭제 쿼리문을 실행하여 WHERE 절 조건과 일치하는 레코드를 삭제합니다.

#### **예제 코드 2**

```php
$query = "DELETE FROM es_testTable WHERE field1 = ?";
$this->db->bind_param_push($arrBind, 'i', $field1);
$this->db->bind_query($query, $arrBind);
```

* delete 쿼리를 선언하고 WHERE 절 파라미터를 `bind_param_push()` 메소드로 정의합니다.
* `bind_query()`로 쿼리문을 실행하여 WHERE 절에 맞는 레코드를 찾아 삭제합니다.

### **Transaction**

트랜잭션을 이용하기 위해서는, 코드 블럭을 아래와 같이 감싸면 됩니다.

```php
try {
    \DB::begin_tran();
    $result = Some::dbResult();
    \DB::commit();
} catch (Exception $e) {
    \DB::rollback();
}
```

`Closure` 를 이용하여 좀더 심플한 코드를 작성할 수 있습니다.

```php
$result = \DB::transaction(function () {
    return Some::dbResult();
});
```
