테스트 사이트 - 개발 중인 베타 버전입니다

sql 바인딩 그누보드에서 해보기

· 1년 전 · 2631 · 11

바인딩을 하는 이유가 들어오는 파라메타의 보안 검사나 유효성 검사를 따로 해줄 수 있어서인 것 같은데요.
그래서 먼저 파라메타 보안 검사해주는 함수 만들어주고,
그리고

일반 실행 sql_run(쿼리,파라메타(값 또는 배열), 0)  마직막 인자 0 : 실행, 1 : insert_id 리턴, 2 : 영향준 행의 수 리턴

1줄 sql_row(쿼리,파라메타(값 또는 배열))

여러줄 sql_arr(쿼리,파라메타(값 또는 배열)) 
이렇게 함수를 만들고 쿼리문하고 파라메타를 각 넣어서 실행할 수 있게해 두었습니다.

common.lib.php에 넣어서 사용하시면 될 듯.


sql 쿼리문에 변수 매칭은 2가지 방식을 지원합니다. ? 나 $1,$2,$3 
파라메타에 단일 변수나 배열을 넣으면 순서대로 매칭됩니다.

?표는 ? 넣은 갯수 만큼 매칭이 되고
$1,$2,$3 이렇게 넣으면 배열의 순서를 지정해주는 방식으로

$1,$2,$3,$1 이렇게 $1를 여러번 넣어도 첫번째 값으로 인식합니다.

 

[code]
<?php

 

// SQL 인젝션 공격을 방지하기 위한 함수

// secure_input 함수

function secure_input($data) {

if (is_array($data)) {

foreach ($data as $key => $value) {

$data[$key] = secure_input($value);

}

} else {

$data = trim($data);

$data = stripslashes($data);

//$data = htmlspecialchars($data);

$data = htmlspecialchars($data, ENT_QUOTES);

$data = addslashes($data);

}

return $data;

}

 

// sql_run 함수

// params 배열의 값들을 안전하게 처리한 후, SQL 쿼리를 실행함

// insert delete update 를 처리하는 함수

// sql문에 ?를 사용하고, params에는 ?에 들어갈 값 또는 배열로 전달함

// sql문에 $1, $2, $3을 사용하고, params에는 $1, $2, $3에 들어갈 값들을 배열로 전달함

// sql_query 함수와 동일하게 작동하며, $return_val = 0 결과 리턴 1이면 insert_id 2이면 영향을 받은 행의 수를 리턴함

function sql_run($sql, $params, $return_val = 0) {

global $g5;

 

$params = secure_input($params);

//배열의 경우

if (is_array($params)) {

// $1, $2, $3 등을 $params의 값으로 대체

$sql = str_replace(array_map(function($k) { return '$' . ($k + 1); }, array_keys($params)), $params, $sql);

// ?를 $params의 값으로 대체

$sql = preg_replace_callback('/\?/', function($matches) use (&$params) {

return array_shift($params);

}, $sql);

}

// 단일 값의 경우

else {

$sql = str_replace("?", $params, $sql);

}

$result = sql_query($sql);

if($result) {

 

// $return_val가 1 마지막으로 삽입된 레코드의 ID를 가져옵니다.

if ($return_val == 1 ) {

$response = array('status' => 'success');

$response['insert_id'] = sql_insert_id($g5['connect_db']);

 

return $response;

// $return_val가 2 영향을 받은 행의 수를 가져옵니다.

} else if ($return_val == 2 ) {

$response = array('status' => 'success');

$response['affected_rows'] = sql_affected_rows($g5['connect_db']);

 

return $response;

} else {

return $result;

}

 

} else {

return $result;

}

}

 

// sql_row 함수

// sql select 1줄만 가져오는 함수

function sql_row($sql='', $params) {

$params = secure_input($params);

//배열의 경우

if (is_array($params)) {

// $1, $2, $3 등을 $params의 값으로 대체

$sql = str_replace(array_map(function($k) { return '$' . ($k + 1); }, array_keys($params)), $params, $sql);

// ?를 $params의 값으로 대체

$sql = preg_replace_callback('/\?/', function($matches) use (&$params) {

return array_shift($params);

}, $sql);

}

// 단일 값의 경우

else {

$sql = str_replace("?", $params, $sql);

}

$result = sql_fetch($sql);

return $result;

}

 

// sql_arr 함수

// sql select 결과를 배열로 가져오는 함수

function sql_arr($sql, $params) {

$params = secure_input($params);

//배열의 경우

if (is_array($params)) {

// $1, $2, $3 등을 $params의 값으로 대체

$sql = str_replace(array_map(function($k) { return '$' . ($k + 1); }, array_keys($params)), $params, $sql);

// ?를 $params의 값으로 대체

$sql = preg_replace_callback('/\?/', function($matches) use (&$params) {

return array_shift($params);

}, $sql);

}

// 단일 값의 경우

else {

$sql = str_replace("?", $params, $sql);

}

$rows = array();

$result = sql_query($sql);

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

$rows[] = $row;

}

return $rows;

}

[/code]
 

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 11개

1년 전

감사합니다. ^^

@민트다이어리 ^^

ci로 만든 프로젝트들이 많이 있는데, 

이걸 그누보드로 옮기려다보니, 너무 손댈게 많아서 함 만들어 봤습니다.

sql_arr() 이놈은 배열을 목록으로 생성하는데 목로 그자체를 불러올 때만 사용하시고,

속도면에서는 그냥 sql_run() 하고 sql_fetch_array()로 불러서 반복문으로 사용하는게 

배열을 이중으로 넣다 뺏다하지 않으니 속도 민감하신분들은 이부분만 구분하셔서 사용하시면 될 것 같습니다.

저는 mysql prepared statement의 wrapper를 만들어서 사용하고있습니다. ':fieldname' 이렇게 PDO처럼 사용할 수 있게 했고요.

 

https://github.com/kg-framework/kg/blob/main/src/Database/MySQL.php#L62

 

https://kg-framework.github.io/kg/database/sql.html#prepare

@jihan? 아 클래스. 참고하겠습니다.^^

 

감사합니다.

혹시 말입니다. 제가 잘 몰라서 그러는데요. 

코드를 넣으면 배경에 검음색으로 코드가 이쁘게 보이게 하는 방법이 어떻게 되는지 아시는분 계신가요?
<code></code> 

이렇게하면 두껍게만 되고 배경이 검은색으로 변하지는 않더라구요..

좀 알려주시면 위 내용 이쁘게 바꿔 놓을께요.

1년 전

@들불 [ code ] .... [/ code ] 입니다 ([, ] 사이에 공백없이요)

@동하아빠 감사합니다.

그런데 vscode에서 복사 붙여 넣기 했는데 들여쓰기는 안되네요. 혹시 들여쓰기 방법 아시는 분..

게시글 목록

번호 제목
24318
24317
24315
24309
24294
24293
24277
24262
24260
24253
24251
24236
24233
24228
24226
24221
24214
24203
24201
24199
24196
24195
24194
24192
24191
24187
24185
24183
24172
24168