728x90

PHP 에서 MySQL 접속 dbController Class 만드는 코드다.

절차지향방식의 생성자, 소멸자 만드는 방법과 class MySQLDbClass extends DBController { } 예시다.


사용법

require_once '../phpclass/dbController.php';

$d = new DBController();


<?php
class DBController {
    private $host = 'localhost';
    private $database = 'survey';
    private $userid = 'root';
    private $password = 'autoset';
    protected $db;

    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;
    }

}//end dbClass

?>


만약 2개의 파일로 나누어서 만들었다면 첨부파일처럼 코드를 작성하면 된다.

dbClass.zip


블로그 이미지

Link2Me

,
728x90

PHP Code 상에서 데이터베이스(DB)와 테이블을 생성하는 코드 예제를 만들었다.

코드는 bootstrap 기반으로 구현했다.

테스트에 사용한 코드를 첨부한다.

테스트 환경 : 윈도우10 autoset9 APM(apache + PHP + MySQL)


dbcreate.zip



<!DOCTYPE html>
<head>
<title>DB 생성 및 테이블 생성</title>
<meta charset="UTF-8" />
<meta name="robots" content="noindex,nofollow"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
<meta http-equiv="X-UA Compatible" />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script>
$(document).ready(function(){
    $("#create").click(function(){
       if(!form.hostname.value) {
          alert('Host명을 입력하세요!');
          form.host.focus();
          return false;
       }
       if(!form.dbuser.value) {
          alert('DB User가 입력되지 않았습니다!');
          form.dbuser.focus();
          return false;
       }
       if(!form.dbpasswd.value) {
          alert('DB Password를 입력하세요!');
          form.dbpasswd.focus();
          return false;
       }
       if(!form.dbname.value) {
          alert('DB Name을 입력하세요!');
          form.dbname.focus();
          return false;
       }
       form.submit();

    });
});
</script>
</head>

<body topmargin=50>
<?php
if(!empty($_POST['dbpasswd']) && !empty($_POST['dbname'])) {
    // DB 연결
    $conn = mysqli_connect("localhost",$_POST['dbuser'],$_POST['dbpasswd']);
    if(mysqli_connect_errno()){
        echo "MySQL 연결 오류 : ".mysqli_connect_error();
    }

    // Create Database
    $sql ="Create DATABASE IF NOT EXISTS  ".$_POST['dbname']." default character set utf8";
    if(mysqli_query($conn,$sql)){

        //echo '<script>alert("Created DATABASE");</script>'; // $sql 결과 테스트 용도

        // dbinfo.php 파일에 기록
        $myfile = fopen("dbinfo.php", "w") or die("Unable to open file!");
        fwrite($myfile, "<?php\n");
        $host = "\$db['host'] = 'localhost';\n";
        fwrite($myfile, $host);
        $dbname = "\$db['name'] = '".$_POST['dbname']."';\n";
        fwrite($myfile, $dbname);
        $dbuser = "\$db['user'] = '".$_POST['dbuser']."';\n";
        fwrite($myfile, $dbuser);
        $dbpasswd = "\$db['pass'] = '".$_POST['dbpasswd']."';\n";
        fwrite($myfile, $dbpasswd);
        $dbport = "\$db['port'] = '3306';\n";
        fwrite($myfile, $dbport);
        fwrite($myfile, "?>\n");
        fclose($myfile);
    } else {
        echo "DB 만들기 오류 : ".mysqli_error($conn);
        echo "<script>location.replace('dbcreate.php')</script>";
    }

    require_once 'dbconnect.php'; // DB 생성후 DB명까지 인식되는 db연결 필수

    // pollinfo 테이블 생성 (테이블 생성 예시로 반드시 MySQL에서 직접 실행해본 테이블을 적어야 한다.)
    $sql = "CREATE TABLE IF NOT EXISTS pollinfo(
        uid int(11) NOT NULL AUTO_INCREMENT,
        question varchar(100),
        start_date date,
        end_date date,
        now_progress char(1),
        select1 varchar(50),
        select2 varchar(50),
        select3 varchar(50),
        select4 varchar(50),
        select5 varchar(50),
        select6 varchar(50),
        select7 varchar(50),
        select8 varchar(50),
        select9 varchar(50),
        select10 varchar(50),
        poll_type char(1),
        no_item tinyint(2),
        PRIMARY KEY(uid)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
    mysqli_query($db,$sql);

    $sql = "CREATE TABLE IF NOT EXISTS pollresult(
        uid int(11) not null auto_increment,
        no_poll    int(10) default '0' not null,
        no_select tinyint(4),
        user_ip    varchar(15),
        submit_date    datetime,
        PRIMARY KEY(uid)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
    mysqli_query($db,$sql);

    echo "<center><font size=2>설문조사 테이블이 성공적으로 생성 되었습니다.</font></center>";
    echo "<script>location.replace('index.php')</script>";
    exit;

} else {
    //echo '<script>alert("입력된 값이 없습니다");</script>';
}
?>

<div class="container">
<h4 align=center><b>◎◎ 데이타베이스 생성 및 테이블 생성 ◎◎</b></h4>
<form name="form" method="post" action="dbcreate.php">
    <table class="table table-striped">
        <tr>
        <td colspan="3" align=center>DataBase Create Configuration</td>
        </tr>

        <tr>
        <td>Host Name</td>
        <td><input type="text" name="hostname" value="localhost" size="20"></td>
        <td>접속할 호스트 이름</td>
        </tr>

        <tr>
        <td>User Name</td>
        <td><input type="text" name="dbuser" value="root" size="20"></td>
        <td>MySQL 사용자 이름</td>
        </tr>

        <tr>
        <td>User Passwd</td>
        <td><input type="password" name="dbpasswd" value="autoset" size="20"></td>
        <td>MySQL 사용자 비밀번호</td>
        </tr>

        <tr>
        <td>DB Name</td>
        <td><input type="text" name="dbname" value="" size="20"></td>
        <td>생성할 MySQL DB이름</td>
        </tr>

        <tr>
        <td colspan=3>
        <div align='center'>
            <button type="submit" class="btn btn-primary" id="create">DB생성</button>
            <button type='reset' class="btn btn-warning">취소</button>
        </div>
        </td>
        </tr>

    </table>
</form>
</div>
</body>
</html>

블로그 이미지

Link2Me

,
728x90

자주 사용해본 방식이 아니라서 자료 찾으려면 시간도 걸리고 해서 MySQLi 방식(Prepared Statements in MySQLi
)으로 된 예제를 적어둔다.


<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// prepare and bind
$stmt = $conn->prepare("INSERT INTO member (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

// set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();

$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();

echo "New records created successfully";

$stmt->close();
$conn->close();
?>
 


$stmt->bind_result($cnt); // POD 방식에서는 에러 발생
$stmt->close(); //POD 방식에서는 에러 발생

출처 : https://www.w3schools.com/PhP/php_mysql_prepared_statements.asp

Prepared Statements in PDO 과 Prepared Statements in MySQLi

두 방식 예제 모두가 나와 있으므로 참고하면 도움된다.


위 예제로는 부족한 점이 있어서 추가로 예제를  만들어서 테스트를 하고 적어둔다.


테이블 만들기

CREATE TABLE IF NOT EXISTS `NOTICE` (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `noticeContent` varchar(100) NOT NULL,
  `noticeName` varchar(20) NOT NULL,
  `noticeDate` datetime NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 


<?php
@extract($_POST); // POST 전송으로 전달받은 값 처리
// $_POST['noticeContent']라고 쓰지 않고, $noticeContent 라고 써도 인식하게 함

// 테스트 목적으로 직접 값을 입력하여 테스트 시도
$noticeContent="공지사항 등록 테스트";
$noticeName="관리자";
$noticeDate=date("Y-m-d H:i:s");

// DB 접속 테스트
$servername = "localhost";
$username = "root";
$password = "autoset";
$dbname = "address";

// Create connection
$con = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($con->connect_error) {
    die("Connection failed: " . $con->connect_error);
}

// DB에 자료가 있는지 검사
$stmt = $con->prepare("SELECT count(*) FROM NOTICE WHERE noticeContent=? and noticeName=?");
$stmt->bind_param("ss", $noticeContent, $noticeName);
$stmt->execute(); // execute query
$stmt->bind_result($cnt); // bind result variables
if($stmt->fetch()){
    //echo $cnt;
    if($cnt == 0){ // 중복 자료가 없으면
        $stmt->close(); // close statement
        $stmt = $con->prepare("INSERT INTO NOTICE(noticeContent, noticeName, noticeDate) VALUES(?, ?, ?)");
        $stmt->bind_param("sss", $noticeContent, $noticeName, $noticeDate);
        $stmt->execute();
        
        $response = array();
        $response["success"] = true;
        echo json_encode($response);
        $stmt->close(); // close statement
    } else {
        $response = array();
        $response["success"] = false;
        echo json_encode($response);
    }
}
$con->close();
?>


types
일치하는 bind 변수의 type을 가리키는 문자열
i : integer
d : double
s : string
b : blob

블로그 이미지

Link2Me

,
728x90

네이버 지식인에 문의사항이 있길래 테이블 생성하는 방법을 적는다.


테이블 설계는 보통 phpMyAdmin 상에서 하면 편리하므로 굳이 PHP 코드 상에서 할 필요성을 느끼지 못해서 적어두지 않았다.


테이블 생성은 간단하다.


==== dbinfo.php ===

<?php
$db['host'] = "localhost";
$db['name'] = "csharp";
$db['user'] = "root";  // 원래는 root 사용하면 안되는데 연습용인지라...
$db['pass'] = "autoset";
$db['port'] = "3306";
?>


==== dbconnect.php ===

<?php
include_once 'dbinfo.php';
$connect = isConnectDb($db);

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;
";

$result=mysqli_query($dbconn,$sql);
if($result) {
    echo "DB table created !!!";
} else {
    echo "Error creating table : " . mysqli_error($dbconn);
}

mysqli_close($dbconn);
?>


여기서 한가지 알아야 할 사항은 테이블 생성시 CREATE TABLE IF NOT EXISTS member 를 하면 결과는 OK 로만 나온다. 이미 테이블이 생성되어 있으면 에러 메시지를 보이도록 하려면 CREATE TABLE member 로 수정해주면 된다.


테스트에 사용된 코드 첨부


tablecreate.zip




블로그 이미지

Link2Me

,
728x90

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 를 반환한다.

 mysql_result

 쿼리의 결과 레코드를 반환한다.

 <?php
 $dbconn = mysql_connect("localhost", "root", "mypass");
 $selectdb = mysql_select_db("test",$dbconn);

 $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)."%'";
    }
}

$sort  = isset($sort) ? $sort : 1;
if($sort ==1){
   $xsort      = "uid";
   $xorderby   = "desc";
}else if($sort ==2){
   $xsort      = "hit";
   $xorderby   = "desc";
}else if($sort ==3){
   $xsort      = "name";
   $xorderby   = "desc";
}else if($sort ==4){
   $xsort      = "cellphone";
   $xorderby   = "desc";
}

$xsort  = isset($xsort) ? $xsort : 'uid';
$xorderby= isset($xorderby) ? $xorderby : 'desc';

$sql.="order by ".$xsort." ".$xorderby."";

$curPage = isset($curPage)? $curPage : 1;  // 출력할 페이지 번호
$rowsPage = isset($rowsPage)? $rowsPage : 10; // 기본 10개씩 출력
$sql.=" LIMIT ".$curPage.",".$rowsPage."";


echo $sql; // 쿼리문이 제대로 된 것인지 확인 목적

$result=mysql_query($sql,$conn);
while($row=mysql_fetch_array($result)){
    // 출력할 내용 테이블 형태로 작성
}


?>


이와같이 복잡한 쿼리문을 유연하게 처리하기 위해서 $sql 변수를 분리해서 사용하는게 좋다.

LIMIT 개념 이해는 https://www.w3schools.com/php/php_mysql_select_limit.asp 사이트를 애용하면 대부분 해결 될 것이다.

찾고자 하는 걸 구글링을 하듯이 https://www.w3schools.com/ 사이트를 찾아보면 정말 유용한 사이트라고 감탄하게 된다.



같이보면 도움되는 게시글

http://link2me.tistory.com/1110


블로그 이미지

Link2Me

,
728x90
본 게시글은 처음 시작은 단순한 정리 개념이었는데, PHP 기본을 이해하는 핵심이라고 봐도 좋다.

네이버지식인 질문을 보면 PHP 개념은 모른 상태에서 Android 앱과의 통신을 어떻게 하는지 알고 싶은 Copy&Paste 초보자 도움 요청을 많이 본다. 가장 중요한 것은 기본 개념을 얼마나 잘 이해하고 있는가다.

스스로 로직을 그려보고 테스트하고 디버깅하면서 조금씩 성장할 수 있다.


모든 내용을 하나의 파일로 처리할 수는 없다. 파일을 모듈단위로 나누어서 처리하는게 좋다.

통신할 때 파일 처리에 대한 기본 개념을 알아야 한다.



(GET,POST 개념을 모른다면 일단 눌러서 읽어본다. http://link2me.tistory.com/398)


파일간에 정보를 넘겨주고 받기 위해서는 $_GET 배열, $_POST 배열을 사용하여 변수를 넘긴다.

$_GET 배열, $_POST 배열 구분없이 둘다 인식하도록 하려면 PHP 파일 B에서 $_REQUEST 배열을 사용한다.


아래 표에서 PHP 관련 게시글은 초보자 도움 링크를 추가한 것이니 꼭 읽어보시길 ^^


PHP

 - LoingForm.php (파일A)에서 loginID, loginPW 값을 POST 방식으로 보낸다.

 - PHP 파일B에서 읽어들일 때 $_POST 배열로 읽어서 처리한다.

 - 배열변수를 MySQL DB 변수로 보내서 결과를 return 받아서 로그인 성공과 실패를 판단한다.

 - 로그인 성공이면 main.php or list.php 와 같은 파일로 이동시킨다.

 - 로그인 실패면 LoginForm.php 파일로 다시 이동시킨다.

 MySQL DB 생성 및 사용자 권한 부여 방법 : http://link2me.tistory.com/431 참조

 MySQL 연동 기본 코딩 방법 : http://link2me.tistory.com/1213 참조

 PHP 디버깅 요령 및 경고 메시지 처리 방법 : https://link2me.tistory.com/1130 참조

 PHP 변수지정 기초 지식 : https://link2me.tistory.com/523 참조

 PHP isset 와 empty 설명 : https://link2me.tistory.com/996 참조

 닥치고 객체지향 MySQLi 연동방식 예제 : http://link2me.tistory.com/1395 참조

 제대로 배우는 자바스크립트 Form 전송 기초 : http://link2me.tistory.com/954 참조

 회원가입 및 중복체크 Form 예제 : https://link2me.tistory.com/1480 참조

 PHP Legacy 함수를 PDO Class 로 변경하는 방법 : https://link2me.tistory.com/1636 참조

 PHP PDO Class 및 부트스트랩 로그인 폼/처리 예제 : http://link2me.tistory.com/1402 참조

 Windows 기반 APM(Apaceh + PHP + MySQL) 설치 https://link2me.tistory.com/797  참조

 PHP 함수의 결과는 정수일까? String일까? https://link2me.tistory.com/1487 참조

 Android

PHP 와 Android 간 연동 처리 개념

 - Android 에서 로그인 정보를 조회한다고 하면 loginID, loginPW 값을 POST 방식으로 보낸다.

 - PHP 파일B에서 읽어들일 때 $_POST 배열로 읽어서 처리한다.

 - DB 조회 결과를 echo 문으로 출력한다.
 - echo 출력 결과를 읽어서 로그인 성공, 실패 여부를 판단 처리한다.

   가령, echo 1 이면, Android 에서는 1의 결과로 로그인 성공으로 다음 Activity 로 전환처리한다.

 - 많은 값을 결과로 돌려 받아야 하는 경우에는

   echo json_encode(배열) 로 받은 결과를 파싱하여 처리한다.

  Android JSON 파헤치기(필수사항) : https://link2me.tistory.com/1247  참조

  Android Volley 라이브러리 사용 예제 : https://link2me.tistory.com/1533 

  Android Retrofit2 라이브러리 사용 예제 : https://link2me.tistory.com/1806

  Android AsyncTask Class화하여 사용하는 방법 : https://link2me.tistory.com/1516 

  Android 암호화 로그인 처리 : https://link2me.tistory.com/1231

  Android - MySQL 연동 Web Part : http://link2me.tistory.com/1022

  Android Studio 기반 로그인 예제 : http://link2me.tistory.com/1230 

  Android Studio & PHP PDO 기반 회원가입 예제 : http://link2me.tistory.com/1405

  Android Studio & PHP PDO 기반 로그인 예제 : http://link2me.tistory.com/1404 

 C#

 - C# 에서 로그인 정보를 조회한다고 하면 loginID, loginPW 값을 POST 방식으로 보낸다.

 - PHP 파일B에서 읽어들일 때 $_POST 배열로 읽어서 처리한다.

 - DB 조회 결과를 echo 문으로 출력한다.

 - echo 출력 결과를 읽어서 C# 에서 로그인 성공, 실패 여부를 판단 처리한다.

  C# Web 접속 로그인 예제 : http://link2me.tistory.com/1118 

 

 윈도우즈 환경에서 리눅스 서버를 설치하고 Web서버를 운용할 수 있다.

 APM(Apache + PHP + MariaDB) 를 설치하는 방법을 자세히 알려주고 있다.

 - Window10 에 CentOS7(리눅스) 설치 및 APM 구성 : https://link2me.tistory.com/1885

 - 윈도우기반 APM 설치 툴 autoset9 : http://link2me.tistory.com/797

 - Apache 환경설정 방법 : http://link2me.tistory.com/426, http://link2me.tistory.com/999

 - PHP 환경 설정 방법 : http://link2me.tistory.com/967, http://link2me.tistory.com/986


Web(PHP 파일B) 에서 변수가 없거나 값이 넘어오지 않을 경우에는 동작하지 않도록 코딩을 해야 한다.


초보자들이 가장 많이 하는 실수(내가 초보시절에 겪은 실수)는 통신방식을 고려하지 않고 코딩을 하거나 서버 세팅정보를 대충 하는 것이다. 대화해보면 코딩 좀 하는 분도 이런걸 대략 하는 분이 있다. (한국어와 영어 소통하는 것과 같은 것)

UTF-8 로 세팅한다는 의미는 파일 Encoding Mode 도 UTF-8 로 하고, 서버에 세팅도 UTF-8 로 하고 DB에도 UTF-8 로 해야 한다는 것이다. (엑셀은 EUC-KR 방식으로 CSV 파일 내보내기를 한다)


참고사항


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 방식은 연결 방식이 약간 다르므로 코딩시 실수하지 않도록 주의가 필요하다.

======== dbinfo.php ======

<?php
$db['host'] = "localhost";
$db['name'] = "";
$db['user'] = "";
$db['pass'] = "";
$db['port'] = "3306";
?>


======= dbconnect.php ========

PHP 프로그램 내에서 MySQL 데이터베이스에 접근하는 함수가 mysqli_connect()이다.

$dbconn 라고 했지만 $db 또는 $conn 등 개발자 취향에 따라 변수명을 지정한다.

dbClass.php 에 만든 사용자 함수에 global $dbconn 연결 부분과 관련된 사항이다.


MySQLi 접속용과 MySQL 접속용 코드가 약간 다르다는 걸 확인하고 맞게 사용해야 한다.

MySQLi

<?php
include_once 'phpclass/dbinfo.php';
$dbconn = isConnectDb($db);

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;   
    }
}
?>

 MySQL

<?php
include_once 'phpclass/dbinfo.php';
$dbconn = isConnectDb($db);

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는 동작되지 않도록 해야 한다.

파일B에서 값이 제대로 넘어왔는지 체크하는 방법은 http://link2me.tistory.com/1130 를 참조하면 도움된다.


아래 코드는 실제로 사용하는 코드다.

안드로이드에서 받은 입력값과 웹 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(); // 로그인 처리 관련 함수를 모아서 작성한 클래스

   $deviceID = $deviceID ? $deviceID : '';  // 안드로이드 접속인지 PHP Web 접속인지 판단

    if(empty($deviceID)){ // 장치 값이 없으면, 즉 Web 접속이면
        $row = $c->WebUserAuthCheck($loginID,$loginPW);
        if(is_array($row)) {
            if($row['code'] > 0) {
                $_SESSION['userID'] = $row['id'];
                $_SESSION['userPW'] = md5($loginPW);
                $_SESSION['code'] = $row['code'];
                $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
                $_SESSION['ua'] = $_SERVER['HTTP_USER_AGENT'];
                $c->AccessLog($_SESSION['userID'],''); // 접속 로그 기록

                echo("<meta http-equiv='Refresh' content='0; URL=mobile/list.php'>");
            } else {
                echo '권한 불가';
            }
        } else if($row == '0'){
            $msg ='정보가 올바르지 않습니다';
            echo "<script>alert('".$msg."');history.go(-1);</script>";
        } else {
            $msg ='정보가 올바르지 않습니다';
            echo "<script>alert('".$msg."');history.go(-1);</script>";
        }

    } else {  // 안드로이드 접속이면
        $result = $c->MobileUserAuthCheck($loginID,$loginPW,$deviceID);
        if($result > 0 ) {
            session_save_path('./_tmp/session');

            $_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
?>


위 SQL 인젝션 방지 코드가 완벽하지 않을 수도 있다.

정규식 예제 : https://link2me.tistory.com/1489 를 참조하면 조금 더 도움될 것으로 본다.

그리고 구글링으로 PHP 정규식 을 검색해서 코드를 완벽하게 보완하면 좋을 것이다.



첨부파일 (db 연결함수)

dbconn.ZIP


본 첨부파일은 초보자 분들이 타이핑 하면서 실수하지 않게 제공하는 것입니다.

블로그내 다른 소스를 복사해서 활용하고 싶다면 c browser 를 검색해서 설치하고 사용하면 됩니다.

도움되셨다면 댓글이나 공감 부탁드립니다.



추가 작성 : 2016-11-23일자 (네이버지식인 답변시 추가)

DB를 연결하는 방법만 언급하다보니 함수화하는 것과 연결고리를 잘 모르는 분을 위해서 적어본다.

통계처리용으로 만는 함수다. 함수화를 해두면 나중에 추가할 사항이 있으면 함수만 추가하면 된다.

MySQLi 를 사용하는 환경이면 사용자 함수도 MySQLi 기반으로 수정해주면 된다.


=== statClass.php ===


이런 함수를 호출해서 사용하는 방법은 간단하다.

<?php

require_once "statsClass.php";
$s=new StatsClass(); // 객체 생성(인스턴스화)
$row = $s->today_statsCount(); // 배열이므로 배열로 받아서

?>

<?php echo '개인별(오늘/어제) : '.$row[0].'/'.$yes[0];?></th>


도움이 되셨다면 00 해 주세요. 좋은 글 작성에 큰 힘이 됩니다.


블로그 이미지

Link2Me

,
728x90

mysql_num_rows() 함수는 데이터베이스에서 쿼리를 날려서 나온 레코드들의 갯수를 카운트할 때 사용한다.
값이 없으면 0, 값이 있으면 레코드 갯수를 반환한다.

function MemberInfoView($id,$pw){
    global $db;
    $query="select * from member ";
    $query.="where userID='".$id."' and passwd=md5('".$pw."')";
   
    if($result=mysql_query($query)){
        $cnt=mysql_num_rows($result); // 개수 반환
        if($cnt==1) {
            $row=mysql_fetch_array($result);
            return $row;
        } else {
            return $cnt;
        }
       
    } else {
        return 0;
    }
}


mysql_num_fields($result); // 칼럼의 개수를 구할 때 사용

블로그 이미지

Link2Me

,
728x90

PHP 에서 MySQL 을 접속하고 DB 작업을 편리하게 하는 함수이다.

킴스큐 RB 빌더는 DB 접속 등 함수화를 해서 편하게 코딩하게 만들었다.

하지만 아쉬운 점은 Class 화를 하지 않아서 좀 불편한 면이 있다.

아래 Class 는 나의 사용 환경에 맞게 변경하거나 신규 기능을 추가하여 사용하고 있다.

본인만의 함수를 만들면 코딩이 간단해지고 직관적으로 이해할 수 있다.


MySQL 접속 환경이 MySQL 인가? MySQLi 인가? 에 따라 함수를 선택해서 사용하면 된다.


함수 사용법

===== dbconnect.php ======

include_once $_SERVER['DOCUMENT_ROOT'].'/db.info.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/phpclass/dbClass.php';
$conn=new MySQLDbClass();
$DB_CONNECT = $conn->isConnectDb($DB);


===== db.info.php ===== 파일에는 접속 정보가 들어가 있다.

<?php
$DB['host'] = "localhost";
$DB['name'] = "DB명";
$DB['user'] = "DB접속ID";
$DB['pass'] = "DB패스워드";
$DB['port'] = "3306";
$DB['type'] = "MyISAM";
?>


===== dbClass.php ======

<?php
class MySQLDbClass {

    function isConnectDb($db) {
        $conn = mysql_connect($db['host'].':'.$db['port'],$db['user'],$db['pass']);

        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;
    }

    //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;
    }

}//end dbClass

?>

블로그 이미지

Link2Me

,
728x90

// 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);
}

?>

블로그 이미지

Link2Me

,
728x90

PHP 를 이용하여 MySQL 칼럼명을 가져오는 코드를 필요했다.

테이블을 INNER JOIN 하면서 select * from tableA a, tableB b where a.uid=b.uid 로 하면 tableA 와 tableB의 모든 칼럼을 가져오게 된다.


가져오고 싶은 것은 tableA의 칼럼만 가져오고 싶어서 함수로 구현했다.


<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/dbconnect.php'; //db접속

echo getColumns('member_table'); // table name

function getColumns($table){

    global $DB_CONNECT;
    $fields = array();
    $res=mysql_query("SHOW COLUMNS FROM ".$table."");
    while ($x = mysql_fetch_assoc($res)){
      array_push($fields,$x['Field']);
    }

    for($i = 0; $i < count($fields); $i++){
        $columns = join($fields,",");
    }
    return $columns;
}

?>


블로그 이미지

Link2Me

,
728x90

PHP 낮은 버전을 높은 버전으로 업그레이해서 사용할 때 실수를 해서 적어둔다.


PHP 낮은 버전에서는 MySQL 을 사용하고, 높은 버전에서는 MySQLi 를 사용한다.

이런 부분에서 처리를 제대로 못해주니까 동작하는게 제대로 동작이 잘 안된다.


MySQLi 를 사용하는 문법과 MySQL 를 사용하는 문법이 별반 다를게 없지만 약간 차이가 있다.

MySQLi 에서 i 는 improved 로 MySQL 성능이 더 좋아졌다고 한다.


$conn = mysqli_connect($db_host,$db_user,$db_pass,$db_name,$db_port);

$conn = mysql_connect($db_host,$db_user,$db_pass);
$db = mysql_select_db($db_name,$conn);


접속하는 문법이 약간 달라졌다.

이런 부분을 고려해줘야 한다.


mysql_fetch_array($que);

mysqli_fetch_array($que); // i 가 추가되었다.


$result = mysql_query($sql, $db)

$result = mysqli_query($db, $sql)

로 순서가 변경된 것을 주의하지 않으면 오류가 발생한다.

블로그 이미지

Link2Me

,