[PHP] ereg() is deprecated (or eregi) 오류 발생시 해결 방법

문자열을 정규화 패턴으로 검색 하는 경우 많이 사용하는 ereg/eregi 함수입니다.

하지만 PHP 5.3 이후 버전에서는 deprecated 라는 에러 레벨이 추가되면서 ereg 함수 사용시 “ereg() is deprecated” 라는 오류를 발생시키게 됩니다. 엄밀하게 따진다면 이는 오류가 아닌 경고성 메세지이며 PHP 6에서는 사라지는 함수이니 주의하라는 의미입니다.

이미 PHP 5.x 버전으로 복잡하게 구현된 경우는 php.ini의 error_reporting에서 deprecated 레벨에 대해 예외처리로 메세지가 출력되지 않게 할 수 있겠지만 향후 유지관리/상위버전 호환성을 위해 ereg/eregi 함수를 사용하지 않는 것을 권장 합니다.

ereg 함수를 대신 해 사용가능한 함수는 preg_match 입니다. 함수 변경을 하면서 패턴 인자도 형태가 약간 달라지게 되는게 그 중 한 예를 보여드리겠습니다.

위 내용을 보시면 아시겠지만 첫번째 인자(정규식 패턴)에 슬래시(/)가 추가됩니다.

[Linux] CentOS 6.x 에서 Mcrypt 모듈 설치하는 방법

* 본 내용은 CentOS 6.4 기준으로 작성되었습니다. OS 종류에 따라 방법이 다를 수 있으니 참고 바랍니다.

 

php에서 암호화 작업을 할 때 필요한 Mcrypt 모듈을 설치하는 방법을 간단하게 정리합니다.

설치방법은 yum을 이용한 패키지 방식입니다.

 

1. 우선 EPEL 저장소를 설치합니다.

여기서 HTTP request sent, awaiting response… 200 OK 메세지가 출력되지 않고 wget: unable to resolve host address.. 메세지가 나온다면 다시 명령을 시도해주세요.

 

2. yum을 업데이트 한 후 Mcrypt 모듈을 설치합니다.

yum update 명령은 현재 설치된 모든 패키지와 커널을 업데이트 하는 것이기 때문에 업데이트 하기 전에 문제될 것이 없는지 체크 한 후에 실행해주세요.

 

3. 설치가 완료되었다면 httpd 데몬을 재시작 시켜줍니다.

[PHP] IE에서 한글명 파일 다운로드시 깨지는 현상 해결 방법

보통 다운로드 기능을 구현할 때 header에 파일 정보를 실어 보내도록 합니다. CI(Code Igniter) 프로젝트를 진행하면서 생긴 문제 였는데 IE 계열에서만 한글명 파일이 깨지는 현상이 있었습니다. 때문에 IE인 경우에만 header를 다르게 처리해줘야 하는 상황이 발생 했습니다.

간단하게 정리하자면 아래와 같습니다.

1. 파일 이름은 UTF-8이 아닌 EUC-KR로 변환 필요
2. Cache-Control: no-cache, must-revalidate 헤더 대신 Cache-Control: must-revalidate, post-check=0, pre-check=0 으로 사용
3. Pragma: no-cache 헤더 대신 Cache-Control: no-cache, must-revalidate 으로 사용

 

아래는 적용 코드 입니다.

 

[PHP] IE에서 Session 변수가 동작하지 않는 문제

얼마전 IE에서만 Session 변수가 동작하지 않는 문제가 있었습니다. 정확히는 Session 변수를 할당에는 성공했으나 다른 페이지에서 사용을 할 수 없는 문제가 있었습니다.

서버 변수가 클라이언트의 브라우저에 따라 동작여부가 다른 경우는 처음 봤습니다. 일반적으로 제 3사 쿠키라는 것을 의심해보게 되었는데 역시 해결책은 아니었습니다.

문제의 원인은 서브도메인..

서브도메인에 언더바( _ ) 가  포함되어 나타나는 현상이었습니다. 다시말해 abc_def.mysite.com 인 경우 IE에서 Session을 제대로 사용할 수 없는 문제가 발생했던 것이었죠. 다른 특수문자는 시험해보지 않았지만 가급적 사용하지 않는 것이 정신건강에 좋을 것 같습니다.

좋지 않은 예 : abc_def.mysite.com (X)
좋은 예 : abcdef.mysite.com (O)

[PHP] Notice: Undefined Variable 에러 처리 방법

PHP 5.x에서는 변수 선언에 대해 조금 더 엄격해 졌습니다. 굳이 변수 초기화를 하지 않고 바로 사용해도 상관이 없었던 때에 비해 지금은 변수 초기화 없이 사용을 하게 되면 Notice 에러가 발생하게 됩니다.

Notice는 시스템에 영향을 주는 문제는 아닌 단순 경고 메세지 입니다. Notice 에러 표시를 php.ini의 Error Reporting 설정을 변경해 보이지 않도록 처리하는 방법이 몇몇 곳에서 소개되고 있지만 이런 방법은 권장하고 싶지 않습니다. 모든 Notice 메세지가 비활성화 되기 때문에 중요한 이슈를 자칫 놓칠 수도 있기 때문입니다.

근본적으로 Undefined Variable 메세지를 해결하기 위해서는 시스템에서 권장하는 변수 초기화를 직접 해주시는 것이 귀찮더라도 가장 확실한 방법입니다. string 변수는 $str = ”; 으로 integer 변수는 $int = 0; 형식으로 초기화 해주시면 되겠습니다.

어려운 건 아니지만 귀찮은 부분인데다가 당장 문제가 되지 않아 쉬쉬할 수 있는 내용이지만 기본을 지키는 것이 최선이라고 생각합니다.

[PHP] 소수점 기본 연산 함수

소수점을 표현하는데 있어서는 크게 문제가 없지만 소수점이하 자리를 가진 두 개 이상의 정수를 연산하는 경우 부동소수점이라는 녀석때문에 오차가 생기기 마련입니다. 이름테면 5.1 – 4.0 을 하는 경우 1.1이 아닌 1.09가 나오는 것처럼 심심치않게 이런 경우가 보일겁니다.

예전에도 부동소수점을 자릿수만큼 버림처리해서 보여주는 함수를 만들어 올린적이 있었는데요.
이번에는 두 개의 정수를 +, -, *, / 기본 사칙 연산할 수 있도록 함수를 만들어봤습니다. 기본 원리는 같습니다. 소수점이 존재하는 정수를 자연수로 변환한 후에 연산이 끝나면 초기 소수점 자릿수 만큼 다시 소수로 바꿔주는 함수입니다.

아래 예제는 제가 필요로 하는 기능 위주로 제작된 것이라 불필요하거나 개선해야할 부분도 많을 겁니다. 이 로직은 소수점 둘째자리까지 표현되는 정수의 연산인데요. 달러, 유로의 센트 통화단위 관련해 소수점 둘째자리로 픽스 시킨겁니다.

소스를 보시면 아시겠지만 굉장히 단순합니다. 제가 복잡한걸 싫어하기 때문이기도 하고 코드는 최대한 단순하게 작성해야한다고 생각하기 때문에 ^^;

이 부동소수점의 연산문제는 PHP뿐만 아니라 다른 언어에서도 같은 이슈가 존재합니다. 컴퓨터는 모든 숫자를 2진법으로 변환해 계산하기 때문인데요. Javascript 버전도 올려드리겠습니다.

[PHP] 부동소숫점 연산을 위한 float 값 구하기

PHP 뿐만 아니라 다른 언어에서도 부동소숫점 처리는 골치가 아픕니다. 소숫점의 경우 내부에서 2진수로 연산되기 때문에 정확히 떨어지지 않는 값이 만들어집니다. 때문에 오차가 생기기도 하구요.

이번 프로젝트에서 통화 수정 작업을 거치면서 유로나 달러의 경우 센트 단위의 소수점 연산을 하게 되었는데 기본 내장 함수로는 정확한 연산이 이루어지지 않았습니다.

저같은 경우 정확한 연산을 위해 부동소수점의 소숫점을 없애고 정수로 계산을 한 뒤에 소수점을 지정해주는 방법을 사용합니다. 함수를 만들어 보았는데 심플하면서 쓸만합니다.

사용 방법은 toFixed(19.24, 2); 와 같이 사용하면 됩니다.

[PHP] 에러 출력되지 않는 환경에서 강제로 에러 표시하는 방법

PHP 설정에서 에러 표시가 Disable 되어 표시 되지 않을때 특정 페이지에서만 에러를 볼 수 있는 방법입니다.

간단하지만 사용 빈도가 많지 않아 막상 사용하려고하면 귀찮게 검색을 해야하는 상황이 생겨 따로 포스팅합니다.

 

[Codeigniter] is_file, file_exists 사용시 경로를 FALSE로 리턴하는 경우

PHP로 개발 하면서 파일의 유무를 알기 위해서 is_file이나 file_exists 를 많이 사용합니다.

코드이그나이터에서도 예외는 아니죠. 하지만 기존 PHP와 코드이그나이터에서 위 함수의 경로를 읽어들이는 방법이 다릅니다.

PHP에서는 웹사이트의 도큐먼트루트를 참초해 파일을 찾지만 코드이그나이터에서는 HOME 디렉토리에서 부터 파일을 찾게 됩니다. 그러므로 기존 PHP에서 사용하던 is_file(‘/aaa/bbb/ccc.js’); 와 같은 코드를 코드이그나이터에서 그대로 쓰면 FALSE값을 리턴하게 됩니다. 코드이그나이터에서는 경로를 시스템루트에서부터 읽어 들이기에 경로부분을 조금 달리해야합니다.

코드이그나이터에서는 시스템루트에서 도큐먼트루트까지의 경로를 상수를 이용해 쉽게 구해올 수 있습니다,

제공되는 상수 중에서 FCPATH 라는 녀석입니다.

위 파일 경로에서 수정을 한다면 is_file(FCPATH . ‘/aaa/bbb/ccc.js’); 로 상수를 추가해주시면 됩니다.