2015. 1. 6. 15:29

코딩을 하다보면 Unix timestamp를 사용할때가 있다.

이럴때 현재의 timestamp를 가져오려면 time()함수를 사용하였고

특정일시를 지정하고 그 특정일시의 timestamp를 가져오기 위해서는 mktime()함수를 사용하였다.

 

그리고 현재의 timestamp를 가져오기 위해 mktime()함수에 인수를 주지 않고 사용하기도 했었다.

 

그러나 작업을 하다보니

strict Standards: mktime(): You should be using the time() function instead in ~~ 이라는 문구가 나온다!!

 

어라?? 뭐지??

 

바로 http://php.net/manual/en/function.mktime.php 로 GO!GO!

 

Note:

As of PHP 5.1, when called with no arguments, mktime() throws an E_STRICT notice: use the time() function instead.

 

즉, "PHP 5.1부터는 인수 없이 사용하면 안된다. time()함수를 써라" 는 이야기...

 

결국 함수를 본연의 목적에 맞게 사용하라는 것이니 좋은것이긴 한데...

 

점점 귀찮게 한다는 느낌이 없지는 않다. ㅎㅎㅎ

 

**

실무 개발을 하고 계신분이 Unix timestamp를 모르실리는 없겠지만

구지 부연 설명을 하자면 1970년 1월 1일 9시 00분 00초를 기준으로

지금까지 시간의 초단위 값이다. 

 

본래는 January 1 1970 00:00:00 GMT이지만 우리나라가 GMT+9이므로

위에서 9시부터로 설명하였다.

 

 

Posted by 작은0악마
2014. 12. 30. 09:21

웹 프로그램을 하다보면 쿠키나 세션을 자주 사용하게 됩니다.

저는 쿠키보다는 세션을 주로 사용하는 편인데요

세션을 등록하는 함수인 session_register()가 deprecate 되었습니다.

 

기존에는 세션을 등록할때 다음과 같이 사용했었습니다.

 

$var = "session value";
session_register("var");

 

그러나 PHP 5.3.0 부터는 위 함수가 deprecate되었으며 PHP 5.4.0 부터는 remove 되었습니다.

관련문서 보기

 

따라서 앞으로 세션을 사용하실때는 다음과 같은 방법을 사용하시면 됩니다.

 

session_start();
$_SESSION['var'] = "session value"; //세션 등록

echo "session value : " . $_SESSION['var']; //세션값 사용

 

저는 두번째 방법을 주로 사용하였기 때문에 session_register()가 deprecated 된것을

최근에야 알았네요.

Posted by 작은0악마
2014. 12. 22. 13:53

지난번에 PHP 5.5.x 버전부터 mysql 관련 함수에 대해 포스팅을 했었다.
이번엔 배열에 관해서 그전엔 안보이던 "use of undefined constant xxx - assumed xxx in 파일경로~" 와 같은 경고가 발생!!

소스가 좀 오래된 소스여서 역시 PHP 버젼의 문제일 것으로 생각되어 확인을 해 보니

 

지금까지 배열을 사용할때는 보통

$arrTmp[mb_id] = 'aaa';

등과 같이 '' 문자를 생략하고 사용해왔었으며 문제가 없었는데

 


언제부턴가 인수부분을 ' '문자로 묶지 않으면 상수로 인식. 경고를 표시한다.


즉 위의 코드는

$arrTmp['mb_id']  = 'aaa';

로 수정을 해줘야 한다.

 

 

 

몇몇 글을 찾아보니 PHP 5.3.x 버전부터라는 글도 보이고...

물론 상수와의 구분을 위해 명확히 하는것은 당연한 것일 수도 있도 있다.
그리고 앞으로 작업을 할때는 이를 고려하여 작업을 진행하면 된다.

 

 

하지만!!!

기존 소스를 수정할 일이 있거나 서버이전등을 할때는???

하나하나 다 찾아서 수정해야 하나...ㅜㅜ

php.ini에 옵션으로 처리할 수 없을까???

error_reporting();

 

을 사용해서 처리하는것은 좀 아닌것 같고...

 

* 추가

php.ini에서 "display_errors = off" 를 해주면 된다고 한다.

확인은 안해봄.ㅡㅡ;

Posted by 작은0악마
2014. 11. 14. 13:25

최신 XAMPP를 설치하고 로컬에서 작업중

 

mysql을 쓸일이 있어서 코드를 작성하니 Warning 발생!!!

 

확인을 해보니 PHP 5.5.x버젼부터

 

mysql_connect, mysql_query 등의 함수들이 deprecate 되었습니다

 

http://php.net/manual/en/migration55.deprecated.php

 

관련 문서를 확인해 보니

 

mysqli나 PDO를 사용하라고 하네요...

 

PHP를 업그레이드 하면 소스 수정 작업이 많아 질것 같네요...ㅜㅜ

Posted by 작은0악마
2014. 11. 13. 12:02

이번 작업은 조금전 올린 특정 경로의 폴더 리스트 가져오기

 

지난번에 올린 파일의 확장자 분리를 혼합한 것과 같다.

 

단지  몇가지 정보만 더 뽑아냈을뿐....

 

그리고 이번 소스도 역시 json 방식으로 반환한다.

 

function getFiles($path){
  $arrData = array();
  $results = scandir($path);
  
  foreach ($results as $result) {  
   if ($result === '.' or $result === '..') continue;  
   if (!is_dir($path . '/' . $result)) { //디렉토리가 아니면
    $data = array();
    
    $path_parts = pathinfo($path . '/' . $result);
    
    $data["dirname"] = iconv("euc-kr","utf-8",$path_parts['dirname']); //파일경로 단, 파일이름은 포함하지 않음, 한글깨짐 방지
    $data["basename"] = iconv("euc-kr","utf-8",$path_parts['basename']); //파일이름
    $data["extension"] = iconv("euc-kr","utf-8",$path_parts['extension']); //확장자.
    $data["mtime"] =  date("Y-m-d H:i:s.", filemtime($path . '/' . $result)); //파일 수정일
    $data["ctime"] =  date("Y-m-d H:i:s.", filectime($path . '/' . $result)); //파일 생성일
    $data["filesize"] =  filesize($path . '/' . $result); //파일 크기, byte단위
    $data["filename"] = iconv("euc-kr","utf-8",$path_parts['filename']); // since PHP 5.2.0
    
    $arrData[] = $data;
   }
  }
  return $arrData;
 }

 

참고로 pathinfo 함수에서 filename은 PHP 5.2.0이상부터 지원한다.

Posted by 작은0악마
2014. 11. 13. 11:23

어떤 폴더내의 폴더 목록을 가져올 필요가 생겼다.

 

그 폴더 목록을 가져와서 Tree형대로 표시할려고 한다.

 

그래서 다음과 같은 함수를 만들어 처리했다.

 

function getDir($path){
  
  $arrData = array();
  $results = scandir($path);
  
  foreach ($results as $result) {  
   if ($result === '.' or $result === '..') continue;  
   if (is_dir($path . '/' . $result)) { //디렉토리라면
    $data = array();
    $data["text"] = iconv("euc-kr","utf-8",$result); //한글일경우 json 에러때문에
    $data["id"] = iconv("euc-kr","utf-8", $path . '/' . $result);
    $data["cls"] = "folder";
    $sub_folders = getDir($path . '/' . $result); //폴더이므로 그 안에 폴더 목록을 가져오기 위해..
    if(count($sub_folders)){
     $data["leaf"] = false;
     $data["root"] = $sub_folders;
    }else{
     $data["leaf"] = true;
    }
    $arrData[] = $data;
   }
  }
  return $arrData;
 }


 

참고로 위 소스는 가져온 값을 json의 형태로 보낸다.

 

또한 해당 폴더의 서브폴더 목록을 가져오기 위해 재귀 호출을 하였다.

Posted by 작은0악마
2014. 10. 24. 16:37

특정파일을 서버로 못올리게 한다던가 이미지만 올리게 하는등의 기능을 구현하기 위해서는

 

파일의 확장자를 분리할 필요가 있다.

 

얼마전까지는 substr() 함수를 사용하여 처리하였다.

 

그러나 좀더 쉽게 구하는 방법이 있었으니...

 

php의 pathinfo()함수를 이용하는것이다.

 

사용예 :

 

<?php
$path_parts 
pathinfo('/www/htdocs/inc/lib.inc.php'
);

echo 
$path_parts['dirname'], "\n"
;
echo 
$path_parts['basename'], "\n"
;
echo 
$path_parts['extension'], "\n"
;
echo 
$path_parts['filename'], "\n"
// since PHP 5.2.0
?>

 

참고 : http://php.net/manual/en/function.pathinfo.php

Posted by 작은0악마
2014. 9. 17. 10:15

최근 프로젝트는 PDO를 사용할 수 밖에 없었다

 

그런데 PDO를 쓰다보니 두가지의 답답한 문제에 봉착했다.

 

1. PDO는 mysql_num_rows 와 같은 레코드셋의 row의 수를 가져올 수 있는 기능이 없다.

2. PDO는 mysql_data_seek 과 같은 레코드셋의 포인터를 이동할 수 있는 기능이 없다.

 

이를 해결하기 위해 구글링은 해본 결과 레코드셋을 배열에 저장하고 그 배열을 사용하는 방법이 제일 좋은것 같다.

 

간단한 코드는

 

$stmt 를 PDOStatement 라고 할때

 

$result_array = $stmt->fetchAll();

 

//레코드셋에 row가 있는지 확인

if(count($result_array)){

 

foreach($result_array as $row){

 

//여기서 필요한 처리를 진행...

 

}

 

}

 

위와 같이 하면 $result_array 배열의 인덱스를 가지고 위치도 옮겨 다닐수 있고 순차 처리도 가능해지며 재사용이 가능하다.

 

참고로 fetchAll 메소드를 사용하면 $stmt>fetch(PDO::FETCH_BOTH )와 같은 방식으로 배열로 반환해주기 때문에

 

컬럼의 index나 name으로 다 사용이 가능하다.

 

물론 fetchAll()에 fetch style을 지정할 수 도 있지만....

 

Posted by 작은0악마
2014. 6. 9. 17:50

그동안 많은 고객사가 템플릿을 사서 커스텀을 요청하여 작업을 진행하였다.

 

그런데 언제부턴가 고객사가 구매한 소스에 템플릿언더바(Template Underscore)가

 

적용(?)되있는것이 아닌가....

 

찾아보니 이미 10년전에 나왔었고 계속 버전업이 되고 있는 모양인데...

 

나름 소스를 보고 어찌어찌 해서 고객사가 원하는데로 커스텀을 해오다 보니

 

뭔가 좀더 알고 싶은 생각이 들어 찾아보았다.

 

http://www.xtac.net/

 

위 주소에서 다운로드를 받을 수도 있고

 

설명도 잘 되어 있다...

 

일단 라이센스도 LGPL이어서 다운은 받았놓았다.

 

당장 신규 프로젝트에 적용을 시키는 것은 시간상 무리일것 같고...

 

LGPL 라이센스인 만큼 소스를 공개하면 안되는 프로젝트에는 적용하지 말아야 하고...

 

몇몇가지 고려할 것이 있어서 시간을 두고 천천히 살펴봐야지....

 

Posted by 작은0악마