1년동안 주차와 전년도 주차와 비교하기

PHP
고객이 검색한 년도의 1년동안의 매월 주를 계산을 하고 나서 기간에 따른 Row 갯수를 그래프에 표현을 하고 싶어 하기에 작성하게 된 것입니다. 조금은 난해하게 보이지만은 조건 검사가 많은 편이지 그다지 복잡한 코드는 아닙니다. $end_yearmonthday = date("Y-m-d", strtotime($_GET['end_year'].'-'.$_GET['end_month'].'-'.$_GET['end_day'])); // 이전년도 $agoTime = date('Y-m-d', strtotime(date('Y-01-01', strtotime($end_yearmonthday)).' -1 years')); $agoMaxWeek = date('W', strtotime(date('Y-12-31', strtotime($end_yearmonthday)).' -1 years')); $monthCnt = 0; $historyMonth = 0; for($w = 0; $w <= $agoMaxWeek; $w++) { $thisWeek = date('W', strtotime( $agoTime .' +'.$w.' week') ); $thisYear = date('Y', strtotime( $agoTime .' +'.$w.' week') ); $thisMonth = date('m', strtotime( $agoTime .' +'.$w.' week') ); $thisDay = date('d', strtotime( $agoTime .' +'.$w.' week') ); $dayOfTheWeek = date('w',mktime(0,0,0,$thisMonth,$thisDay,$thisYear)); // 해당주차의 시작 날짜 $today_week_sday1 = mktime(0,0,0,$thisMonth,$thisDay-$dayOfTheWeek,$thisYear); $today_week_sday2 = date("Y-m-d",$today_week_sday1); // 해당주차의 종료 날짜 $today_week_eday1 = mktime(23,59,59,$thisMonth,$thisDay+(6-$dayOfTheWeek),$thisYear); $today_week_eday2 = date("Y-m-d",$today_week_eday1); // if( $historyMonth == $thisMonth)…
Read More

PHP 503에러 의도적으로 내기

PHP
<?php header('HTTP/1.1 503 Service Temporarily Unavailable'); header('Status: 503 Service Temporarily Unavailable'); header('Retry-After: 300');//300 seconds ?> PHP를 하면서 상태코드를 돌려줘야 할때가 있습니다. 그럴경우 파일은 있지만 접근권한을 제한하기 위한 코드가 필요해서 간단히 작성해 본것입니다. 503 코드로 돌려주기 때문에 서버의 기능이 잘못되었다고 판단을 하도록 하지만, 실제 이 파일은 그냥 모든것을 503으로 해서 접근을 하지 않았으면 해서 만든것입니다. 정상적인 코드로 사용하는것이 아니라서 잘못된것이지만, 무작위로 파일을 접속하는 봇에게 착각을 불러 일으켜서 이 파일은 정상적인 기능을 하지만 지금은 에러가 있다고 판단하게 해서 그냥 한곳으로 모을려고 만든 파일입니다. 그래서 아마 다른 형식으로 가져도 되지만, 이 코드를 사용하게 된것에 대해서 정확한 용도는 아니라는 점을 알려드립니다.
Read More
단일 테이블에서 실시간 가동률 뽑기

단일 테이블에서 실시간 가동률 뽑기

Database, PHP
일단 하기는 하였는데, 말이 안된다고 생각함! 문제가 뭐냐 하면은 모니터링 데이터를 제가 가공하는것이 아니라, 누군가 가동해 놓은 데이터를 가지고 실시간으로 전달해주는 행단위로 입력된것으로 데이터를 뽑습니다. 위와 같은 화면을 뽑기 위해서 처리해야 될 일은 많지만 이미 내가 만들지 않았고, 있는 정보를 가지고 처리를 해야 합니다. 위와 같은 형식으로 행단위로 엄청나게 쌓이기 시작합니다. 매일 몇초 단위로 데이터가 계속 들어오는 상태입니다. 1개의 Table를 가지고 데이터를 뽑는게 이렇게 힘들것이라고 이번에 처음 느꼈습니다.※ 가능하면 2번 다시 하고 싶지 않음 이제 이름별로 해서 가동률을 한번 뽑아보도록 하겠습니다. MySQL에서 다음의 쿼리문들 사용하였습니다. 위의 화면에 필요한 부분이 아래의 Query 입니다. 보기보다 쉽죠? 만들어 내는대는 하루지만 정리해 놓고 보면은 쉽게 보여집니다. // 이름별 가동율 SELECT A.MACHINE_NAME, CAST(IFNULL(B.MACHINE_PCNT, 0) AS UNSIGNED ) AS MACHINE_PRODUCT_CNT, MIN(C.MACHINE_DATETIME_MIN) AS MACHINE_TIME_MIN, MAX(C.MACHINE_DATETIME_MAX) AS MACHINE_TIME_MAX, CAST(IFNULL(C.USE_TIME, '0') AS UNSIGNED ) AS USE_TIME, CAST(IFNULL(E.USE_TIME_STOP, '0') AS…
Read More

[PHP] 2차원 배열 정렬

PHP
DB에서 결과값을 가져올때 OrderBy를 할 수 있으면 더없이 좋지만 피치못할 상정으로 Query문을 수정할수가 없는 경우가 생깁니다. 이럴경우에 이미 만들어진 결과 값을 사용자에게 보여주기 전에 정렬를 해서 결과를 보여 주면 될것 같습니다. foreach ((array) $result as $key => $value) { $sort[$key] = $value['objNumber']; // 정렬를 위한 키값 } array_multisort($sort, SORT_DESC, $result); //array_multisort($sort, SORT_ASC, $result); 최근에 위 정렬 방법으로 정렬을 함으로 인해서 기존의 코드를 수정하지 않고 결과를 재정렬해서 보여줄수 있도록 해 본적이 있습니다.
Read More

[PHP] 라인 Notify 기능

PHP
API 토큰 생성 사이트 : https://notify-bot.line.me/my/ 위 사이트에서 토큰을 발행 합니다. 아래의 기능으로 PHP 파일을 작성해서 데몬에 올려도 되고, cron에 작업해도 됩니다. $APIURL = "https://notify-api.line.me/api/notify"; $APIKey = "발행한 Key"; if ($imgUrl === null) { $postData = [ "message" => $msg ]; } else { $postData = [ "message" => $msg, "imageThumbnail" => $imgUrl, "imageFullsize" => $imgUrl ]; } $fields = ''; foreach ($postData as $dataKey => $dataValue) { $fields .= $dataKey . '=' . $dataValue . '&'; } rtrim($fields, '&'); $curlOptions = [ CURLOPT_URL => $this->APIURL, CURLOPT_POST => 1, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_POSTFIELDS => $fields, CURLOPT_HTTPHEADER => [ "authorization: Bearer ". $APIKey, "content-type: application/x-www-form-urlencoded" ], ]; $curl = curl_init(); curl_setopt_array($curl, $curlOptions); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl);
Read More

[PHP] date, 날짜 포맷 설정

PHP
년도와 관련된 포멧  문자  설명  예 Y 4자리 숫자로 표시  1999, 2003 y 2자리 숫자로 표시 99, 03 o ISO-8601에 맞는 포맷으로 표시 (Y랑 같으나, ISO 규격에 맞는 W가 포함한 년을 사용) 1999, 2003 L 윤년 여부 윤년 : 1아닐경우 : 0 월과 관련된 포맷 문자  설명 예  F 달을 영어로 표시  January, December M 3자리의 짧은 영어로 표시 Jan, Dec m 0을 앞에 붙인 2자리 숫자  01, 12 n 월을 숫자로 표시 1, 12 t 해당하는 달의 수를 표시 28, 30, 31 일과 관련된 포맷 문자 설명 예 d 0을 앞에 붙인 2자리 숫자 01 ~ 31 j 일을 숫자로 표시 1 ~ 31  z 1년의 n번째 날  0 ~ 365 S 날짜 뒤에 영어 2글자 suffix 추가 st, nd, rd or th (j와 잘 연동됨) 예: 1st, 2nd, 3rd,…
Read More

[PHP] MySQL 데이터 출력

PHP
1. mysql_fetch_row()mysql_fetch_row()는 데이터를 0으로 시작하는 숫자형 인덱스 배열로 반환합니다. $row = mysql_fetch_row($result); echo $row[0]; 2. mysql_fetch_assoc()mysql_fetch_assoc()는 데이터를 문자형 연관 배열로 반환합니다.배열의 키 이름으로는 필드의 이름을 갖습니다. $row = mysql_fetch_assoc($result); echo $row['key']; 3. mysql_fetch_array()mysql_fetch_array()는 $result_type의 값에 따라 반환될 배열의 형태가 다릅니다. $result_type의 값으로는 아래와 같은 상수가 올 수 있으며, 기본값은 MYSQL_BOTH입니다.  - MYSQL_NUM: 이 상수를 사용하면 숫자형 인덱스 배열을 반환합니다.  =  mysql_fetch_row()  - MYSQL_ASSOC: 이 상수를 사용하면 문자형 연관 배열을 반환합니다.  =  mysql_fetch_assoc()  - MYSQL_BOTH: 이 상수를 사용하면 인덱스 배열과 연관 배열을 동시에 반환합니다. ex) $row = mysql_fetch_array($result, MYSQL_BOTH) echo $row['key']; 4. mysql_result()mysql_result($query,0,0);    =>  ' 0행 0열 값 'mysql_result($query,0,1)     =>  ' 0행 1열 값 'mysql_result($query,1,1)     =>  ' 1행 1열 값 ' 5. 주의 사항mysql_fetch_row(), mysql_fetch_assoc(), mysql_fetch_array() 세 함수는 한 행에서 데이터를 읽습니다.또한 데이터를 읽은 후 함수 내부의 포인터를 증가시켜 다시…
Read More

[PHP] twitter API를 통해서 데이터 얻기

PHP
API 파일 출처 : http://github.com/j7mbo/twitter-api-php 위 사이트에서 API 파일을 획득 하였으며, 해당 기능을 위해서 사용을 합니다.트위터에 글을 올릴수도 있지만 현재 제가 사용하는 기능은 특정 계정의 글을 수집해서 서버에 저장 하기 위해서 필요한 기능입니다.API 파일에는 그 밖에도 많은 기능이 있지만은 전 일방적으로 글 내용을 가져오는 기능으로만 코드를 정리 합니다. /** * API 사용을 위한 기본 설정 **/ $SETTINGS = array( 'consumer_key' => "트위터에서 제공해주는 값", 'consumer_secret' => "트위터에서 제공해주는 값", 'oauth_access_token' => "트위터에서 제공해주는 값", 'oauth_access_token_secret' => "트위터에서 제공해주는 값" ); $URL = 'https://api.twitter.com/1.1/statuses/user_timeline.json'; /** * 트위터에 요청하고 결과값 받기 **/ $getfield = '?screen_name=트위터 계정명&count=받아올 숫자'; $twitterObj = new TwitterAPIExchange($SETTINGS); $response = $twitterObj->setGetfield($getfield)->buildOauth($URL, 'GET')->performRequest(); $response = json_decode($response, true); 이 이후 설정을 자신의 결과값을 보고 필요한 형태로 가공을 하면 됩니다.현재 가공 정보가 제가 독자적으로 가공하는 정보여서 기본 형태를 새롭게 만들경우에 해당 글을…
Read More

[PHP] 랜덤 문자열 생성

PHP
코딩시 가끔 무작위문자열이 필요할때가 있는데 시스템이나 내장함수에서 제공하는 방식은 원하는 기준으로 맞추기가 번거롭다.단순 비교만 사용되는 토큰이나 인증코드 등은 기본난수를 해시화해서 다루면 되지만 암호찾기 등으로 변경된 암호를 사용자에게 알릴 필요가 있을때에는 상황에 따라 정돈된 무작위문자열이 필요한 경우가 있다.랜덤문자를 원하는 조합으로 원하는 길이만큼 생성할 수 있도록 만들어 보았다. function get_random_string($type = '', $len = 10) {     $lowercase = 'abcdefghijklmnopqrstuvwxyz';     $uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';     $numeric = '0123456789';     $special = '`~!@#$%^&*()-_=+\\|[{]};:\'",<.>/?';     $key = '';     $token = '';     if ($type == '') {         $key = $lowercase.$uppercase.$numeric;     } else {         if (strpos($type,'09') > -1) $key .= $numeric;         if (strpos($type,'az') > -1) $key .= $lowercase;         if (strpos($type,'AZ') > -1) $key .= $uppercase;         if (strpos($type,'$') > -1) $key .= $special;     }     for ($i =…
Read More

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

PHP
[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 //…
Read More

[PHP] class 자동 로딩(autoload)

PHP
[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 도 포함해서 사용을 했지만은 지금은 이렇게 사용을 하고…
Read More

[PHP] SSH2 함수들

PHP
SSH2 함수들 . ssh2_auth_agent - ssh agent를 사용하여 SSH를 인증합니다. 2. ssh2_auth_hostbased_file - 공용 hostkey를 사용하여 인증합니다. 3. ssh2_auth_none - "none"으로서 인증합니다. 4. ssh2_auth_password - 일반적은 비밀번호를 사용하여 SSH를 인증합니다. ssh2_auth_password(컨넥션, 아이디, 비밀번호) 5. ssh2_auth_pubkey_file - 공용 키를 사용하여 인증합니다. 6. ssh2_connet - SSH 서버에 접속합니다. ssh2_connect(서버주소, 포트); 7. ssh2_exec - 원격 서버에 명령어를 실행합니다. ssh2_exec(컨넥스, 절대경로/파일명령어); 8. ssh2_fetch_stream - 확장된 데이터 스트림을 가져옵니다. 9. ssh2_fingerprint - 원격 서버들로 부터 fingerprint를 복구 합니다. 10. ssh2_methods_negotiated - negotiated 메소드들의 리스트를 리턴 합니다. 11. ssh2_publickey_add - 인증된 publickey를 추가합니다. 12. ssh2_publickey_init - publickey 서브시스템을 초기화 합니다. 13. ssh2_publickey_remove - 인증된 publickey를 제거합니다. 14. ssh2_scp_recv - SCP를 통해 파일을 요청합니다. ssh2_scp_recv(컨넥션, 리모트 경로, 로컬 경로); 15. ssh2_scp_send - SCP를 통해 파일을 전송합니다. (컨넥션, '/경로/옴길파일명', '/복사될경로/복사될파일명', 퍼미션(0644)) 16. ssh2_sftp_chmod - 파일 모드를 변경합니다. (컨넥션,…
Read More

[PHP] 문자 타입 체크

PHP
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; }
Read More

[PHP] PHP MySQL PDO Class 파일

PHP
평소 작업을 하기 위해서 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…
Read More