BACK-END/ PHP

php


[PHP] PHP 에서 move_uploaded_file 실패하는 경우


PHP 에서 move_uploaded_file 을 사용해서 서버에 파일업로드를 하려고 할 때, 기존에 이미 설정한 폴더가 아닌 새로운 폴더에 업로드 하고자하면 파일 업로드가 안되곤 합니다.

이 경우, 파일용량 제한때문이 아니라면 주로 리눅스 서버에서 해당 폴더의 권한이 제대로 설정되어 있지 않을 확률이 높습니다.


FTP 등이 아닌 웹 환경에서 파일업로드를 해야하는 경우, 사용자 본인이 아닌 아파치에게 쓰기 권한이 설정되어있어야 합니다.




서버에서 원하는 폴더에 권한을 757 (rwxr-xrwx) 로 설정해주거나,


Bash(CentOS)

[root@ upload_dir]# chmod 757 mingcho[디렉토리경로]


사용하는 툴에서 CHMOD 기능이 있는 경우 변경해주면 됩니다.



물론 변경 후에는 기타사용자에게 쓰기 권한이 주어지기 때문에, 무분별한 파일이 업로드 되지 않도록 확장자검사, 특수문자검사 등의 방어조치를 취해야합니다.


마지막으로 변경된 폴더로 업로드 해봅시다아.

사실은 move_uploaded_file 함수는 업로드개념보다는 함수명그대로 서버의 tmp 폴더 내부에 임시로 저장된 파일을 내가 원하는 경로로 이동시키는 함수입니다.


PHP

<?php define("UPLOAD_PATH", "/images/"); $tmp_name = $_FILES["name_attr"]["tmp_name"]; //임시저장된 파일을 $target = UPLOAD_PATH.time().$_FILES["name_attr"]["name"]; // /images/1210123112upload_file.jpg move_uploaded_file($tmp_name, $target); //저장 찰칵찰칵 ?>




php


[PHP] PHP 문자열 큰따옴표(") 와 작은따옴표(') 의 차이점



PHP 에서 문자열 작성시에는 아래와 같이 큰따옴표("") 나, 작은따옴표('')를 사용하여 표현합니다.


<?php $a = "double quote"; $b = 'single quote'; ?>


무분별하게 사용하기도 하지만 문자열사용시 큰따옴표("") 와 작은따옴표('')를 사용하는 것은 PHP 내부적으로 차이가 있습니다.





PHP는 문자열을 다룰 때 큰따옴표 안의 문자열의 경우 변수를 찾아내는 과정을 거칩니다.

반면, 작은 따옴표 안의 문자열의 경우 순수 문자열로 인식하여 그대로 보여주게 됩니다.


<?php $text = " 입니다"; echo "double quote $text"; //실행결과 : double quote 입니다. echo 'single quote $text'; //실행결과 : single quote $text ?>


위 예제의 경우 큰따옴표("") 안의 문자열에 사용한 변수는 변수의 값이 제대로 적용 된 데 반해, 작은따옴표('') 안의 변수는 그대로가 문자로 표현되었습니다.


큰따옴표("") 와 작은따옴표('') 의 차이는 변수의 처리 뿐만아니라 확장문자 의 처리에서도 존재합니다.

줄을 개행시켜주는 개행문자 \n 의 경우 큰따옴표안에서는 개행문자로 인식하지만, 작은 따옴표안해서는 일반 문자열로 인식됩니다.


<?php echo "double quote \n"; //실행결과 : double quote echo 'single quote \n'; //실행결과 : single quote \n ?>


위와 같이 작은따옴표 안에서는 대부분의 확장문자가 문자열로 인식되기때문에, 확장문자를 써야하는 경우 큰따옴표("")를 써야합니다.

단, 예외적으로 \' 나 \\ 의 경우 작은따옴표('') 안에서도 사용가능합니다.


<?php echo "사용가능 확장문자 \'"; //실행결과 : 사용가능 확장문자 \' echo '사용가능 확장문자 \''; //실행결과 : 사용가능 확장문자 ' ?>


위의 경우 큰따옴표("") 안에서는 \' 가 문자열로 처리된 반면, 작은따옴표('') 안에서는 확장문자로 처리되었습니다.

상황에 맞게 잘 사용하도록합시다!





PHP 의존성 관리도구 - Composer 사용법



Composer 영문 메뉴얼 바로가기

Composer 한글 메뉴얼 바로가기


컴포저는 node.js 의 npm ruby의 bundler 와 같이 PHP 환경에서 사용하는 의존성 관리 도구입니다.

컴포저의 역할은 아래와 같습니다


a) 여러 라이브러리에 의존하는 프로젝트를 가지고 있습니다.

b) 이러한 라이브러리들은 또다른 라이브러리들을 필요로 합니다.

c) 이때 여러분이 필요로 하는 의존 관계의 라이브러리들을 지정해 줄 수 있습니다.

d) 컴포저는 패키지가 설치되어야 하는 버전을 찾아, 알맞은 버전의 패키지들과 의존 패키지들을 설치합니다. (프로젝트 디렉토리로 다운로드 한다는 의미입니다.)





시스템 요구사항


컴포저는 PHP 5.3.2+ 이상에서 동작합니다. 몇가지 민감한 PHP 설정을 필요로 하지만 인스톨러를 사용하면 이러한 비호환성을 체크하고 경고를 확인할 수 있습니다.




Composer 설치(*nix 환경)


Windows 환경의 경우 상단 링크의 메뉴얼을 참고해주세요.


1. 지역 설치(Locally)

특징: 프로젝트 안에 Composer를 포함하는 방식

장점: Composer가 프로젝트 안에 직접 설치 되기 때문에, 프로젝트를 다른 곳에 배포 할 경우 배포받은 곳에서 특별히 컴포저를 설치 하지 않고도 응용프로그램 안에 포함된 Composer를 이용하여 패키지 관리가 가능하다.



2. 전역 설치(Globally)

특징: 자신의 운영체제 전체에 Composer를 포함하는 방식

장점: 같은 OS 안에 여러개의 프로젝트를 운영하고 있을 경우, 전역 설치를 하면 각각의 프로젝트에 설치하지 않고도 Composer를 사용가능!



저는 전역설치를 하기로 했습니다. 방식은 거의 비슷하므로 매뉴얼을 참고해주세요.!

메뉴얼에는 아래와 같이 cURL 을 이용한 설치 방법이 나와있습니다.


Bash(Linux)

[root@ lib]# curl -sS https://getcomposer.org/installer | grep


나의 경우 위의 방식으로 설치하자 아래와 같이 에러가 나며 설치실패! (설치환경 : CentOS7)


Bash(Linux)

[root@ lib]# curl: (48) An unknown option was passed in to libcurl


왜 인지는 모르겠지만 다른 방식을 사용하기로 했다.


Bash(Linux)

//PHP 인터랙티브 모드 진입 [root@ lib]# php -a //원격지 설치 파일 카피 php > copy('https://getcomposer.org/installer', 'composer-setup.php'); //인터랙티브 모드 종료 (Ctrl+c) 후 파일 확인 //PHP로 파일실행 [root@ lib]# php composer-setup.php All settings correct for using Composer Downloading... //설치완료 Composer (version 1.6.3) successfully installed to: /usr/local/lib/composer.phar Use it: php composer.phar //글로벌로 실행을 위해 파일 이동 [root@ lib]# mv composer.phar /usr/locl/bin/composer





Composer 사용법


저는 라이브러리 들 중 카카오 알림톡을 사용하기 위한 unirest 모듈을 다운받아 보기로 했습니다. Unirest PHP



1. Composer.json 파일 생성


Composer의 메인 저장소 (Composer의 npm)

먼저 Composer를 처음 사용하는 경우, 라이브러리를 설치 하고자 하는 프로젝트 하위에 composer.json 파일을 생성합니다. 이미 사용 중에 라이브러리를 추가 하는 경우에는 만들어져있는 파일을 사용하면 됩니다.


만든 파일에 아래와 같이 작성합니다. ( //로 표기한 주석은 지워주세요 )

Bash(Linux)

{ "require-dev": { //mashape vendor의 unirest-php 패키지의 3.대 버전중 가장 최신버전을 사용 "mashape/unirest-php": "3.*" } }


저는 unirest 의 홈페이지에 나와있는 composer 사용방법에 있는 대로 require-dev 로 작성했습니다.



2. 설치


require 와 require-dev 는 약간의 차이가 있는데, require-dev 에는 디버깅, 테스트 등 개발시 필요한 해키지 정의를 위해서 필요한 라이브러리 들을 정의한 후 , 실제 서비스 환경에는 설치를 하지 않을 수 있습니다. 반대로 require 에는 서비스 환경에 꼭 필요한 라이브러리 들을 정의합니다.


Bash(Linux)

//require, require-dev에 열거된 모든 패키지 설치 [root@ www]# composer install //require, require-dev에 열거된 모든 패키지 업데이트 [root@ www]# composer update //require에 열거된 패키지만 설치 [root@ www]# composer install --no-dev //require 열거된 패키지 업데이트 [root@ www]# composer updatel --no-dev



위의 설치 방법은 Composer를 글로벌 설치 했을 경우의 설치 방법입니다. 로컬 설치를 했을 경우에는 아래 방식을 사용합니다


Bash(Linux)

//require, require-dev에 열거된 모든 패키지 설치 [root@ www]# php composer.phar install



3. composer.lock ( composer update 와 composer install )


composer의 install 과 update 명령은 의미상 차이가 존재합니다.

위와 같이 composer 를 install 하면 composer.lock 파일이 생성됩니다.

이 파일은 내가 install 한 시점에 설치 된 라이브러리 들의 버전 정보들을 담고 있습니다.

그래서 다른사람이 해당 파일들을 이용해 composer 를 install을 한 경우, 이전에 설치 되어있던 라이브러리들은 업데이트 된 최신 버전이 아닌 composer.lock 파일에 명시되어 있는 버전이 설치 되게 됩니다.

그래서 이 파일을 이용해 composer가 install될 때마다 라이브러리가 최신 버전으로 업데이트 되는 상황을 막을 수 있습니다.

만약, 라이브러리를 최신버전으로 갱신하고 싶을 경우 update 명령을 사용하면 됩니다.

새로운 패키지가 추가됐을 경우에도 update 명령을 사용합니다.

프로젝트 참여자 의존성 일치시키기



4. composer 적용


위와 같이 composer 설치를 마치면, 프로젝트 하위에 vendor 라는 디렉토리가 생성됩니다.

이 디렉토리 안에는 내가 설치 한 라이브러리 들이 존재합니다.

적용은 라이브러리 들의 디렉토리 경로와 상관없이 내가 적용하고자 하는 파일에 아래와 같이 작성해 주면 됩니다.


PHP

<?php require("vendor/autoload.php"); ?>



php

PHPExcel 로 엑셀파일 읽기



웹페이지를 개발하다 보면, 엑셀형식의 파일을 읽어 DB에 저장해야 하는 경우나 DB에 저장된 데이터를

엑셀파일로 다운받아야 하는 경우가 생긴다.

이럴 경우, 데이터를 읽어들이는 라이브러리로 PHP-ExcelReaderPHPExcel 등이 있다.


각자의 장단점이 있는데, 

PHP-ExcelReader 의 경우 PHPExcel 보다 가볍다는 장점이 있지만, xlsx 형식의 파일은 지원하지 않는다. (xls 파일이 아닌 경우, 다른 방식을 사용해야한다.)

또한, PHPExcel의 경우 PHP 5.2.0 이상의 버전에서만 가능하다. 


나는 PHPExcel을 사용하기로 했다.



PHPExcel 을 사용하기 위해서는 다음 조건이 요구된다.

1.  PHP 버전이 5.2.0 이상 버전이여야 한다.

2.  php-zip , php-xml , php-gd2 가 enabled 되어야한다.


나같은 경우는 php-zip 이 설치되있지 않아서, Uncaught Error: Class 'ZipArchive' not found 에러가 났다.

위의 경우 아래 링크를 참고.!

바로가기 





준비가 다되었으면

먼저, GitHub의 PHPExcel에 접속하여 PHPExcel 라이브러리를 다운받는다.   PHPExcel 다운로드



다운로드 한 파일을 압축을 풀면 Classes , Documentation, Examples 등의 폴더가 있는데, 

이 중 Classes 폴더를 사용하고자 하는 프로젝트에서 원하는 경로 안에 복사해주면 준비가 완료된다.


다운로드받은 PHPExcel 하위에 문서들을 보면 다양한 사용방법이 나와있지만, 

편의를 위해서 쉽게 작성해 놓은 예제소스를 참고했다!

http://spac.tistory.com/176 


잘돌아간다면 위 예제소스의 /*데이터 처리*/ 부분에 원하는 데이터 처리를 하면 된다!



php



[PHP] 엑셀 다운로드한글 깨짐 현상



아래와 같이 php header 함수를 사용해서 엑셀파일을 다운로드 할 경우 

한글이 깨지는 경우가 있습니다.


    header( "Content-type: application/vnd.ms-excel" );   

    header( "Content-type: application/vnd.ms-excel; charset=utf-8");  

    header( "Content-Disposition: attachment; filename = TEST.xls" );   

    header( "Content-Description: PHP4 Generated Data" );   


이 때 아래와 같이 한줄을 추가해 줍니다.!


     print("<meta http-equiv=\"Content-Type\" content=\"application/vnd.ms-excel; charset=utf-8\">"); 



[PHP] array_map 함수

2016.09.01 16:19
php

function array_map

PHP array_map 함수의 사용법을 알아보자.



array array_map(callback callback, array arr1[, array ...])


배열의 각 원소에 사용자가 정의한 함수를 적용하고 적용한 후의 결과를 배열로 반환한다.


ex)


$food_type = array("food", "beverage", "cuistine", "fruit");

$food_name = array("pizza", "cola", "pasta", "apple");


function showFoods ($a, $b){

return $b." is ".$a;

}


//배열의 각 원소에 대하여 순서대로 showFoods() 함수를 실행한다.

$foods    =    array_map("showFoods", $food_type, $food_name);

  print_r($foods);


/*

  Array

  (

  [0]    =>    pizza is food

  [1]    =>    cola is beverage

  [2]    =>    pasta is cuisine

  [3]    =>    apple is fruit

  )

*/



$food_typearray("food""beverage""cuisine""fruit");

$food_name = array("pizza""cola""pasta""apple");


function makeFoods ($a, $b){

return array( $a => $b ) );

}


//배열의 각 원소에 대하여 순서대로 makeFoods() 함수를 실행한다.

$foods    =    array_map("makeFoods", $food_type, $food_name);

  print_r($foods);


/*

  Array

  (

  [0]    =>    

  Array (

[food]    =>    pizza

  )

  [1]    =>    

  Array (

      [beverage]    =>    cola

  )

  [2]    =>    

  Array (

[cuisine]    =>    pasta

  )

  [3]    =>    

  Array (

[fruit]    =>    apple

  )

*/





* 출처 : http://88240.tistory.com/202#recentTrackback 

+ Recent posts

티스토리 툴바