2026, 새로운 도약을 시작합니다.

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

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

일반 실행 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개

감사합니다. ^^

@민트다이어리 ^^

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> 

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

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

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

@동하아빠 감사합니다.

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

설정에서

ce847cf227f398eef98344e0e58df8db_1702451580_7795.png

이걸 체크해서 복붙해보세요

댓글 작성

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

로그인하기

그누보드5 팁자료실

번호 제목 글쓴이 날짜 조회
공지 3년 전 조회 4,598
2741 3일 전 조회 112
2740 4일 전 조회 104
2739 1주 전 조회 209
2738 1주 전 조회 217
2737 1주 전 조회 181
2736 1주 전 조회 280
2735 3주 전 조회 281
2734 3주 전 조회 263
2733 1개월 전 조회 265
2732 1개월 전 조회 301
2731 1개월 전 조회 267
2730 1개월 전 조회 226
2729 1개월 전 조회 356
2728 1개월 전 조회 245
2727 1개월 전 조회 422
2726 1개월 전 조회 256
2725 1개월 전 조회 331
2724 1개월 전 조회 360
2723 1개월 전 조회 267
2722 1개월 전 조회 300
2721 1개월 전 조회 211
2720 2개월 전 조회 304
2719 2개월 전 조회 307
2718 2개월 전 조회 202
2717 2개월 전 조회 336
2716 2개월 전 조회 202
2715 2개월 전 조회 312
2714 2개월 전 조회 273
2713 2개월 전 조회 376
2712 2개월 전 조회 289
🐛 버그신고