2015. 4. 1. 13:07

금일 작업중 Fatal error: Call to undefined function mime_content_type() in ~ 라는 오류가 발생하였습니다.

현재 작업 환경은 윈도우, XAMPP를 사용하고 있는데요.

파일 첨부와 관련한 작업을 하던중 파일의 정보를 확인하려던 차에 상기 오류가 발생한 것입니다

 

위 오류의 해결방법은 의외로 간단합니다.

php.ini파일의 extension=~ 이라는 부분을 수정/추가하면 됩니다.

그러나 동작하는 플랫폼에 따라 조금 다릅니다.

 

1. window

extension=php_fileinfo.dll 을 추가합니다.

참고로 제가 사용하고 있는 XAMPP에서는 저부분이 주석처리되어 있어서

주석을 해제만 하였습니다.

 

2. Linux등

extension=fileinfo.so 를 추가합니다.

 

php.ini을 수정하였기 때문에 물론 Apache를 재실행하여야 합니다.

 

 

그리고  mime_content_type는 deprecated 되었습니다. ㅡㅡ;

 

 

 

함수의 상세 설명페이지 의 일부분인데요 deprecated되었다고 나오며

Fileinfo function들을 이용하라고 합니다.

 

 

 

물론 fileinfo function들도 위에서 언급했던  php_fileinfo.dll 이나 fileinfo.so가 php.ini에 추가되어 있어야 합니다.

 

fileinfo 관련 함수를 사용한 예입니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

//파일을 저장
$file_name = $_FILES['strFile']['name'];	
if(!move_uploaded_file($_FILES['strFile']['tmp_name'], "./data/files/".$file_name)){
	echo"파일을 복사하는데 실패 했습니다.";
	exit;
}
		
$finfo = finfo_open(FILEINFO_MIME_TYPE);
	
if (!$finfo) {
   echo "fileinfo database failed";
   exit;
}

$filename = "./data/files/".$file_name;
echo finfo_file($finfo, $filename);

finfo_close($finfo);

 

Posted by 작은0악마
2015. 3. 30. 11:36

게시판이나 온라인 상담등에서 로그인을 하지 않은 사용자에게 글쓰기를 허용할 경우

시간이 흘러서 사이트가 알려지면 스팸성 글들이 많이 올라오게 되는 경우가 많습니다.

$HTTP_REFERER를 확인하여 처리하기도 했었는데요.

요즘은 $HTTP_REFERER를 확인하여도 스팸성 글들이 올라오기도 합니다.

 

그래서 스팸글 자동등록을 방지하는 오픈소스를 소개해 드립니다.

Securimage라는 오픈소스인데요 PHP를 사용하여 captcha images 와 audio를 만들어주는 소스입니다.

소스와 설명등은 해당 홈페이지 https://www.phpcaptcha.org/에서 확인하실 수 있습니다.

 

 

현재 3.5.2 버젼까지 배포되고 있습니다.

여기서 Demo를 보실 수도 있고 다운받으실 수도 있습니다.

 

다음은 다운로드 페이지 입니다.

 

 

다운로드 페이지를 보시면 기부금에 대한 얘기가 나옵니다.

기부금으로 3(미국)달러를 요구하였습니다.

그러나 꼭 기부를 해야 하는 것은 아니며 유용하였다면 기부를 해주면 쌩큐~ 라는것 같네요

 

해당소스를 다운받아 서버에 올렸습니다.

그리고 아래의 두가지 방법으로 각각 테스트하였습니다.

 

1. 코드를 직접 삽입하는 방법

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

CAPTCHA Image   Reload Image
Enter Code*:

 

2. 클래스를 이용하는 방법

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

// show captcha HTML using Securimage::getCaptchaHtml()
require_once './securimage/securimage.php';
$options = array();
$options['input_name'] = 'ct_captcha'; // change name of input element for form post

if (!empty($_SESSION['ctform']['captcha_error'])) {
 // error html to show in captcha output
 $options['error_html'] = $_SESSION['ctform']['captcha_error'];
}

echo Securimage::getCaptchaHtml($options);

위 두 경우 모두 파일이나 이미지등의 경로는 상황에 맞게 변경해 주셔야합니다.

 

아래는 위 코드중 2번째 방법을 써서 적용해본 이미지입니다.

 

 

실제 음성이 들리는 것까지 확인하였으며 익스11과 크롬에서 동작 테스트를 완료하였습니다.

 

* 추가 (클래스 이용시)

1. "Type the text: " 문자 변경 : 이미지를 불러오는 부분에서 옵션을 추가

   예 ) $options['input_text'] = '원하는 문구';

 

2. DB입력부분에서 값 확인

 

$captcha = $_POST['ct_captcha'];
			
require_once './securimage/securimage.php';
$securimage = new Securimage();

if ($securimage->check($captcha) == false) {
 echo"error";			
}else{
 echo "OK";
}
Posted by 작은0악마
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. 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. 24. 14:35

처음 PHP 프로그램을 시작할 당시에 내가 사용하던 툴은 UltraEdit 였다.

 

기능이 많고 여러가지로 좋았으나 유료이고 가격도 좀 비싸다...

 

 

그후 국산이면서 가벼운 Editplus를 변경을 했다.

 

역시 유료이긴 하지만 가격이 그리 비싼편이 아니다.

 

그리고 가끔 AcroEdit도 사용을 하고 있으나 익숙치가 않아서 보조 툴로 사용을 한다.

 

 

 

안드로이드를 개발하면서 Eclipse를 설치하여 사용하면서 Eclipse에 FTP 플러그인을 설치해서

 

PHP를 Eclipse에서 개발하기도 했었다.

 

 

 

최근에 들어서 특정 테스트가 필요해 구글링을 하다가 NetBeans 라는 툴을 알게됬다.

 

꽤 오래전에 나왔던것 같은데 모르고 있었다

 

일단 무료이고... 원래는 JAVA 개발용으로 만들어진것 같으나 NetBeans for PHP 도 있어서 PHP 개발도 지원이 된다.

 

현재 8.0.1이 배포중이며 JAVA용, C용, PHP용, 통합등 선택해서 다운받아 설치할수 있고

 

Development 버젼도 다운로드가 가능하다.

 

이 툴은 단점은 JAVA로 만들어져 JRE가 설치되어 있어야 하고 좀 무겁다.

 

그런데 프로젝트로 묶어서 작업을 하다가 보니 코드 인사이트 (Assistance) 기능이 너무 마음에 든다.

 

과거에 VC를 공부할때 Visual Assist 와 같은 플러그인 프로그램을 이용했을 때가 생각이 났다.

 

무엇보다 NetBeans에서 놀란것은 소스를 분석해서 사용자(개발자)가 만든 함수도 assist 해준다는것이다.

 

아직 Ultraedit나 Editplus와 같이 FTP로 직접 연결해서 작업은 해보지 않았으나

 

관련 자료를 확인해 보니 원격 프로젝트로 해서 연결하면 로컬로 다 다운받아서 처리하고

 

저장할때 FTP로 올려준다고 한다. 이부분이 좀 귀찮은것 같긴 한데....

 

그래도 assist 기능이 너무 맘에 들고

 

또 브라켓을 연곳이 화면 위로 올라가 안보여도 커서를 가져가면 open한 브라켓의 라인을 알아서

 

보여주는것도 매력적이다.

 

 

 

이참에....PHP는 NetBeans로 갈아탈까???

 

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악마