본문으로 바로가기

프로그램 검색 결과

해당 글 92

[MySQL] 가상 일련번호 부여 하기

category 프로그램/SQL 2016/10/08 11:06
[MySQL] 가상 일련번호 부여 하기

SET @cnt := 0;
SELECT @cnt := @cnt + 1 AS No, COL1 from TABLE;

/* 아래는 IF문 사용*/
SELECT @cnt := if( @cnt > 10,  0, 1) AS No, COL1 from TABLE;
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

[MYSQL] 날짜로 group by

category 프로그램/SQL 2016/10/06 11:01
[MYSQL] 날짜로 group by

/* '%Y%m%d' 혹은 '%Y-%m-%d' */
select 
    date_format(articleregdt, '%Y%m%d') as date, 
    count(*) 
from article 
group by date_format(articleregdt, '%Y%m%d') 
order by date asc
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

[MySQL] limit , offset

category 프로그램/SQL 2016/09/28 10:16
[MySQL] limit , offset

게시판을 만들거나 혹은 전체 목록에서 페이지를 나누다 보면은 항상 사용하게 되어 있습니다.
조금은 형태를 바꾼 방식이라고 보시면 됩니다.

/* 1번 query */
SELECT * FROM Orders LIMIT 10 OFFSET 15

/* 2번 query */
SELECT * FROM Orders LIMIT 15, 10


위에 쿼리에 보이듯이 1번, 2번은 동일한 결과물이 나오도록 합니다.
정확하게 설명은 못하겠지만은 쿼리의 성능을 올리기 위해라고 저는 이해 하고 있습니다.

좀 더 설명을 잘하지 못해서 제가 검색한 사이트인 "http://crystalcube.co.kr/163" 의 링크를 걸어 놓겠습니다.

참조 
http://www.w3schools.com/php/php_mysql_select_limit.asp
http://ralf79.tistory.com/722
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

[PHP] PHP MySQL PDO Class 파일 Ver. 2

category 프로그램/PHP 2016/09/24 10:11
[PHP] PHP MySQL PDO Class 파일 Ver. 2

기존에 동일한 게시물이 있습니다.
물론 크게 변하지는 않았지만 요구하는 조건이 서로 다르기에 글을 하나더 늘리는 방향으로 잡았습니다.
다소 중복된 글이 있더라도 양해해주시기 바랍니다.
이전 게시물을 보기 위해서는 이곳(PHP MySQL PDO Class 파일)을 클릭해주십시오.

이렇게 변경한 이유는 게시판에 사용을 하기 위해서 하다보니 매일 limit 를 사용하고 전체 게시물을 구하는 작업을 좀 줄여 보기 위해서 입니다.
실제적으로는 MySQL에 쿼리를 2번 조회하지만 실행 파일에서는 1번만 하면은 모든것이 됩니다.
limit , offset을 조합해서 사용할 수 있도록 수정을 한 버전입니다.

<?php
class DbMysqlLocal {

    private $host = 'localhost';
    private $user = 'user ';
    private $pass = 'pass ';
    private $dbname = 'dbname ';
    private $port = '3306';

    
    private $dbh;
    private $error;
    
    private $stmt;
    private $stmt1;
    
    private $foundrow;
    
    public function __construct()
    {

        // Set DSN
        $dsn = 'mysql:host='.$this->host.';port='.$this->port.';dbname='.$this->dbname;
        // Set options
        // ATTR_EMULATE_PREPARES : limit offset 에 숫자 넣으면은 에러 날 경우에 이 옵션 활성화
        $options = array(
            PDO::ATTR_PERSISTENT        => true,
            PDO::ATTR_ERRMODE           => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_EMULATE_PREPARES  => false
        );
        // Create a new PDO instanace
        try{
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
            $this->dbh->exec("SET CHARACTER SET utf8");
        }
        // Catch any errors
        catch(PDOException $e){
            $this->error = $e->getMessage();
        }
    }
    
    /**
     * @brief
     *
     **/
    public function query($query)
    {
        //echo 'InQuery : '.$query.chr(10);
        $this->stmt = $this->dbh->prepare($query);
    }
    
    public function bind($param, $value, $type = null)
    {
        if (is_null($type)) {
            switch (true) {
                case is_int($value):
                    $type = PDO::PARAM_INT;
                    break;
                case is_bool($value):
                    $type = PDO::PARAM_BOOL;
                    break;
                case is_null($value):
                    $type = PDO::PARAM_NULL;
                    break;
                default:
                    $type = PDO::PARAM_STR;
            }
        }
        
        $this->stmt->bindValue($param, $value, $type);
    }
    
    /**
     * @brief
     *
     **/
    public function execute()
    {
        return $this->stmt->execute();
    }
    
    /**
     * @brief
     *
     **/
    public function resultset()
    {
        $this->execute();
        $return = $this->stmt->fetchAll(PDO::FETCH_ASSOC);
        
        $this->stmt1 = $this->dbh->prepare("SELECT FOUND_ROWS()");
        $this->stmt1->execute();
        $row = $this->stmt1->fetch();
        $this->foundrow = $row[0];
        
        return $return;
    }
    
    /**
     * @brief
     *
     **/
    public function single()
    {
        $this->execute();
        $return = $this->stmt->fetch(PDO::FETCH_ASSOC);

        $this->stmt1 = $this->dbh->prepare("SELECT FOUND_ROWS()");
        $this->stmt1->execute();
        $row = $this->stmt1->fetch();
        $this->foundrow = $row[0];
        
        return $return;
    }
    
    /**
     * @brief
     *
     **/
    public function rowCount()
    {
        return $this->stmt->rowCount();
    }
    /**
     * limit 사용하더라도 전체 row 수를 가져올 수 있는 select 에서 사용함
     **/
    public function rowFound()
    {
        return $this->foundrow;
    }    
    
    /**
     * @brief
     *
     **/
    public function lastInsertId()
    {
        return $this->dbh->lastInsertId();
    }
    
    /**
     * @brief
     *
     **/
    public function debugDumpParams()
    {
        return $this->stmt->debugDumpParams();
    }
    
    /**
     * @brief
     *
     **/
    public function showMessage()
    {
        return $this->error;
    }
    
    /**
     * @brief
     *
     **/
    public function beginTransaction()
    {
        return $this->dbh->beginTransaction();
    }
    
    /**
     * @brief
     *
     **/
    public function endTransaction()
    {
        return $this->dbh->commit();
    }
    
    /**
     * @brief
     *
     **/
    public function cancelTransaction()
    {
        return $this->dbh->rollBack();
    }
    
    
}




크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

[PHP] class 자동 로딩(autoload)

category 프로그램/PHP 2016/09/21 13:59
[PHP] class 자동 로딩(autoload)

지속적으로 class 파일이 늘어 남으로 인해서 include, require 를 사용하기도 힘들어지기도 합니다.
그래서 최상단에 모든 파일이 1개 파일을 호출 하면은 class 파일은 자동으로 로딩하도록 하기 위해서 PHP에서 제공하는것을 사용해서 사용을 하고 있습니다.

/* 편의상 comm.php 라고 해당 파일을 명명하겠습니다. */
define('_CLASSPATH_',  '/home/user/class');

spl_autoload_register(function ($class) {
    require_once (_CLASSPATH_.'/class/'.$class.'.class.php');
});


위에 파일을 하나 만들고 사용하고 싶은곳은 파일에서 위의 파일을 include, require 하면 됩니다.

이렇게 하면은 class 파일간에 상속이 필요하지 않습니다.
제가 만들다가 알게 된것이라서 100% 공식적인 기능이라고 생각 하지 않지만 저는 잘 사용하는 편입니다.

class 파일은 welcome.class.php , getout.class.php 파일입니다.
실제 실행되는파일은 main.php 파일입니다.


main.php 파일은 welcome.class.php 을 선언하고 사용을 하지만은 올바르지 않으면은 쫒아 내려고 합니다.
welcome.class.php 파일은 일단 환영을 하도록 되어 있지만 쫒아내는 기능은 없습니다.

저는 예전에는 main.php 파일에서 welcome.class.php 도 포함하고 getout.class.php 도 포함해서 사용을 했지만은 지금은 이렇게 사용을 하고 있습니다.
main.php 에서 welcome.class.php 포함해서 사용을 하다가 welcome.class.php 파일에서 getout.class.php 파일을 선언해서 사용을 합니다.
그러면은 main.php 파일은 깔끔하게 welcome.class.php 만 호출하기에 가편하기도 한것 같고요...

아래에 한번 예제적으로 소스 코드 적어 보겠습니다.

아래 main.php에서는 1개의 클래스 파일만 조회하면은 됩니다.
주 목적이 해당 사용자에게 인사를 하는것이지 체크를 하기 위해서는 아닙니다.
그렇기에 main.php에서는 인사를 보여주도록 합니다.
/* main.php */
$welcomeObj = new Welcome();
echo $welcomeObj->accessCheck();


이제 인사쪽에서 와서는 이 사람이 정식적으로 허가가 된 사람인지도 알아야 합니다.
하지만 자기 본래 기능은 인사이지 다른 기능이 아닙니다.
그래서 쫒아낼지에 대해서는 알 수 없어서 해당 class 파일에게 요청을 합니다.
/* Welcome.class.php */
class Welcome {
    function accessCheck()
    {
       $getoutObj = new Getout();
       $data = $getoutObj->check();

       if( isset($data) ) {
           return '잘 들어왔어요';
       } else {
           return null
       }
    } 
}


쫒아낼지 결정하는 class 파일에서는 일단 들어온 요청으로 값을 체크해서 정확한지 판단을 합니다.
이 사람이 정상적이면은 통과하고 아니면은 쫒아내라고 할수 있고 그 자리에서 멈춰서 더 이상 실행이 되지 않도록 할수도 있습니다.
/* Getout.class.php */
class Getout {
    function check() 
    {
       if( 접속자  == 허용) {
          return true;
       } else {
           return false;
       }
    }
}



아직 배우는 입장이여서 정확하게 설명을 부족하지만은 class 파일이 이렇게 긴밀하게 연결되는것은 좋지 않다고 생각도 하지만은 class 파일은 자신의 할일은 명확해야 합니다.
만약 사용자 접근을 동일 class 안에서 모두 처리하면 class 내에 파일이 지저분하게 늘어나기도 하고, 어떤곳은 수정이 되지만 어떤곳은 되지 않는 경우도 발생을 합니다.

그래서 class 파일은 명확한 일을 하고 그 해당 일이 아닌것은 다른곳에서 도움을 받고 그 결과값을 받아야 한다고 생각을 합니다.
서로 서로 연결되다 보면은 전달하는 인자값이나 결과값을 모두 생각해야 되기 때문에 정확하게 작성하고 파일에 대한 설명도 정확하게 있어야 할것 같습니다.

더욱더 열심히 공부를 해서 좀 더 정확하게 한번 해보도록 하겠습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

[PHP] 문자 타잎 체크

category 프로그램/PHP 2016/07/27 08:53
function StrTypeCheck($str, $type){

    switch ($type){
        case "digit":    //숫자만
            $filter = "'^[[:digit:]]*$'";
        break;
        case "alpha":    //영문만
            $filter = "'^[[:alpha:]]*$'";
        break;
        case "alnum":    //영문,숫자만
            $filter = "'^[[:alnum:]]*$'";
        break;
        case "falnum":    //영문,숫자만(첫자는 영문)
            $filter = "'^[a-zA-Z][0-9a-zA-Z]*$'";
        break;
        case "lalpha":    //소-영문만
            $filter = "'^[a-z]*$'";
        break;
        case "ualpha":    //대-영문만
            $filter = "'^[A-Z]*$'";
        break;
        case "lalnum":    //소-영문,숫자만
            $filter = "'^[0-9a-z]*$'";
        break;
        case "ualnum":    //대-영문,숫자만
            $filter = "'^[0-9a-z]*$'";
        break;
        case "email":    //이메일
            $filter = "'^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$'";
        break;
        case "domain":    //도메인
            $filter = "'^[a-zA-Z0-9]*((-|\.)?[a-zA-Z0-9])*\.([a-zA-Z]{2,4})$'";
        break;
        case "koralnum":    //한글숫자영문
            $filter = '/^([\xEA-\xED][\x80-\xBF]{2}|[0-9a-zA-Z])+$/';
        break;
        case "koralnumspace":    //한글숫자영문공백
            $filter = '/^([\xEA-\xED][\x80-\xBF]{2}|[0-9a-zA-Z\s])+$/';
        break;
        case "kor":        //한글
            $filter = '/^([\xEA-\xED][\x80-\xBF]{2})+$/';
        break;
    }

    if( preg_match($filter, $str, $matches) )    return true;
    else                                            return false;

}
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

[PHP] PHP MySQL PDO Class 파일

category 프로그램/PHP 2016/04/05 08:56
평소 작업을 하기 위해서 SQL 인젝션도 생각해야 되고 조금 귀찮은 부분이 있었는데....
이제는 그냥 PDO를 사용해 버립니다.

그럼으로 인해서 인젝션는 그냥 조금 무시하는 편입니다.


<?php
class dbMysql {

    private $host = "localhost";
    private $user = "사용자";
    private $pass = "암호";
    private $dbname = "데이터베이스";
    
    private $dbh;
    private $error;
    
    private $stmt;
    
    public function __construct() {
        // Set DSN
        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
        // Set options
        $options = array(
            PDO::ATTR_PERSISTENT    => true,
            PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION
        );
        // Create a new PDO instanace
        try{
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
            $this->dbh->exec("SET CHARACTER SET utf8");
        }
        // Catch any errors
        catch(PDOException $e){
            $this->error = $e->getMessage();
        }
    }
    
    /**
     * @brief
     *
     **/
    public function query($query){
        $this->stmt = $this->dbh->prepare($query);
        //echo $query.chr(10);
    }
    
    public function bind($param, $value, $type = null){
        if (is_null($type)) {
            switch (true) {
                case is_int($value):
                    $type = PDO::PARAM_INT;
                    break;
                case is_bool($value):
                    $type = PDO::PARAM_BOOL;
                    break;
                case is_null($value):
                    $type = PDO::PARAM_NULL;
                    break;
                default:
                    $type = PDO::PARAM_STR;
            }
        }
        
        $this->stmt->bindValue($param, $value, $type);
    }
    
    /**
     * @brief
     *
     **/
    public function execute(){
        return $this->stmt->execute();
    }
    
    /**
     * @brief
     *
     **/
    public function resultset(){
        $this->execute();
        return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    
    /**
     * @brief
     *
     **/
    public function single(){
        $this->execute();
        return $this->stmt->fetch(PDO::FETCH_ASSOC);
    }
    
    /**
     * @brief
     *
     **/
    public function rowCount(){
        return $this->stmt->rowCount();
    }
    
    /**
     * @brief
     *
     **/
    public function lastInsertId(){
        return $this->dbh->lastInsertId();
    }
    
    /**
     * @brief
     *
     **/
    public function debugDumpParams(){
        return $this->stmt->debugDumpParams();
    }
    
    /**
     * @brief
     *
     **/
    public function showMessage() {
        echo $this->error;
    }
    
    /**
     * @brief
     *
     **/
    public function beginTransaction(){
        return $this->dbh->beginTransaction();
    }
    
    /**
     * @brief
     *
     **/
    public function endTransaction(){
        return $this->dbh->commit();
    }
    
    /**
     * @brief
     *
     **/
    public function cancelTransaction(){
        return $this->dbh->rollBack();
    }
    
    
}
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

가공된 정보를 텔레그램으로 수진하는것입니다. 네이버 LINE이나 kakaotalk도 있지만 해당 메신저들은 공개된 API가 없어서 우회해서 받아야 하기 때문에 귀찮은 작업이 동반되지만 텔레그램은 봇을 통해서 제가 직접 메세지를 작성해서 보내면은 제가 수진을 할 수도 있습니다.

제가 활용하는것은 RSS수집후 필요한 정보 알림과, 서버의 정보를 일정시간마다 수신하는 방법으로 쓰고 있습니다.
이 방법외에도 봇을 통해서 계속 메세지를 받을 수 있습니다.

뭐 거창한것도 아니며, 제가 PHP로 사용하는 소스 코드입니다.
class를 흉내내서 만들어 둔것입니다.

※ PHP (cli)에서 작동합니다.

<?php

/*
https://telegram.me/botfather 접속하여 봇아빠를 채팅창에 호출 하고 다음 커맨드를 입력
 
-------------------------------
봇이름 /newbot
봇실제아이디(끝에 bot을 붙여준다)
/token
/setabouttext
봇정보 안내문구
/setdescription
접속문구
-------------------------------
 
token이 바로 api 
*/
class telegram {
    
// 기본환경설정
    private $tokenKey = '토큰키';
    private $baseUrl = 'https://api.telegram.org/bot';
    private $sendBool = false;
    private $messageChatId = '';
    private $messageText = '';
    
    /**
     * @brief
     *
     **/
    public function __construct() { 
        $this->baseUrl = $this->baseUrl.$this->tokenKey;
    } 
    /**
     * @brief   curl 요청 
     *
     **/
    private function GetCurl($url, $data=array()) {
        
        // 서버로 전송 및 결과 반환
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($ch);
        curl_close($ch);
        
        return json_decode($result, true);
    }
     
     
    /**
     * @brief   텔레그램에서 정보를 가져오는것
     *
     **/
    public function getData($offsetId) {
        
        $url =  $this->baseUrl.'/getUpdates?limit=100&offset='.$offsetId; //?limit=1
        $return = $this->GetCurl($url);

        $returnData = array();
        foreach($return['result'] as $key=>$value) {

            //$Room_id[] = $value['message']['chat']['id'];
            $returnData[$key]['updateId']             = $value['update_id'];
            $returnData[$key]['messageText']          = $value['message']['text'];
            $returnData[$key]['messageDate']          = $value['message']['date'];
            $returnData[$key]['messageFromId']        = $value['message']['from']['id'];
            $returnData[$key]['messageFromUsername']  = $value['message']['from']['username'];
            $returnData[$key]['messageChatId']        = $value['message']['chat']['id'];
            $returnData[$key]['messageChatUsername']  = $value['message']['chat']['username'];
            
            // 단체방처리
            if( empty($returnData[$key]['messageChatUsername']) == true) {
                $returnData[$key]['messageChatUsername'] = $value['message']['chat']['title'];
            }
        }

        // 일단 받아온 정보 리턴
        return $returnData;
    }
    
    /**
     * @brief   텔레그램으로 전달하는것
     *
     **/
    public function setData($msg='', $chatId='') {
        
        $returnBool = false;
        
        if( empty($msg) == false && empty($chatId) == false) {
            //echo '전송 완료'.chr(10);
            
            // 메세제 URL 조합하기
            $urlSum = '';
            $urlSum .= $this->baseUrl.'/sendMessage?chat_id=';
            $urlSum .= $chatId;
            $urlSum .= '&text='.urlencode($msg);
            
            $sendStatus = $this->GetCurl($urlSum);
            $returnBool = $sendStatus['ok'];
            
        }
        
        return $returnBool;
    }
}


위에것이 전체적으로 사용되는 class 파일리며, 이제 Chat ID를 획득 해야 합니다.
전체 코드를 모두 공개 할 수는 없지만은 일단 일부 코드를 공개 합니다.

$tg = new telegram();
$returnData = $tg->getData($offsetId);

foreach($returnData as $key=>$value) {
        //echo "V 체크할ID         : ".$offsetId.Chr(10);
        //echo "V updateId      : ".$value['updateId'].Chr(10);
        //echo "V message Text: ".$value['messageText'].Chr(10);
        //echo "V message Date       : ".$value['messageDate'].Chr(10);
        //echo "V message From Id      : ".$value['messageFromId'].Chr(10);
        //echo "V message From Username     : ".$value['messageFromUsername'].Chr(10);
        //echo "V message Chat Id      : ".$value['messageChatId'].Chr(10);
        //echo "V message Chat Username      : ".$value['messageChatUsername'].Chr(10);
}



위코드를 가지고 이제 DB에 chatID를 저장하고 하면 됩니다.
그러면은 이제 봇을 통해서 대화방에 들어온 ID는 모두 DB에 저장되기 때문에 이 ID로 구분해서 전송을 할 수 있습니다.

호출하는것은 쉽게 아래와 같습니다.
일단 전송하는것인데...... 전송할 채팅방ID는 위에서 획득한 정보를 가지고 조합하시면 됩니다.

    $tg = new telegram();
    $returnBool = $tg->setData($value['sendText'], 채팅ID);



사용에 대해서 캡쳐를 해야 하지만은 공개해도 될 내용이 없어서 추후에 공개해도 무관한 내용이 올라오면은 캡쳐 해서 올려 보겠습니다.


크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요


우리나라 굴지의 포털이 네이버 카페의 새글을 알림은 분명히 네이버 앱으로도 받아 볼 수 있습니다.
하지만 ID라는것이 여러사람이 공용으로 사용하기에도 뭐한부분입니다.

카페 입장에서는 대표 ID가 있는데 별도로 관리자 설정을 해주기 위해서는 부담 스러운 부분도 존재하고, 작업사업자이다 보니 몇개월 있다가 나가면은 또 다시 카페의 최고관리자에게 ID삭제 요청등의 귀찮은 일도 생기기 바련입니다.
그외에도 게시물을 자신이 등록할 수도 있는데, 앱을 통해서 하다보면은 앱 알림 인원에게 모두 날아가게 됩니다.

카페에 가입한게 1~2개도 아니고 무수히 날라오기 시작하면은 앱을 구동하고 봐야 하고 귀찮은것도 있다고 생각을 합니다.
제가 이런것을 만들어 달라고 하신분은 단순하게 게시물을 수집하고 언제 등록되었는지 바로 알고 싶다는 정말 단순한 이유에서 였습니다.

아래 사진은 그냥 카페의 일반적인 샘플 사진입니다.
(공개된것을 사용할 수가 없어서요)

사용자 삽입 이미지


이렇게 게시판 형태로 되어 있는 부분을 제목을 가지고 개인적으로 SMS를 받기 원하시는 부분이었습니다.
물론 분석 작업과 파싱 작업은 이전에 많이 하여서 약간의 변형과 이곳의 카페에 맞춰서 수정을 하였습니다.

사용자 삽입 이미지
(※ 개인정보 부분은 모자이크 처리함)

이렇게 수집된 게시물의 정보를 가지고 DB에 저장을 해 놓습니다.
DB를 보여주는 화면을 캡쳐한 부분인데, 날짜부분 앞에 있는것은 Unix Timestamp 형식으로 SMS 발송전에 체크를 위해서 YYYY-MM-DD HH:mm:SS 형식이 아닌 timestamp 형식을 사용하였습니다.
또 다른 이유는 해당 카페의 게시물의 시간 정보가 당일은 시간 (hh:mm)으로 나오지만은 날짜가 바뀌면은 YYYY.MM.DD 형식으로 변경되어서 수집된 시간이나 다른 부분을 처리 하기 위한 목적도 있습니다.

사용자 삽입 이미지

게시물의 수집된 기준을 가지고 SMS를 발송할 분에 대해서 SMS를 발생해 줍니다.
여기서 사용한 SMS 발송 API는 PHPS. CAFE24의것을 사용하였습니다.

사용자 삽입 이미지

이렇게 각 정보의 PK에 따라서 SMS 발송을 하며, 언제 발송하였는지 어떠한 내용으로 발송하였는지 기록을 해 둡니다.
또한 SMS 의 잔여량 정보를 받아 올 경우에는 잔여량 정보도 DB에 쌓아 두어서 해당 프로그램에서 발송시 몇건이 차감되었는지 추측이 가능하도록 하는것입니다.



이렇게 전송하지만은 솔직히 불필요한 부분이라고 생각을 합니다.
네이버라는 회사가 작은 회사도 아니고 대한민국 최고 포털인데, 기능의 편의성은 분명히 존재 할 것입니다.

그렇기에 만들어서 제공 하고 이미 한달 운영을 하였지만 아직도 필요성에 대해서는 회의적인 부분입니다.
작업을 요청하신분이 해달라고 하지만 이미 좋은 기능이 있는데 돈을 소비하면서 까지 이런것을 해야 하는가 싶어서 먼저 요청자에게 이런 기능은 이렇게 있다라고 말은 건내지만 수긍하지 않으면은 받아서 해 드릴뿐입니다.


모든 작업은 서버에서 처리 하기 때문에 저는 PHP (cli) 를 사용하였습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

curl를 이용해서 웹 이미지 다운로드


이번에는 전체 소스가 없습니다.
초기에 만들고 계속 수정에 수정을 거듭하다보니 저 혼자만 사용할 수 있는 조금 난해한 코드들이 넘쳐나게 되

간한히 함수랑 사용방법의 코드만 올려 놓습니다.


  public function getImage($url) 
 {
 curl_setopt($ch, CURLOPT_URL, $url); 
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 인증서 체크같은데 true 시 안되는 경우가 많다.
 curl_setopt($ch, CURLOPT_POST, false); // Post Get 접속 여부
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
 curl_setopt($ch, CURLOPT_TIMEOUT, 60); // TimeOut 값
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //http 응답코드가 302일때 redirect_url 로 따라감
 curl_setopt($ch, CURLOPT_MAXREDIRS, 5); //if http server gives redirection responce
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 결과값을 받을것인지 
 
 $data = curl_exec($this->ch);
 
 $return = base64_encode($data);
 
 return $return;
 }


위에 함수를 사용하면은 웹에서 이미지를 가져 올 수 있습니다.
이미지의 접속가능한 URL이 있어야 접속이 됩니다.

 $curlDataImg = new curlData();
 $returnImgBase64 = $curlDataImg->getImage($urlImg);
$imageSource = base64_decode( $returnImgBase64 );


위에 코드를 이용해서 이미지의 바이너리를 확인해 볼 수 있습니다.
그리고 나서 자신이 로컬에 바이너리 형식으로 저장을 하거나 하시면 됩니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

댓글을 달아 주세요

Trudy
Trudy 님의 블로그
MENU
VISITOR 오늘302 / 전체442764