laravel form 이용시 arguments

2015. 4. 1. 16:53 from Dev/laravel

Laravel에서 form을 이용할 때에는 다음과 같이 array에 주절주절 다 담아서 이용을 합니다:

{{ Form::open(array(
            'method' => 'post',
            'url' => action('PostingsController@store'),
            'class' => 'form',
            'role' => 'form')
            ) }}

method는 당연히 post냐, put이냐를 지정해주면 됩니다.

url은 helper 명령어인 action()이나 route(), URL::to 등을 이용해서 submit 받을 스크립트를 지정해줍니다. submit 도 같은 스크립트가 받을 거면 생략하셔도 됩니다.

class, role 등 추가적인 내용이 있으면 넣어주면 됩니다. 위는 bootstrap3에서 form에 class, role을 'form'으로 지정해야 해서 위와 같이 썼습니다.

Posted by banasun :

[php] mime type 알아내는 방법 - PHP version < 5.3 일 경우 꼼수

2015. 3. 16. 17:31 from Dev/php

파일을 업로드 전송받는 경우 파일 MIME type을 결정해주어야 하는 경우가 종종 생깁니다.

오늘은 이미지를 데이터베이스에 blob으로 넣는 작업을 하면서 클라이언트 요청으로 MIME TYPE도 같이 저장해주도록 하였습니다.

시작하면서는 Fileinfo function이 있으니 별거 아니겠네.. 하였는데 역시나 제가 하는 일은 쉽게 끝나는 법이 없군요. OTL

일단 서버 PHP 버전이 5.2라 Fileinfo 가 이용 불가능한 상태였고, mime_content_type 함수는 depreciated 입니다.

요새 제 프로젝트의 프레임워크로 이용하는 laravel에는 mime type을 guessing하는 부분이 있긴 한데..

오늘은 할 수 없이 업로드되는 파일 확장명을 기반으로 mime type을 리턴해주는 함수를 구글링해서 이용하였습니다:

http://www.brightcherry.co.uk/scribbles/php-alternative-to-the-depreciated-mime_content_type-function-and-fileinfo-functions/

물론 이 방식은 이용자가 전송하는 파일의 확장명을 의심없이(?) 받아들여서 처리하기 때문에 보안상 문제의 여지는 있습니다.

이런 문제를 해결해주는 것이 맞는 것이긴 한데.. 성격상 서버 PHP 버전만 업그레이드 해주면 되는 문제를 굳이 시간을 들여가면서 하고 싶진 않기도 하고.. 어차피 DB에 있으니 보안상 문제는 그나마 조금 덜하니 차라리 DB에서 꺼내주는 과정만 신경을 써주면 되겠구나 하면서 마무리하였습니다.

Posted by banasun :

[php] array_unique의 결과값을 json_encode 로 변환시 복불복에 대해서

2015. 2. 14. 05:24 from Dev/php

php라는 언어 자체가 상당히 헐렁(loose. 비하는 아님)한 언어이기 때문에 편하기도 하지만, 가끔 가다가는 결과값이 어떻게 올지 불확실할 수 있다는 점 또한 받아들여야 하는데.. 삽질 열심히 하다 원인을 알게 되면 너무 허무합니다.

오늘의 삽질은.. 처음에 손대면서는 30분이면 되겠지 하고 시작한 처음은 미미하였던 일이.. 시간이 지나면서 해결도 안되고 점점 창대해지는 사태를 거치는 상황이었습니다.

요는. array_unique를 써서 array 내의 중복값을 없앤 다음에 json_encode로 다른 app에 넘겨주면 끝나는 일이었습니다.

뭐 간단하네. 요거만 하고 자야지 했는데 이게 왠걸;; 어디서 났는지 모를 에러들이..

원인을 찾아보니 array_unique로 정리를 할 때, 그냥 예쁘게 이렇게 되는 걸 바랬는데 :

['Series A', 'Series B']


가끔 가다 그렇게 안되고 이렇게 되고 마는 것입니다.

[{"0":"'Series A","1":"Series B"}]


뒤져보다 보니, array_unique로 중복값을 정리하면서 어떤 경우에는 숫자로 인덱싱된 array가 남지 않는 경우가 생긴다는 거였습니다. 즉 json_encode해주면 위의 경우처럼 숫자 인덱싱이 남아버리는 거지요. ㅡ.ㅡ

원인을 알고나니 방법은 의외로 간단히..

json_encode 해주기 전에 array_values로 numerically indexed array를 강제로 만들어주는 것으로 해결되었습니다.

array_values(array_unique($data))


php를 다시 한번 돌아보게 해주는 하루였습니다. ㅋㅋ

Posted by banasun :

[php] openweathermap.org의 API를 이용한 현재 기상정보 보여주기

2015. 1. 29. 15:43 from Dev/php

예전에 openweathermap.org에서 제공하는 기상 정보를 이용하는 방법에 대해서 간단하게 올렸었습니다. (링크)

무료로 이용할 수 있는 날씨 정보 API가 별로 없는데, 이곳 서비스는 안정적으로 잘 이용하고 있습니다.

오늘은 간단하게 객체화 시킨 소스를 보여드리겠습니다. 언제나 그렇듯이 잘못된 부분이나 더 개선할 부분이 있으면 알려주세요. ^^



class Weather {

	const API_URL_CURRENT = "http://api.openweathermap.org/data/2.5/weather?lat=37.56826&lon=126.977829&units=metric&APPID=<발급받은 아이디>";
	const API_URL_FORECAST = "http://api.openweathermap.org/data/2.5/forecast/daily?lat=37.56826&lon=126.977829&cnt=5&units=metric&APPID=<역시 발급받은 아이디>";

	public static function get_current_weather() {
		$c = curl_init(self::API_URL_CURRENT);
		$options = array(
			CURLOPT_HEADER => false,
			CURLOPT_RETURNTRANSFER => true
		);
		curl_setopt_array($c, $options);
		$data = curl_exec($c);
		curl_close($c);
		
		if (isset($data) && $data) {
			$data_obj = json_decode($data);
			$result = array(
				'current_temp' => $data_obj->main->temp,
				'temp_min' => $data_obj->main->temp_min,
				'temp_max' => $data_obj->main->temp_max,
				'desc' => $data_obj->weather[0]->main,
				'icon' => "http://openweathermap.org/img/w/{$data_obj->weather[0]->icon}.png",
				'status' => 'ok'
			);
			return $result;
		}
	}
	
	public static function get_weather_forecast() {
		$c = curl_init(self::API_URL_FORECAST);
		$options = array(
			CURLOPT_HEADER => false,
			CURLOPT_RETURNTRANSFER => true
		);
		curl_setopt_array($c, $options);
		$data = curl_exec($c);
		curl_close($c);
		
		return json_decode($data);
	}
}

$w = Weather::get_current_weather();
echo "現在 " . number_format($w['current_temp'], 1) . "℃";


php 파일을 만드신 다음에 원하는 곳에 include만 해주면 간단한 날씨 아이콘과 현재 기온이 그림처럼 출력됩니다.

위 예제는 서울을 기준으로 했으니 다른 도시라면 lat, lon을 바꾸어주셔야 합니다.


이미지 아이콘도 $w['icon']으로 이용하실 수 있습니다만, 이쁜 아이콘이 아니라 pass. ㅋㅋ



여기에 가시면 오픈소스 날씨 관련 아이콘이 있습니다

erikflowers/weather-icons



기상 예측에 대해서도 일단 정보를 가져오는 부분은 코딩을 해 놓았습니다. json 객체이니 보시고 입맛에 맞게 이용하시면 됩니다.

Posted by banasun :

[ubuntu] 개인 디렉토리(public_html)에서 php 사용하도록 세팅하기

2015. 1. 4. 17:13 from Dev/Linux

지난번 포스팅에서는 개인 유저 디렉토리를 apache2에서 이용할 수 있도록 하는 방법을 정리하였습니다. 이제는 php도 이용가능하도록 세팅을 해야겠습니다. ubuntu에서는 기본적으로 개인 폴더에서 php를 이용할 수 없도록 되어 있습니다.

관련된 설정 모듈은 /etc/apache2/mods-available에서 찾아볼 수 있습니다. php5.conf 설정을 보시면, 다음과 같은 부분이 있습니다 :



# Running PHP scripts in user directories is disabled by default
# 
# To re-enable PHP in user directories comment the following lines
# (from  to .) Do NOT set it to On as it
# prevents .htaccess files from disabling it.

    
        php_admin_flag engine Off
    



이 부분을 주석처리(라인 앞에 # 삽입) 해주신 다음에 service apache2 restart 해주시면 개인 폴더에서도 php가 실행되는 것을 알 수 있습니다.

Posted by banasun :

[wamp server] 윈도우즈 환경에서 apache, mysql, php 개발환경 한번에 셋업해주는 wamp server

2014. 11. 24. 15:56 from Dev/etc


오늘은 wamp 서버 설치를 해보도록 하겠습니다.

wamp는 윈도우즈 환경에서 Apache + mysql + php를 셋으로 구성해서 간단하게 개발환경을 구축해주고, 서비스 할 수 있도록 도와주는 kit입니다. 물론 이 세 가지는 설치도 그다지 어렵지 않아서 따로따로 설치해도 잘되지만, 저처럼 윈도우즈 별로 안좋아하는 사람도 쉽게 설치 및 관리를 할 수 있도록 해줍니다.

1. 설치파일 다운받기

먼저 wamp server 페이지(http://www.wampserver.com/en/)로 가서 설치파일을 다운받습니다.


OS가 32비트인지 64비트인지 확인해서 받으셔야 됩니다. 클릭하면 sourceforge에서 설치파일을 다운로드 받습니다.


2. setup 파일 실행

셋업과정은 단순합니다. 설치 경로와 기본 브라우져, 그리고 SMTP에 이용할 메일 주소만 확인해주면 알아서 잘 설치가 되는군요.




3. 설치 완료

어떻게 생각해보면 허무하게 세팅이 끝나버렸습니다. ㅋㅋ

브라우져에서 http://localhost 해서 아래 화면이 나오면 정상적으로 설치가 완료된 것입니다. 제 컴에서는 트레이에 아이콘은 server offline으로 표시되어서 문제가 있나 했는데, php나 mysql 모두 정상적으로 잘 작동을 하는 걸 보면 제 컴의 문제이거나 트레이의 정보와는 상관이 없거나 한 것 같습니다.


4. 설정하기

아파치 설정은 bin/apache 밑의 conf 디렉토리에 있습니다. 입맛대로 설정하시면 되고요..



mysql은 그래도 root 패스워드 설정은 해놔야 쓰겠지요? 위 3의 화면에서 phpmyadmin으로 가서 사용해도 되겠지만, console에서 이용하려면 PATH에 다음을 추가합니다 :

C:\wamp\bin\mysql\mysql5.6.17\bin

그 다음에는 root 패스워드 설정을 해줍니다.


자.. 이제 끝났습니다. 사실 워드프레스 한번도 안써보았는데 아는 분이 부탁을 하셔서 한번 깔아보고 하느라 익숙하지 않은 윈도우즈에 설치를 해 보았네요. 가능하면 다음에는 wordpress 설치를 주제로 다시 포스팅 해보도록 하겠습니다.

혹시 wamp 설치하면서 안되거나, 궁금하신 점이 있으시면 답글 달아주세요.


Update (11/26/2014)

저는 mysql을 console에서 많이 이용하는 것도 있고 해서 위와 같이 root 패스워드 설정하고 이것저것 하는데.. 이렇게 하면 phpmyadmin 접속이 안됩니다.

확인해보니 wamp server와 같이 배포되는 phpmyadmin은 local 설정이 되어 있어서 local에서만 접속이 됩니다. phpmyadmin 이용이 더 익숙하신 분은 (어차피 wamp 자체가 서비스용이라기 보다는 간단하게 개발환경을 만들어 주는 용도이니) 굳이 설정 변경을 안하고 그냥 이용하시는게 더 낫지 않을까 싶네요. ^^

Posted by banasun :

[php] openweathermap.org의 API와 cUrl을 이용하여 기상정보 가져오기

2014. 11. 6. 15:47 from Dev/php

간단하게 기상정보를 표시해주어야 할 일이 있어서 검색을 해보았는데, yahoo나 기상청의 공개 api 등이 나오더군요.

기상청은 공개 API이긴 하지만 승인요청하고 며칠 기다려야 하고, 상업적 용도의 사이트에 이용이 가능한지도 애매하고, 주의사항에 있는 '서버 과부하시 이용이 제한될 수 있습니다'라는 문구를 보고는 솔직히 좀 불안하더군요. 군함도 486 컴퓨터로 돌리는 나란데.. 아무도 책임 안지는 공개 api의 서버는 어떠할지...

그래서 조금 더 찾아 보니 http://openweathermap.org/api 라는 공개 서비스가 있네요. 일단 key 발급 같은 것도 간단하고(email 등록하면 됨), 일정 용량 이상 넘어가지 않는다면 이용하는 데 문제는 없어 보입니다.


php의 cUrl을 이용해서 자료를 가져와 보겠습니다:

 
$w = curl_init('http://api.openweathermap.org/data/2.5/weather?q=Seoul');
$weather_options = array(
	CURLOPT_HEADER => false,
	CURLOPT_RETURNTRANSFER => true
	);
curl_setopt_array($w, $weather_options);
$a = curl_exec($w);
curl_close($w);

if (isset($a) && $a) {
	$weather = json_decode($a);
	
	$current_temp = $weather->main->temp - 273.15;
	$temp_min = $weather->main->temp_min - 273.15;
	$temp_max = $weather->main->temp_max - 273.15;
	$weather_main = $weather->weather[0]->main;
	$weather_icon = "http://openweathermap.org/img/w/{$weather->weather[0]->icon}.png";

	echo "
";
	echo "현재 기온 : " . $current_temp;
	echo "최저 기온 : " . $temp_min;
	echo "최고 기온 : " . $temp_max;
	echo "날씨 : " . $weather_main;
	echo "
"; } else { exit(0); }

json 타입과 xml 타입으로 받을 수 있고, 넘겨온 값을 처리할 때에는 하위 값이 object도 있고, array도 있으니 이용할 때 참고하시고요, 그리고 한참 헤맸던게, 온도가 화씨가 아니라 절대온도(K)입니다. 섭씨 온도로 변경하려면 273.15를 빼주어야 합니다.

그리고 해당 날씨의 아이콘도 같이 제공해줍니다. 18번째 라인이 아이콘을 가져오는 부분인데, 아이콘도 예뻤으면 좋았을텐데 하는 생각이 드는 군요. ^^

원래는 APPKEY를 같이 넘겨줘야 한다고 되어 있는데, 테스트 할 때에는 없이도 잘 수행이 됩니다. 그래도 정책이 APPKEY를 받도록 되어 있고, 발급도 간단하니 안정적으로 이용할 때에는 넣어주시면 될 것 같습니다.

위 코드는 테스트용이라.. 이용하시는 목적에 맞게 객체를 만드시든, 함수를 만드시든 해서 사용하세요. ^^

Posted by banasun :

application/json 포맷으로 angularJS - php script 사이에 데이터 주고받기

2014. 9. 21. 02:22 from Dev/php

데이터를 post 방식으로 php server로 보낼 때, 각 요소들을 파싱해서 application/x-www-form-urlencoded 방식으로 보낼 수도 있고, 아니면 application/json 방식으로 보낼 수 있습니다.

angularJS에서는 아래와 같이 보냅니다 :


        $http({
            method: "post",
            url: apiUrl,
            data: JSON.stringify(data),
            headers: {'Content-Type': 'application/json'}
        }).success( function(rtnData){
           //
        });


그리고 서버의 php script에서는 간단하게 다음과 같이 받습니다:


$foo = file_get_contents("php://input");

var_dump(json_decode($foo, true));


Posted by banasun :

[tip] 빈 객체 만들기 stdClass()

2014. 9. 15. 16:58 from Dev/php

가끔 가다 깡통(?) 객체를 만들어야 할 필요가 생길 수 있습니다. 

그럴 때에는 다음과 같이 생성해 줍니다:


$myObj = new stdClass();


이 방식이 제일 깔끔한 방식이라고 보시면 됩니다. ^^

Posted by banasun :

[php] a href tag에서 url만 추출하고 <a> tag 제거

2014. 8. 11. 14:57 from Dev/php

며칠전에 포스팅한 글대로(정규식 Regular expression 이용한 url 추출) url을 처리하다 보니 기존의 컨텐츠에 <a href="..." ...> </a> 형식으로 들어간 링크와 충돌이 되기에 이번에는 <a> tag에서 url 부분만 추출하고 <a> tag를 날려 버리는 정규식이 필요하네요.

$content = preg_replace('#\S*#i', "\\1 ", $content);

이렇게 해주면 됩니다. ^^

Posted by banasun :