public function __construct() { $this->db = $this->connectDB(); }
function __destruct(){ mysqli_close($this->connectDB()); //mysqli_close($this->db); }
private function connectDB() { $dbconn = mysqli_connect($this->host, $this->userid, $this->password, $this->database); mysqli_set_charset($dbconn, "utf8"); // DB설정이 잘못되어 euc-kr 로 되어 있으면 문제가 됨 if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } else { return $dbconn; } }
//DB-UID데이터 function getUidData($table,$uid){ return $this->getDbData($table,'uid='.(int)$uid,'*'); }
// DB Query Cutom 함수 function getDbData($table,$where,$column) { $result = mysqli_query($this->db,'select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):'')); $row = mysqli_fetch_array($result); return $row; }
// DB Query result 함수 function getDbresult($table,$where,$column) { $result = mysqli_query($this->db,'select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):'')); return $result; }
//DB데이터 ARRAY -> 테이블에 출력할 데이터 배열 function getDbArray($table,$where,$flddata,$orderby,$rowsPage,$curPage){ $sql = 'select '.$flddata.' from '.$table.($where?' where '.$this->getSqlFilter($where):'').($orderby?' order by '.$orderby:'').($rowsPage?' limit '.(($curPage-1)*$rowsPage).', '.$rowsPage:''); if($result = mysqli_query($this->db,$sql)){ return $result; } }
//DB데이터 레코드 총 개수 function getDbRows($table,$where){ $sql = 'select count(*) from '.$table.($where?' where '.$this->getSqlFilter($where):''); if($result = mysqli_query($this->db,$sql)){ $rows = mysqli_fetch_row($result); return $rows[0] ? $rows[0] : 0; } }
//DB삽입 function getDbInsert($table,$key,$val){ mysqli_query($this->db,"insert into ".$table." (".$key.")values(".$val.")"); }
//DB업데이트 function getDbUpdate($table,$set,$where){ mysqli_query('set names utf8'); mysqli_query('set sql_mode=\'\''); mysqli_query($this->db,"update ".$table." set ".$set.($where?' where '.$this->getSqlFilter($where):'')); }
//DB삭제 function getDbDelete($table,$where) { mysqli_query($this->db,"delete from ".$table.($where?' where '.$this->getSqlFilter($where):'')); }
//SQL필터링 function getSqlFilter($sql){ return $sql; }
function isConnectDb($db) { $conn = mysqli_connect($db['host'],$db['user'],$db['pass'],$db['name'],$db['port']); mysqli_set_charset($conn, "utf8"); // DB설정이 잘못되어 euc-kr 로 되어 있으면 문제가 됨 if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); exit; } else { return $conn; } } ?>
==== tablecreate.php ====
<?php include_once 'dbconnect.php'; // DB 연결
$sql =" CREATE TABLE IF NOT EXISTS member ( no int(11) not null auto_increment, id varchar(15) NOT NULL, user_id varchar(15) NOT NULL, name varchar(15) NOT NULL, nick_name varchar(15), birth varchar(8), sex varchar(6), tel varchar(8), email varchar(40), pw varchar(32) NOT NULL, addr_1 varchar(100), addr_2 varchar(100), level int, regdate char(20), ip varchar(20), PRIMARY KEY(no) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; ";
PHP에서 MySQL을 연동하여 데이터를 가져오거나(select), 수정(update), 삭제(delete) 등을 할 때 사용하는 간단한 흐름이다.
네이버 지식인에 질문하는 사항을 가지고 간단하게 정리한다.
<?php // 파일을 직접 실행하면 동작되지 않도록 하기 위해서 if(isset($_POST) && $_SERVER['REQUEST_METHOD'] == "POST"){ @extract($_POST); // $_POST['id'] 라고 쓰지 않고, $id 라고 써도 인식되게 함 include "db_info.php"; // db 연결 $sql ="SELECT id,pass FROM testboarduser"; $sql.=" where id='".$id."'"; // 조건문에서 얻는 결과가 1개 if($result=mysql_query($sql,$conn)){ $row=mysql_fetch_array($result); if($id == $row['id'] ){ echo $row['id']; echo $row['pass']; } else { echo "틀림"; } } } ?>
The MySQLi Extension (MySQL Improved) is a relational database driver used in the PHP scripting language to provide an interface with MySQL databases.
PHP Connect to MySQL
- MySQL (procedural) : MySQL DB에서만 동작하며, , PHP 7.0 이상에선 동작안됨. PHP 5.5에서 deprecated
- MySQLi (procedural) : MySQL DB에서만 동작한다.
- MySQLi (object-oriented) : MySQL DB에서만 동작한다. - PDO(PHP Data Objects) : Oracle, PostgreSQL, SQLite, MySQL 등 12가지의 DB에서 동작한다.
MySQL DB에서 가져온 데이터(배열)을 반환하는 함수에 대해 알아보자. (절차지향 MySQL 방식)
mysql_query
MySQL 서버에 하나의 쿼리를 전송한다.
select, show 와 같이 레코드를 생성하는 쿼리는 그 리소스를 반환한다.
insert, update, delete 와 같이 결과 레코드가 없는 쿼리는 true, false 를 반환한다.
$result = mysql_query("select name from test"); $no_result = mysql_num_rows($result); echo "<h2>Here is a list of the test :</h2>"; for ($i=0;$i<=$no_result;$i++){ echo "<p>".mysql_result($result,$i)."</p>"; } mysql_close($dbconn); ?>
mysql_fetch_row
쿼리의 결과 레코드를 숫자 인덱스 배열로 반환한다. mysql_query() 함수의 결과 레코드를 한 레코드 단위로 가져오며,
이 레코드를 배열 형태로 되돌려 준다.
이 배열에서 필드값을 가져오려면 인덱스로 숫자를 사용한다.
mysql_fetch_assoc
쿼리의 결과 레코드를 연관 배열로 반환한다. mysql_query() 함수의 결과 레코드를 한 레코드 단위로 가져오며,
이 레코드를 배열 형태로 되돌려 준다.
배열의 인덱스로 필드 이름을 사용할 수 있어서 직관적이고 사용하기 편리하다.
mysql_fetch_array
쿼리의 결과 레코드를 숫자 인덱스 배열이나 연관 배열로 반환한다.
select 구문으로 조회(mysql_query)하고 그 결과인 result set 에서 레코드를 한개씩 리턴해주는 함수에는 mysql_fetch_row, mysql_fetch_assoc, mysql_fetch_array 가 있다.
MySQL 함수명
MySQLi 함수명
리턴값
mysql_fetch_row
mysqli_fetch_row
일반배열
mysql_fetch_assoc
mysqli_fetch_assoc
연관배열
mysql_fetch_array
mysqli_fetch_array
일반배열 + 연관배열
mysql_fetch_row(resource $result) mysql_fetch_row()는 데이터를 0으로 시작하는 숫자형 인덱스 배열로 반환한다. 가장 빠르다고 알려져 있으나 어느 컬럼을 가져왔는지 가독성이 떨어진다. 컬럼명이 얼마 안될 경우 혹은 문서 정리가 잘 되어있을때 사용 하도록 한다. $row[0]; //인덱스 번호로만 데이터를 출력한다.
mysql_fetch_assoc(resource $result) mysql_fetch_assoc()는 데이터를 문자형 연관 배열로 반환한다. 가장 많이 사용되는 함수로써 키값을 가지고 데이터를 출력한다. 데이터베이스에서 SELECT문으로 해당 컬럼을 키값만으로 출력이 가능하다. $row['id']; $row['userID']; // 필드의 이름은 대소문자를 구별한다.
mysql_fetch_array(resource $result [, int $result_type ]) $result_type 은 생략 가능하며, 생략하면 MYSQL_BOTH mysql_fetch_array($result, MYSQL_NUM) = mysql_fetch_row($result) mysql_fetch_array($result, MYSQL_ASSOC) = mysql_fetch_assoc($result) mysql_fetch_array($result, MYSQL_BOTH) 인덱스(숫자)번호와 연관 배열의 키값으로 데이터를 가져 올 수 있다. 성능이 크게 차이는 없으나 데이터가 많을 시 key[0] 번째 값과 key['키'] 인덱스 배열과 연관배열값을 모두 가져 오기 때문에 불필요한 메모리가 쌓인다.
성능에 미치는 영향이 별로 없다면 mysql_fetch_array 함수를 사용하는 것이 편하다.
입문자들이 코딩하면서 책에 나온대로 따라 연습하면서 놓치는 부분은 사소한 곳에 있다.
$sql ="SELECT id,pass FROM testboarduser where id='".$id."'"; $result=mysql_query($sql,$conn); 이렇게 두줄로 처리하기도 하지만 더 심하게는 간단하게 한줄로 코딩한다고
$result=mysql_query("SELECT id,pass FROM testboarduser where id='".$id."'",$conn);
로 처리한다.
로직상 틀린 것은 없다.
하지만 문제점을 발견하기 위해서 디버깅을 한다고 치자.
$result=mysql_query("SELECT id,pass FROM testboarduser where id='".$id."'",$conn);
은 문제가 어디에서 생겼는지 발견하기가 쉽지 않다.
$sql ="SELECT id,pass FROM testboarduser where id='".$id."'"; echo $sql; // 데이터가 원하는 결과대로 나오는지 확인 목적 $result=mysql_query($sql,$conn);
이렇게 하면 DB 연결이 잘된 것인지 아닌지 확인이 가능해진다.
$sql ="SELECT id,pass FROM testboarduser"; $sql.=" where id='".$id."'"; $result=mysql_query($sql,$conn);
그러면 왜 이렇게 $sql 을 분리해서 코딩하는 걸까?
검색어를 입력해서 검색어가 포함된 결과를 돌려받고 싶다. 검색어 조건이 2개 이상이다.
이런 경우 등을 처리할 때 유연하게 처리가 가능하기 때문이다.
MySQLi 접속방식과 MySQL 접속방식으로 코딩시 DB 연결 부분을 실수하는 초보자가 많다.
MySQL
//SQL Query $sql= "SELECT * FROM TableName WHERE search='".$searchName."' LIMIT 5"; $result = mysql_query($sql,$conn); //SQL Query 실행(Excute)
MySQLi
//SQL Query $sql= "SELECT * FROM TableName WHERE search='".$searchName."' LIMIT 5"; $result = mysqli_query($conn, $sql); //SQL Query 실행(Excute)
<?php @extract($_GET); // $_GET['cat1'] 대신에 $cat1 이라고 써도 되도록 해준다.
include "db_info.php"; // db 연결
$sql ="SELECT id,pass FROM testboarduser"; $sql.=" where display=1"; if (isset($cat1)&& !empty($cat1)) $sql.= ' and category1='.$cat1; if (isset($cat2)&& !empty($cat2)) $sql.= ' and category2='.$cat2; if(isset($where) && !empty($where) && isset($keyword) && !empty($keyword)){ if($where=="name"){ $sql.= " and name LIKE '%".trim($keyword)."%'"; } else if( $where=="phone" ){ $sql.= " and (cellphone LIKE '%".trim($keyword)."%' OR officephone LIKE '%".trim($keyword)."%')"; } else { $sql.= " and ".$where." like '%".trim($keyword)."%'"; } }
Web(PHP 파일B) 에서 변수가 없거나 값이 넘어오지 않을 경우에는 동작하지 않도록 코딩을 해야 한다.
초보자들이 가장 많이 하는 실수(내가 초보시절에 겪은 실수)는 통신방식을 고려하지 않고 코딩을 하거나 서버 세팅정보를 대충 하는 것이다. 대화해보면 코딩 좀 하는 분도 이런걸 대략 하는 분이 있다. (한국어와 영어 소통하는 것과 같은 것)
UTF-8 로 세팅한다는 의미는 파일 Encoding Mode 도 UTF-8 로 하고, 서버에 세팅도 UTF-8 로 하고 DB에도 UTF-8 로 해야 한다는 것이다. (엑셀은 EUC-KR 방식으로 CSV 파일 내보내기를 한다)
참고사항
스크립트(Script) 언어란 소스 코드를 컴파일(Compile)하지 않고도 실행할 수 있는 프로그래밍 언어를 말한다. C/C#/VB.NET, Java 같은 경우는 작성한 소스를 컴파일러를 통해 기계어 코드로 변경해야 실행 파일이 얻어지는데 비해 스크립트 언어는 별도의 컴파일 없이 내장된 번역기에 의해 번역되므로 바로 실행할수 있다. 스크립트
언어는 소스를 작성한 후 컴파일 과정 없이 바로 실행하여 결과를 확인할 수 있다는 장점이 있는 반면에 번역 과정을 거쳐야 하기
때문에 다소 느리다는 단점이 있다(최신 CPU는 고성능 처리하므로 느리다는 느낌이 별로 안들 것이다). C언어나 Java와 같은
비스크립트 언어의 경우 실행 속도가 빠른 장점이 있는 반면 컴파일 과정을 거쳐야 하는 등 개발 과정이 조금 복잡하다는 단점이
있다. - 서버 사이드 스크립트(server-side-script) : 해당 소스의 실행 결과를 확인하기 위해 웹서버를 거쳐야 하는 스크립트를 말하며, PHP, JSP, ASP, PYTHON, PERL, RUBY, Node.JS 등이 있다. - 클라이언트 사이드 스크립트(client-side-script) : Web 브라우저에 의해 실행되는 스크립트로 단말 단독으로 실행(웹서버 실행 안됨)되며, JavaScript/jQuery, VBScript 등이 있다.
DB 연결정보는 로그인 처리 뿐만 아니라 거의 모든 PHP에서 사용한다고 볼 수 있다.
모든 PHP 파일에서 중복해서 DB 연결 정보를 코딩하는 것은 비효율적이므로, 파일을 분리하여 dbconnect.php 파일로 작성해두기만 하면 코딩이 심플해지고 가독성도 좋아진다.
dbconnection 을 하는 파일을 만드는 방법을 알아보자.
require문, include문 : 자주 사용하는 PHP 코드를 다른 파일에 모아 두고 필요할 때 파일을 읽어들여서 사용할 수 있도록 하는 명령
require "파일명";
- 만일 지정된 파일이 존재하지 않을 경우에는 php.ini에 설정된 include_path에서 파일을 찾는다.
- include_path에도 파일이 존재하지 않는다면 require문을 작성한 현재 파일이 있는 디렉토리에서 찾는다.
- 현재 디렉토리에도 없다면 오류표시하고 정지된다.
require와 include의 차이점
- require문은 오류가 발생했을 경우에 Fatal Error가 되어 정지가 되어버린다.
- require_once() : 지정한 파일을 한 번 읽어 들이면 같은 처리 중에는 다시 읽어 들일 수 없다.
- include문은 오류가 발생했을 경우에 Warning을 출력하고 처리코드를 수행한다.
- include_once() : 지정된 파일을 이미 읽어 들어 경우에는 다시 파일을 읽어 들이지 않는다.
PHP Connect to MySQL
- MySQL (procedural) : MySQL DB에서만 동작하며, , PHP 7.0 이상에선 동작안됨. PHP 5.5에서 deprecated
- MySQLi (procedural) : MySQL DB에서만 동작한다.
- MySQLi (object-oriented) : MySQL DB에서만 동작한다. - PDO(PHP Data Objects) : Oracle, PostgreSQL, SQLite, MySQL 등 12가지의 DB에서 동작한다.
Connecting to MySQL using the legacy MySQL functions
절차지향(procedural) 접속 함수는 MySQLi 방식과 MySQL 방식이 있다.
MySQL 설치방식에 따라 둘다 지원할 수도 있고 둘 중에 하나만 지원할 수도 있다.
MySQL 방식과 MySQLi 방식은 연결 방식이 약간 다르므로 코딩시 실수하지 않도록 주의가 필요하다.
function isConnectDb($db) { $conn = mysqli_connect($db['host'],$db['user'],$db['pass'],$db['name'],$db['port']); mysqli_set_charset($conn, "utf8"); // DB설정이 잘못되어 euc-kr 로 되어 있으면 문제가 됨 if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); exit; } else { return $conn; } } ?>
function isConnectDb($db) { $conn = @mysql_connect($db['host'].':'.$db['port'],$db['user'],$db['pass']); //Set encoding mysql_query("SET CHARSET utf8"); mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'"); if(!$conn){ die('Not connected :' . mysql_error()); exit; } $selc = mysql_select_db($db['name'],$conn); // 접근한 계정으로 사용할 수 있는 DB 선택 // 연결 식별자($conn) 는 생략 가능하며, 생략시 가장 최근에 설정한 연결 식별자가 사용된다. return $selc ? $conn : false; } ?>
아래 두 명령의 차이점에 대해 이해하자.
MySQL
mysql_query ("select * from tableName"); // 최근에 열려진 db conection 을 자동으로 사용 mysql_query ("select * from tableName", $dbconn); // db connection을 지정해서 사용
MySQLi
mysqli_query ($dbconn, "select * from tableName"); // db connection 지정만 허용
dbconnect.php 함수를 만들었으면 이제 실제 코드상에서 사용하는 방법을 알아보자.
LoginForm.php 인 A 파일에서 입력한 데이터를 받아서 처리하는 loginChk.php 인 파일 B의 일부 로직이다.
코딩을 하면서 고려할 점은 loginChk.php 파일을 단독으로 실행했을 때 파일이 실행되어서는 안되도록 체크하는 로직을 반드시 추가해야 한다. 즉, 파일 A에서 입력된 변수가 없으면 파일 B는 동작되지 않도록 해야 한다.
안드로이드에서 받은 입력값과 웹 LoginForm.php 에서 전달받은 값을 구분하여 체크하는 로직이다.
안드로이드폰/아이폰은 고유한 ID값을 가지고 있는데 이 ID값이 넘어오면 안드로이드 로그인으로 구분하도록 if문을 사용했다.
대부분 세션 스타트를 session_start(); 로만 처리하는데
if(!isset($_SESSION)) { session_start(); }
로 해주어야 한다. 그래야 경고 메시지가 나오지 않는다.
=== loginChk.php ====
<?php if(!isset($_SESSION)) { session_start(); }
@extract($_POST); // POST 전송으로 전달받은 값 처리 // $_POST['loginID'] 라고 쓰지 않고, $loginID 라고 써도 인식되게 하려면 extract($_POST); 를 써주면 된다.
// 변수가 존재하거나 값이 있는 경우에만 데이터 업데이트를 하도록 하는 로직 // 이 파일명으로 직접 접속하면 변수 값이 넘어오지 않으므로 실행 불가되도록 처리 if(isset($loginID) && !empty($loginID) && isset($loginPW) && !empty($loginPW)) {
require_once $_SERVER['DOCUMENT_ROOT'].'/dbconnect.php'; // db접속 require_once $_SERVER['DOCUMENT_ROOT'].'/loginClass.php'; $c=new LoginClass(); // 로그인 처리 관련 함수를 모아서 작성한 클래스
$_SESSION['userID'] = $loginID; $_SESSION['userPW'] = md5($loginPW); $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; $_SESSION['ua'] = $_SERVER['HTTP_USER_AGENT']; $c->AccessLog($loginID,$deviceID); // 접속 로그 기록
echo 1; // 로그인 성공 결과를 1로 처리 // 안드로이드에서는 화면출력하는 결과값으로 로그인 성공/실패 판단 처리 } else if($result == 0) { echo 0; // Login Fail
} else { echo -1; // Phone Dismatch
} }
} else { // 이 부분은 Web 접속 변수가 없는 경우를 처리하는 부분 // $_POST 전송값이 없이 바로 이 파일을 실행하면 로그인 창으로 돌려보내라. echo("<meta http-equiv='Refresh' content='0; URL=loginForm.php'>"); } ?>
loginChk.php 파일에서 보면 WebUserAuthCheck($loginID,$loginPW) 함수를 사용한 것을 볼 수 있다. 이 함수는 loginClass.php 파일에 작성되어 있는데, loginClass.php 함수중에서 Web 로그인 체크하는 부분만 발췌했다.
사용자가 해킹을 시도할 의도가 있어도 방지하는 코드를 추가된 것을 확인할 수 있다.
==== loginClass.php =====
<?php class LoginClass { function WebUserAuthCheck($u,$p) { if(!isset($u) || !isset($p) || empty($u) || empty($p)) { return 0; } else { global $dbconn; // global 키워드를 사용하여 변수에 선언할 경우 함수 밖의 변수를 참조할 수 있다 $u = preg_replace("/[\s\t\'\;\"\=\--]+/","", $u); // 공백이나 탭 제거(사용자 실수 방지) $p = preg_replace("/[\s\t\'\;\"\=\--]+/","", $p); // 공백이나 탭 제거, 특수문자 제거 // SQL injection 검사 $u = mysqli_real_escape_string($dbconn,$u); // <script>documnet.cookie();</script> 공격 방지 $p = mysqli_real_escape_string($dbconn,$p); // if(preg_match('/[\/\\\\]/', $u)) $this->popup('비정상적 접근입니다'); // no slashes //if(preg_match('/(and|null|where|limit)/i', $u)) { // i는 대소문자 구별하지 말라 // $this->popup('비정상적 접근입니다'); //} // 회원아이디가 일치하는 경우가 생겨서 이 구문은 사용을 자제해야 할 듯해서 주석처리함. if(!preg_match('/^[0-9a-zA-Z\~\!\@\#\$\%\^\&\*\(\)]{7,}$/',$p)) { // 최소7자리 이상 허용 문자만 통과 $this->popup('정보가 올바르지 않습니다'); // 같은 클래스안에 있는 다른 함수를 사용할 때 $this 로 기술 }
$sql = "select code, id "; $sql.= "from member where pw=md5('".$p."') and id= '".$u."' "; if($result = mysql_query($sql,$dbconn)) { //성공 $row = mysql_fetch_array($result); if($row == NULL) return 0; return $row; } else { return '-1'; } } }
// 로그인함수 경고메시지 function popup($msg) { echo "<script>alert('".$msg."');history.go(-1);</script>"; } } // End of LoginClass ?>
블로그내 다른 소스를 복사해서 활용하고 싶다면 c browser 를 검색해서 설치하고 사용하면 됩니다.
도움되셨다면 댓글이나 공감 부탁드립니다.
추가 작성 : 2016-11-23일자 (네이버지식인 답변시 추가)
DB를 연결하는 방법만 언급하다보니 함수화하는 것과 연결고리를 잘 모르는 분을 위해서 적어본다.
통계처리용으로 만는 함수다. 함수화를 해두면 나중에 추가할 사항이 있으면 함수만 추가하면 된다.
MySQLi 를 사용하는 환경이면 사용자 함수도 MySQLi 기반으로 수정해주면 된다.
=== statClass.php ===
<?php class statsClass { function today_statsCount(){ global $dbconn;// global 키워드를 사용하여 변수에 선언할 경우 함수 밖의 변수를 참조할 수 있다 date_default_timezone_set('Asia/Seoul'); $year = date("Y"); // 오늘날짜 $month = date("m"); // 오늘날짜 $day = date("d"); // 오늘날짜 $date = date("Ymd"); $sql ="select count(distinct LogID), sum(hit) from AccessLog"; $sql .=" where date='".$date."' "; $result=mysql_query($sql); if($row=mysql_fetch_row($result)){ return $row; // 배열로 리턴 } }
function yesterday_statsCount(){ global $dbconn; date_default_timezone_set('Asia/Seoul'); $date = date("Ymd", mktime(0,0,0,date("m"), date("d")-1, date("Y"))); // 어제 $sql ="select count(distinct LogID), sum(hit) from AccessLog"; $sql .=" where date='".$date."' "; $result=mysql_query($sql); if($row=mysql_fetch_row($result)){ return $row; } }
function AccessLogCnt($date){ global $dbconn; $sql ="select count(distinct LogID),sum(hit) from AccessLog where date='".$date."'"; $result=mysql_query($sql); if($row=mysql_fetch_row($result)){ return $row; } }
if(!$conn){ die('Not connected :' . mysql_error()); exit; } $selc = mysql_select_db($db['name'],$conn); // 접근한 계정으로 사용할 수 있는 DB 선택 // 연결 식별자($conn) 는 생략 가능하며, 생략시 가장 최근에 설정한 연결 식별자가 사용된다. return $selc ? $conn : false; }
//DB-UID데이터 function getUidData($table,$uid){ return $this->getDbData($table,'uid='.(int)$uid,'*'); }
// DB Query Cutom 함수 function getDbData($table,$where,$column){ global $DB_CONNECT; $result = mysql_query('select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):'')); $row = mysql_fetch_array($result); return $row; }
// DB Query result 함수 function getDbresult($table,$where,$column){ global $DB_CONNECT; $result = mysql_query('select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):'')); return $result; }
//DB데이터 필드 개수 function getDbColums($table,$where,$column){ global $DB_CONNECT; $result = mysql_query('select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):'')); return mysql_num_fields($result); }
//DB데이터 레코드 총 개수 function getDbRows($table,$where){ global $DB_CONNECT; $sql = 'select count(*) from '.$table.($where?' where '.$this->getSqlFilter($where):''); //echo $sql; $rows = mysql_fetch_array(mysql_query($sql)); return $rows[0] ? $rows[0] : 0; }
//DB데이터 ARRAY -> 테이블에 출력할 데이터 배열 // order by : 정렬 순서, limit : 화면에 출력할 개수, curPage : 현재 페이지 function getDbArray($table,$where,$flddata,$orderby,$limit,$curPage){ global $DB_CONNECT; $curPage = $curPage ? $curPage : 1; // 현재 페이지가 없으면 1로 설정 $sql = 'select '.$flddata.' from '.$table.($where?' where '.$this->getSqlFilter($where):'').($orderby?' order by '.$orderby:'').($limit?' limit '.(($curPage-1)*$limit).', '.$limit:''); //echo $sql; $result = mysql_query($sql); return $result; }
//DB select function getDbSelect($table,$where,$column){ global $DB_CONNECT; $row = mysql_query('select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):''),$DB_CONNECT); return $row; }
//DB삽입 function getDbInsert($table,$key,$val){ global $DB_CONNECT; mysql_query("insert into ".$table." (".$key.")values(".$val.")"); }
//DB업데이트 function getDbUpdate($table,$set,$where){ global $DB_CONNECT; mysql_query('set names utf8'); mysql_query('set sql_mode=\'\''); mysql_query("update ".$table." set ".$set.($where?' where '.$this->getSqlFilter($where):'')); }
//DB삭제 function getDbDelete($table,$where){ global $DB_CONNECT; mysql_query("delete from ".$table.($where?' where '.$this->getSqlFilter($where):''),$DB_CONNECT); }
//SQL필터링 function getSqlFilter($sql){ return $sql; }
}//end dbClass
class MySQLiDbClass { function isConnectDb($db) { $conn = mysqli_connect($db['host'],$db['user'],$db['pass'],$db['name'],$db['port']); mysqli_set_charset($conn, "utf8"); // DB설정이 잘못되어 euc-kr 로 되어 있으면 문제가 됨 if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } else { return $conn; } } // */
//DB-UID데이터 function getUidData($table,$uid) { return $this->getDbData($table,'uid='.(int)$uid,'*'); }
// DB Query Cutom 함수 function getDbData($table,$where,$column) { global $DB_CONNECT; $result = mysqli_query('select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):'')); $row = mysqli_fetch_array($result); return $row; }
// DB Query result 함수 function getDbresult($table,$where,$column) { global $DB_CONNECT; $result = mysqli_query('select '.$column.' from '.$table.($where?' where '.$this->getSqlFilter($where):'')); return $result; }
//DB데이터 ARRAY -> 테이블에 출력할 데이터 배열 function getDbArray($table,$where,$flddata,$orderby,$limit,$curPage){ global $DB_CONNECT; $sql = 'select '.$flddata.' from '.$table.($where?' where '.$this->getSqlFilter($where):'').($orderby?' order by '.$orderby:'').($limit?' limit '.(($curPage-1)*$limit).', '.$limit:''); $result = mysqli_query($sql); return $result; }
//DB데이터 레코드 총 개수 function getDbRows($table,$where){ global $DB_CONNECT; $sql = 'select count(*) from '.$table.($where?' where '.$this->getSqlFilter($where):''); $rows = mysqli_fetch_array(mysqli_query($sql)); return $rows[0] ? $rows[0] : 0; }
//DB삽입 function getDbInsert($table,$key,$val){ global $DB_CONNECT; mysqli_query("insert into ".$table." (".$key.")values(".$val.")"); }
//DB업데이트 function getDbUpdate($table,$set,$where){ global $DB_CONNECT; mysqli_query('set names utf8'); mysqli_query('set sql_mode=\'\''); mysqli_query("update ".$table." set ".$set.($where?' where '.$this->getSqlFilter($where):'')); }
//DB삭제 function getDbDelete($table,$where) { global $DB_CONNECT; mysqli_query("delete from ".$table.($where?' where '.$this->getSqlFilter($where):''),$DB_CONNECT); }
//SQL필터링 function getSqlFilter($sql) { return $sql; }
// DB Query Cutom 함수 function getDbData($table,$where,$data,$orderby){ global $db; $result = mysql_query('select '.$data.' from '.$table.($where?' where '.getSqlFilter($where):'').($orderby?' order by '.getSqlFilter($orderby):'')); $row = mysql_fetch_array($result); return $row; }
//SQL필터링 function getSqlFilter($sql){ return $sql; }
함수를 만들어서 사용할 경우 제대로 잘 만들어졌는지 테스트 하는 과정은 아래과정으로 진행했다.
sql 쿼리문을 화면상에 나오게 하여 제대로 나왔는지 확인했다.
<?php $table ='MEMBER'; $part1CD='04'; $part2CD='23'; $part3CD='00'; $partNM = '기타'; $where ="part1CD='".$part1CD."' and part2CD='".$part2CD."' and part4CD='00' and partNM='".$partNM."'"; $data ='*'; $orderby = 'idx DESC'; //$orderby = '';
$sql = 'select '.$data.' from '.$table.($where?' where '.getSqlFilter($where):'').($orderby?' order by '.getSqlFilter($orderby):''); echo $sql;
function getSqlFilter($sql) { return $sql; // preg_replace("/찾을 문자열/" , "변경할 문자열" , "해당 문자열"); // /찾을 문자열/ 에서 / 는 정규식의 시작과 끝을 알린다. //return preg_replace("( union| update| insert| delete| drop|\/\*|\*\/|\\\|\;)",'',$sql); }
global $DB_CONNECT; $fields = array(); $res=mysql_query("SHOW COLUMNS FROM ".$table.""); while ($x = mysql_fetch_assoc($res)){ array_push($fields,$x['Field']); }