# 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();
});
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://devcenter-help.nhn-commerce.com/guide/preparation/detailed-structure/database.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
