안녕하세요 워누입니다😀

오늘은 지난번 정규표현식 2번째 포스팅에서 언급했던 filter_var() 함수에 대하여 포스팅해보고자 합니다!

 

(이메일 유효성 검사를 하는 방법으로 정규표현식과 함께 소개하였으며 자세한 내용은 아래 링크로!!)

https://seoneu.tistory.com/43

 

[PHP] 전화번호, 이메일 유효성 검사 :: 정규표현식 활용 (2)

안녕하세요 워누입니다😀 지난 포스팅에 이어 오늘은 전화번호와 이메일 데이터에 대하여 정규표현식을 이용해 유효성을 검사해보는 방법을 포스팅해보겠습니다! 1. 전화번호 전화번호의 유

seoneu.tistory.com

 

PHP에서 제공하는 filter_var() 함수는 특정한 값을 검사하는 함수로,

두 번째 매개변수의 값에 따라 검사할 유형을 다르게 설정할 수 있습니다.

아래와 같은 형식으로 사용할 수 있습니다 

filter_var('검사할 값', 검사할 유형, (옵션));

 

 

'검사할 값'은 말 그대로 검사를 받을 대상(값)을 의미하며, 

'검사할 유형' 은 어떤 형식으로 검사할 건지를 결정할 수 있습니다!

검사할 유형에 따라 옵션을 사용할 수 있으며 자세한 내용은 아래 표를 참고해주세요🙂

 

파라미터(Parameter) 검사 유형 설명(Discription)
FILTER_VALIDATE_BOOLEAN
FILTER_VALIDATE_BOOL
Bool '1', 'true', 'on', 'yes'라는 데이터를 검사하면 'TRUE'를 응답합니다.
이외의 다른 값은 'FALSE'를 응답합니다.

*PHP 8 버전에서 추가된 파라미터입니다.
FILTER_VALIDATE_DOMAIN 도메인 입력된 값이 도메인 형식인지 검사합니다.
(예시 : http://test.domain.com)
도메인 형식이 맞다면 'TRUE'를 응답하고, 아니라면 'FALSE'를 응답합니다. 

*PHP 7 버전에서 추가된 파라미터입니다.
FILTER_VALIDATE_EMAIL 이메일 입력된 값이 이메일 형식인지 검사합니다. (예시 : id@testmail.com)
이메일 형식이 맞다면 'TRUE'를 응답하고, 아니라면 'FALSE'를 응답합니다.

<옵션 파라미터 및 설명>
FILTER_FLAG_EMAIL_UNICODE : 이메일 주소 중 로컬(예시 중 'testmail'에 해당하는 부분)에 유니코드 문자를 포함하여 검사하는 옵션입니다.
FILTER_VALIDATE_FLOAT 실수 입력된 값이 실수 형식인지 검사합니다. (예시: 3.4, 12.01 ...)
이메일 형식이 맞다면 'TRUE'를 응답하고, 아니라면 'FALSE'를 응답합니다.

<옵션 파라미터 및 설명>
FILTER_FLAG_ALLOW_THOUSAND : 1000 단위 숫자를 콤마( , ) 기호로 구분합니다.
FILTER_VALIDATE_INT 정수 입력된 값이 10진수 정수 형식인지 검사합니다. (예시 : 1, 52, -4 ...)
이메일 형식이 맞다면 'TRUE'를 응답하고, 아니라면 'FALSE'를 응답합니다.

<옵션 파라미터 및 설명>
FILTER_FLAG_ALLOW_OCTAL : 입력된 값을 8진수로 검증하는 옵션입니다. 입력된 값이 0으로 시작하는 8진수의 데이터라면 TRUE를 응답하고, 아니라면 'FALSE'를 응답합니다.

FILTER_FLAG_ALLOW_HEX : 입력된 값을 16진수로 검증하는 옵션입니다. 입력된 값이 0x 혹은 0X으로 시작하는 16진수의 데이터라면 TRUE를 응답하고, 아니라면 'FALSE'를 응답합니다.
FILTER_VALIDATE_IP 아이피 입력된 값이 IP(default : IPv4) 형식인지 검사합니다.
(예시 : 192.168.0.101)
이메일 형식이 맞다면 'TRUE'를 응답하고, 아니라면 'FALSE'를 응답합니다.

<옵션 파라미터 및 설명>
FILTER_FLAG_IPV4 : IP를 IPv4 형식으로 검사하는 옵션입니다.
FILTER_FLAG_IPV6 : IP를 IPv6 형식으로 검사하는 옵션입니다.
FILTER_VALIDATE_MAC 맥(MAC) 주소 입력된 값이 맥(MAC) 주소 형식인지 검사합니다.
(예시 : 00-FF-2D-72-E8-F0)
맥 주소 형식이 맞다면 'TRUE'를 응답하고, 아니라면 'FALSE'를 응답합니다.
FILTER_VALIDATE_REGEXP 정규식(Perl 호환) 입력된 값이 정규식 형식인지 검사합니다.
정규식 형식이 맞다면 'TRUE'를 응답하고, 아니라면 'FALSE'를 응답합니다.
FILTER_VALIDATE_URL URL 입력된 값이 URL 형식인지 검사합니다.
(예시 : http://test.domain.com)
URL 형식이 맞다면 'TRUE'를 응답하고, 아니라면 'FALSE'를 응답합니다.

<옵션 파라미터 및 설명>
FILTER_FLAG_SCHEME_REQUIRED : 입력 URL의 RFC를 준수하였는지 검사하는 옵션입니다. (예시 : http://example)

FILTER_FLAG_HOST_REQUIRED : 입력 URL의 호스트 이름이 포함되어 있는지 검사하는 옵션입니다. (예시 : http://test.domain.com)

FILTER_FLAG_PATH_REQUIRED : 입력 URL의 도메인 이름 뒤에 경로가 있는지 검사하는 옵션입니다.
(예시 : http://test.domain.com/example/).

FILTER_FLAG_QUERY_REQUIRED : 입력 URL의 쿼리 문자열이 있는지 검사하는 옵션입니다.(예: http://test.domain.com/example/test.php?query=value).

제가 알아보기 쉽게 작성한 내용이다 보니

위 표의 내용에 대하여 더 자세히 알고 싶으시다면 PHP에서 제공하는 매뉴얼을 참고해주시면 됩니다.

https://www.php.net/manual/en/filter.filters.validate.php

 

PHP: Validate filters - Manual

Contrary to what documentation implies, the FILTER_NULL_ON_FAILURE seem to affect any validation filter, not just FILTER_VALIDATE_BOOLEAN. I've been using that since PHP 5.2, and as of PHP 5.6.8 it still works. I have no clue if it's a blug or if it is as

www.php.net

 

 

그럼 이제 예시 코드를 보실까요?

간단하게 IP 검증하는 방법과 URL 검증하는 것 두 개 정도만 한번 보도록 하겠습니다!

(이번에는 요청-응답 페이지 없이 PHP 파일만 보여드리겠습니다🙂)

 

IP는 다음과 같이 검증합니다!

<?php

// 검증할 IP
$checkIP = "192.168.0.101" ;

// 검증
if (filter_var($checkIP, FILTER_VALIDATE_IP)) {
  echo $checkIP."은 정상적인 IP입니다.";
} else {
  echo "올바르지 않은 IP를 입력하셨습니다.";
}

?>

 

위 소스코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다. 

 

IP가 정상적으로 검증된 것을 볼 수 있습니다ㅎㅎ

검증하는 값이 IP 형식과 맞지 않다면 "올바르지 않은 IP를 입력하셨습니다."라고 나오겠죠?

 

다음으로 URL을 검증해봅시다!

<?php

// 검증할 URL
$checkUrl = "http://test.domain.com";

// 검증
if (filter_var($checkUrl, FILTER_VALIDATE_URL)) {
  echo $checkUrl."은 정상적인 url입니다.";
} else {
  echo "올바르지 않은 url을 입력하셨습니다.";
}

?>

 

위 소스코드를 실행하면 아래와 같은 결과를 얻을 수 있습니다. 

마지막으로 URL 검증할 때 사용할 수 있는 옵션을 적용해보겠습니다!

표에 소개된 URL 추가 검증 옵션 중 "FILTER_FLAG_QUERY_REQUIRED"를 사용하여 검증해봅시다!!

<?php

// 검증할 URL+Qurey
$checkUrl = "http://test.domain.com/example/test.php?query=value" ;

// 검증
if (filter_var($checkUrl, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED )) {
  echo $checkUrl."은 정상적인 url입니다.";
} else {
  echo "올바르지 않은 url을 입력하셨습니다.";
}
?>

위 소스코드를 실행하면 아래와 같은 결과를 얻을 수 있습니다. 

 

세번째 매개변수에 옵션을 넣어서 검증된 것을 볼 수 있습니다!

 

위 내용을 활용하여 PHP로 개발된 웹 페이지에서 특정 IP를 전달받는 경우, 회원가입 페이지를 구성하여 이메일을 검증하거나 숫자로 된 데이터(나이, 생년월일, 휴대폰 번호 등)를 검증하는 경우 등 나름 쓸만한 구석이 있을 것 같네요 ㅎㅎ

 

이 글을 읽어주시는 분들께서도 도움이 되었기를 바라며, 오늘 포스팅은 여기서 마무리하겠습니다😁

안녕하세요 워누입니다😀

지난 포스팅에 이어 오늘은 전화번호와 이메일 데이터에 대하여 정규표현식을 이용해

유효성을 검사해보는 방법을 포스팅해보겠습니다!

 

1. 전화번호

 

전화번호의 유효성을 검사하려면 먼저 전화번호가 어떤 식으로 구성되어야 하는지 알아야겠죠?

우선 여기서는 우리가 가지고 다니는 휴대전화를 기준으로 설명드리겠습니다. 

 

전화번호 형식은 "010-0000-0000" 이런 식으로 구성되어 있다는 건 모두 아실거에요!

휴대전화는 앞자리가 대부분 010으로 시작을 합니다만, 

예전 폰을 사용하시는 분들은 간혹 011, 016 등도 사용하시더라구요...🤔

 

그래서 앞 세자리는 예전에도 사용했던 번호를 포함해 010, 011, 016, 017, 018, 019까지는 허용하도록 하고,

뒤에 특수기호인 하이픈( - )이 온 다음 중간 자리는 숫자 3자리 또는 4자리이며

다시 뒤에 특수기호 하이픈이 오고 마지막 자리는 숫자 4자리 고정이라는 형식으로 규칙을 정해봅시다. 

 

이렇게 규칙을 정했다면 다음은 패턴을 작성해보아야 겠죠?

 

우선 맨 앞 세자리는 010, 011, 016, 017, 018, 019만 허용하는 패턴은 아래와 같습니다.

(맨 처음에 오는 문자를 의미하는 기호( ^ )를 반드시 붙여줍니다!)

 

^(010|011|016|017|018|019)

 

** OR 연산에 대한 기호로 | 를 사용합니다.

그 다음, 하이픈은 아래와 같이 붙여주시면 됩니다.

 

^(010|011|016|017|018|019)-

 

중간 자리는 숫자가 3자리 혹은 4자리이므로 아래와 같이 패턴을 만들면 되며,

뒤에 하이픈이 한번 더 오므로 같이 붙여줍시다.

 

[0-9]{3,4}-

 

중괄호 {3,4}의 의미는 3, 4 byte를 검사하겠다는 의미입니다. 

 

마지막 자리는 숫자 4자리만 오면 되기에 아래와 같이 패턴을 만들면 됩니다. 

(맨 마지막에 오는 문자를 의미하는 기호( $ )를 반드시 붙여줍니다!)

 

[0-9]{4}$

 

위에서 언급한 규칙을 모두 합쳐서 아래와 같이 패턴을 완성하면 됩니다!

 


:: 전화번호 패턴 ::

 

^(010|011|016|017|018|019)-[0-9]{3,4}-[0-9]{4}$


해당 패턴을 활용하여 아래와 같이 테스트가 가능합니다. 

 

<request.html>

<html>
<head>
 <title> PHP 정규표현식 TEST </title>
</head>
<body>
 <form method="post" action="response.php">
  <table> 
	<tr>
        <th>전화번호 (000-0000-0000 형식에 맞추어 기입하세요.)</th>
        <td><input type="text" name="PhoneNo" value=""></td>
    </tr>
  </table>
  <input type="submit" value="Submit" />
 </form>
</body>
</html>

<response.php>

<?php 

//전달받은 데이터를 변수로 저장 
$phoneNo = $_POST['PhoneNo'];

//전화번호 데이터에 대한 패턴 작성
$phonePattern = '/^(010|011|016|017|018|019)-[0-9]{3,4}-[0-9]{4}$/';


//패턴 체크(유효성 검사)
if(preg_match($phonePattern, $phoneNo, $match)){
	echo "전화번호 : ".$phoneNo."<br>";
	var_dump($match);
	echo "<br>";
} else {
	echo "올바른 전화번호가 아닙니다. 다시 입력해 주세요. <br>";
}


?>

 

<테스트>

request.html : 데이터 입력
response.php : 결과

2. 이메일

 

이번엔 이메일의 유효성 검사를 정규표현식을 이용하여 검사해보도록 합시다!

이메일은 보편적으로 "ID@domain" 형식으로 구성되어 있는데요, 

ID를 영문 소문자, 숫자만 허용하는지 혹은 특수기호를 사용할 수 있는지 등 생성 규칙이 개발자 마음대로인지라,

정규표현식도 일단은 정하기 나름인 것 같습니다. 

우선 여기서는 ID의 허용 범위를 영문(소문자, 대문자 모두 포함), 숫자, 하이픈, 언더바( _ )까지만

포함하는 것으로 정하고 패턴 규칙을 만들면 아래와 같습니다. 

 

^[a-zA-Z0-9]{1}[a-zA-Z0-9\-_]

 

대괄호 [] 안에서 하이픈은 범위를 정하는 기호이다 보니 문자 그대로를 사용하려면 백슬래시( \ )를 사용해야 합니다.

.

아이디 다음에는 @가 고정값이므로 아이디 패턴 뒤에 붙여주면 됩니다. 

@ 다음에는 gmail.com이나 naver.com처럼 도메인 형식이 와야 하죠?

 

위에서 언급한 gmail이나 네이버(naver)처럼 간단하면 좋겠지만

가끔씩 하이픈이 있는 도메인을 보신 적이 있으실 거에요..!

도메인은 영문 소문자와 숫자 그리고 하이픈이 포함될 수 있지만

하이픈은 첫글자와 마지막에는 위치할 수가 없다는 특징이 있습니다. 

 

이러한 규칙들을 준수하여 점( . )을 포함한 도메인의 앞부분은 아래와 같이 패턴을 작성할 수 있습니다. 

 

[a-z0-9]{1}[a-z0-9\-]+[a-z0-9]{1}\.

 

도메인의 뒷부분은 com, net, io, co.kr 등 여러 가지가 있습니다. 

이것 역시 처음과 끝에 점이 위치하지 않아야 하고 이외에는 영문 소문자로만 구성되어야 하는 규칙을 준수하여

아래와 같이 패턴을 작성할 수 있습니다.

 

(([a-z]{1}[a-z.]+[a-z]{1})|([a-z]+))$

 

위에서 작성한 규칙들을 모두 하나로 합쳐보도록 하죠!


:: 이메일 패턴 ::

 

^[a-zA-Z0-9]{1}[a-zA-Z0-9\-_]@[a-z0-9]{1}[a-z0-9\-]+[a-z0-9]{1}\.(([a-z]{1}[a-z.]+[a-z]{1})|([a-z]+))$


....

상당히 길긴 하군요..

샘플 소스도 함께 보도록 하죠🤨

 

<request.html>

<html>
<head>
 <title> PHP 정규표현식 TEST </title>
</head>
<body>
 <form method="post" action="response.php">
  <table> 
	<tr>
        <th>이메일</th>
        <td><input type="text" name="Email" value=""></td>
    </tr>
  </table>
  <input type="submit" value="Submit" />
 </form>
</body>
</html>

<response.php>

<?php 

//전달받은 데이터를 변수로 저장 
$email = $_POST['Email'];

//이메일 데이터에 대한 패턴 작성
$emailPattern = '/^[a-zA-Z0-9]{1}[a-zA-Z0-9\-_]+@[a-z0-9]{1}[a-z0-9\-]+[a-z0-9]{1}\.(([a-z]{1}[a-z.]+[a-z]{1}[a-z]+)|([a-z]+))$/';


//패턴 체크(유효성 검사)
if(preg_match($emailPattern, $email, $match)){
	echo "이메일 : ".$email."<br>";
	var_dump($match);
	echo "<br>";
} else {
	echo "올바른 이메일이 아닙니다. 다시 입력해 주세요. <br>";
}

?>

<테스트>

request.html : 데이터 입력
response.php 데이터 결과

 

위와 같이 전화번호와 이메일을 정규표현식을 이용해서 검증하는 방법을 알아보았는데요, 

사실.. PHP에서는 사실 이메일을 굳이 정규표현식으로 검증하지 않아도 됩니다. 

filter_var()이라는 함수를 이용해서도 이메일을 아래와 같이 검증을 할 수 있거든요!

 

<response.php>

<?php 

//전달받은 데이터를 변수로 저장 
$email = $_POST['Email'];

//이메일 유효성 검사
if(filter_var($email, FILTER_VALIDATE_EMAIL)){
	echo "이메일 : ".$email."<br>";
} else {
	echo "올바른 이메일이 아닙니다. 다시 입력해 주세요. <br>";
}

?>

위 소소코드로 다시 적어서 테스트하셔도 똑같이 이메일을 검증할 수 있습니다. 

filter_var() 함수에 대하여는 기회가 되면 따로 포스팅 해보도록 하겠습니다!

 

정규표현식은 PHP 외 다른 언어에서도 자주 쓰이니 알고 계시면 좋습니다만.. 

저는 아직까지는 전 회사에서 써먹어본 경험은 없네요🙄🙄🙄

 

정규표현식에 대하여 문법이나 예시, 개념 등을 자세히 알고 싶은 분들 혹은 실무에서 사용하셔야 되는 분들은

이전 포스팅에서도 언급했지만 위키 백과에서도 자세히 나와있으니 참고하시면 도움이 될 거에요!

 

https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D

 

읽어주신 분들께서 도움이 되었기를 바라며,

오늘 포스팅은 여기서 마치도록 하겠습니다 ㅎㅎ

 

 

안녕하세요 워누입니다😀

오늘은 PHP에서 정규표현식을 사용하여 값의 패턴(유효성)을 체크하는 방법을 포스팅하고자 합니다.

 

정규표현식(혹은 정규식)이란 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어를 말합니다. 

즉, 값이 한글로만 구성되어 있는지, 영어로만 구성되어 있는지 혹은 어떤 특별한 패턴을 가지고 있는지 등에 대해 체크하기 위해 사용할 수 있으며, 이를 이용해 이름이 한글로만 이루어졌는지, 전화번호가 올바르게 입력되었는지 등을 검사할 수 있습니다.

 

정규표현식에 대한 자세한 내용은 위키에 개념, 역사, 문법, 예시 등에 대하여 상세히 기재되어 있으니

필요하신 분들은 아래 사이트를 통해 확인하시면 될 것 같습니다:)

 

https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D

 

정규 표현식 - 위키백과, 우리 모두의 백과사전

노란색 강조 부분은 다음 정규식을 사용했을 때 매치된 것이다. 정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp[1] 또는 regex, rational expression)[2][3] 또는 정규식(正規式)은 특정한 규칙

ko.wikipedia.org

 

해당 포스팅에서는 PHP에서 정규표현식을 다루는 방법을 중점적으로 다뤄보도록 할게요!

PHP에서는 정규표현식의 패턴을 사용하기 위해서 preg_match()라는 함수를 아래와 같은 형식으로 사용합니다.


preg_match(패턴, 검사할 텍스트, 패턴 일치 결과를 응답받을 변수)


첫 번째 매개변수는 정규표현식을 이용해 만든 패턴을 의미하며 '/패턴/'의 형식으로 작성합니다.

두 번째 매개변수는 정규표현식을 이용해 검사할 텍스트를 의미합니다.

세 번째 매개변수는 검사한 텍스트가 패턴에 일치하는지 결과를 응답받을 변수를 의미합니다. 

 

이제, 첫 번째 매개변수에 들어갈 패턴을 작성하는 방법을 알아보겠습니다.

알기 쉽게 어떤 텍스트에 대하여 영문이나 한글, 숫자로만 구성되어 있는지에 대해 확인하는 패턴을

예시로 만들어보면서 이해해보면 좋을 것 같아요.

 

영문으로만 구성되어 있다면 첫 글자와 마지막(끝) 글자가 모두 영문이어야 하고,

한글로만 구성되어 있다면 첫 글자와 마지막 글자가 모두 한글이어야 겠죠?

 

먼저 공통적으로 알아야 할 것은 첫 번째 글자를 적용하는 기호와 마지막 글자를 적용하는 기호를 알아야 합니다!

첫 번째 글자를 적용하는 기호는 ( ^ )이며, 마지막 글자를 적용하는 기호는 ( $ )입니다. 

 

다음은 영문, 한글, 숫자 각각에 대한 패턴을 적용하는 방법을 알아야 합니다!

영문은 대문자와 소문자로 나뉘어 지며 대문자는 'A'로 시작해 'Z'로 끝나고, 소문자는 'a'로 시작해 'z'로 끝납니다. 

이를 간격으로 지정하면 대문자는 'A-Z', 소문자는 'a-z'으로 지정할 수 있는데요,

지정한 간격을 대괄호로 감싸주면 됩니다. 즉, '[A-Z]', '[a-z]'와 같은 형식이 됩니다!

(대소문자 혼용은 '[a-zA-Z]' 형식으로 지정한 간격을 합쳐서 사용하면 됩니다.)

 

위에서 언급한 방식으로 다른 문자들도 똑같이 간격을 지정하면 되는데요,

한글은 '가'로 시작해 '힣'로 끝나도록 설정되어 있으므로 '[가-힣]',

숫자는 0부터 9까지 이므로 '[0-9]'와 같은 형태가 되겠네요!

 

이제 마지막으로 위에서 언급한 내용들을 하나로 묶으면 기본적인 패턴이 완성됩니다!

아래 표에 한번에 정리했습니다:)

 

검사할 텍스트(변수) 패턴
영문 대문자 /^[A-Z]$/
영문 소문자 /^[a-z]$/
영문 대문자+소문자 /^[a-zA-Z]$/
한글 /^[가-힣]$/
숫자 /^[0-9]$/

 

위 내용을 활용해서 만든 샘플 소스도 함께 보시죠!

 

<request.html>

<html>
<head>
 <title> PHP 정규표현식 TEST </title>
</head>
<body>
 <form method="post" action="response.php">
  <table> 
    <tr>
        <th>한글이름</th>
        <td><input type="text" name="KorName" value=""></td>
    </tr>
    <tr>
        <th>영문이름</th>
        <td><input type="text" name="EngName" value=""></td>
    </tr>
	<tr>
        <th>주민번호(특수기호 제외, 숫자만)</th>
        <td><input type="text" name="UniqueNum" value=""></td>
    </tr>
  </table>
  <input type="submit" value="Submit" />
 </form>
</body>
</html>

 

<response.php>

<?php 

//전달받은 데이터를 변수로 저장 
$korName = $_POST['KorName'];
$engName = $_POST['EngName'];
$uniqueNum = $_POST['UniqueNum'];

//각 데이터에 대한 패턴 작성
$korPattern = '/^[가-힣]+$/';
$engPattern = '/^[a-zA-Z]+$/';
$numPattern = '/^[0-9]+$/';

//패턴 체크(유효성 검사)
if(preg_match($korPattern, $korName, $match)){
	echo "한글이름 : ".$korName."<br>";
	var_dump($match);
	echo "<br>";
} else {
	echo "올바른 한글 이름이 아닙니다. 다시 입력해 주세요. <br>";
}

if(preg_match($engPattern, $engName, $match)){
	echo "영문이름 : ".$engName."<br>";
	var_dump($match);
	echo "<br>";
} else {
	echo "올바른 영문 이름이 아닙니다. 다시 입력해 주세요. <br>";
}

if(preg_match($numPattern, $uniqueNum, $match)){
	echo "주민번호 : ".$uniqueNum."<br>";
	var_dump($match);
	echo "<br>";
} else {
	echo "올바른 고유번호가 아닙니다. 다시 입력해 주세요. <br>";
}

?>

** 예제 중 패턴이 입력된 대괄호[] 옆 더하기( + ) 기호의 의미는 1byte 이상 검사하겠다는 기호입니다.

 

<결과 :: 브라우저 화면>

화면 출력(request.html)
데이터 입력
데이터 전달 결과(response.html)

 

이번 예제에서는 한글은 한글만, 영문은 영문만, 숫자는 숫자만 입력하도록 코딩을 한 것입니다.

그래서 조건에 맞게 잘 입력했다면 위 화면과 같이 if문을 정상적으로 실행하여 데이터를 보여주고,

띄어쓰기나 다른 문자, 특수기호 등이 들어갔다면

else문을 실행하여 올바른 데이터가 아니다라는 것을 알려주고 있습니다!

 

정규표현식은 위 예시보다 조금 더 폭넓게 활용할 수 있는데요, 

이는 다음 PHP 포스팅에서 작성해보도록 하겠습니다:)

 

긴 글 읽어주셔서 감사하며 오늘 포스팅은 여기서 마무리하겠습니다😁

안녕하세요 워누입니다.

 

학교 과제와 기말고사, 그리고 회사를 퇴사하는 등 이슈가 많아서 한동안 블로그를 방치해버렸습니다..😂😂

이제 종강도 했고, 퇴사도 했으니 블로그를 다시 꾸준하게 작성해볼까 합니다!

그럼 바로 본론으로 진행해볼게요~

.

오늘은 PHP에서 API를 활용하여 다른 서버(URL)로 파일을 전송하는 방법을 포스팅하겠습니다!

 

이전 포스팅 중 PHP로 이미지를 업로드하는 방법이 있었죠?

 

https://seoneu.tistory.com/29

 

[PHP] 이미지 파일 업로드하기!

안녕하세요 워누입니다! 오늘은 PHP로 이미지 파일을 업로드하는 방법을 포스팅하도록 하겠습니다! 거두절미하고 바로 가보도록 하죠~ . 여러분들도, 저도 인터넷에서 사진이나 문서 파일을 웹

seoneu.tistory.com

 

해당 페이지에서 언급했었던 것처럼 다른 서버로 파일을 전송할 때  "multipart/form-data" 설정을 반드시 해주어야 한다고 했었는데요, 이 설정이 무엇을 의미하는지 간략하게라도 알아야 제가 쓴 코드를 보고 이해하거나 직접 작성하실 때 이해를 하기 쉽겠죠?

 

위 페이지에서 포스팅한 내용 중 클라이언트 측의 샘플 코드를 잠깐 보겠습니다!

<!DOCTYPE html>
<html>
<head>
</head>
<title>파일 업로드 테스트</title>
<body>
<form name="reqform" method="post" action="fileUploadResult.php" enctype="multipart/form-data"> 
 <p>이미지 파일 업로드 테스트</p>
 <hr> <br>
 <input type="file" name="imgFile" /><br>
 <input type="submit" value="업로드" />
</form>
</body>
</html>

 

해당 소스에서 form 데이터 내 input type을 "file"로 설정했었던 적이 있었죠?"file" 속성은 말 그대로 파일 업로드를 위해 설정하는 속성인데요, 이를 form 데이터에 담아 서버 측으로 전송하는 원리입니다. 이 때, form 태그의 enctype을 "multipart/form-data"로 지정했었습니다. 

 

"multipart/form-data"로 보내는 이유를 알려면 먼저 HTTP 통신 원리와 Content-type을 알아야 합니다.

 

간략하게 설명을 드리자면 통신 원리는 매우 간단해요!

스펙에 맞게 클라이언트와 서버가 문자로 구성된 데이터를 송수신하는 것이라고 생각해주시면 됩니다. 파일을 전송한다고 해서 jpg 파일이나 txt 파일 자체가 전송되는게 아니라 파일 역시도 문자의 형태로 전송되는 것이고, 이러한 문자의 형태를 스펙에 맞추어 서버에 송신하는 것 뿐이거든요.  이미지, 텍스트, 동영상 파일 모두 문자열로 이루어져 있는데 확인하고 싶으신 분들은 아무 이미지 파일이나 동영상 파일 등을 메모장 등 텍스트 편집기로 열어보세요!

 

Content-Type은 Body에 전송되는 메세지(데이터)의 타입을 정의하는 속성으로 HTTP 요청 Header에서 정의합니다. 이 중에서 파일을 송신할 때 사용하는 속성값이 바로 "multipart/form-data" 형식인 것이지요. 

 

관련해서 참고하기 좋은 블로그가 있어서 공유해봅니다! 

https://velog.io/@shin6403/HTTP-multipartform-data-%EB%9E%80

 

상세 내용은 위에서 보시고 핵심인 PHP 코드를 같이 볼까요?

<?php
header("Content-Type:text/html; charset=utf-8;"); 

// 요청 데이터(API 요구 사항에 맞게 파라미터 설정)
$value_1 = "value";				// key_1에 대한 value 
$value_2 = "value";				// key_2에 대한 value


// 파일 절대 경로 설정 (예시)
$fileDir = "C:/Bitnami/wampstack-7.2.14-0/apache2/htdocs/img/test.jpg";

// 요청자 검증을 위한 암호화 데이터(수정 금지).
$userId = "ID";
$userPwd = "Password";
$EncryptBase64 = base64_encode($userId.":".$userPwd);

// 요청 데이터를 배열 형식으로 최초 set.
$data = array(
	'key_1' => $value_1,
	'key_2' => $value_2,
	'fileDir' => $fileDir,	// 파일경로
	'fileContents' => file_get_contents($fileDir)	// 파일 내용
);	

// 배열 형식의 데이터를 multipart/form-data 형식으로 변환
$postData = setMultipartFormData($data);

// 요청 API Header 정보(Api-Key 값은 전달받은 값 그대로 사용.)
$headers = array(
	'Content-Type: multipart/form-data;boundary=^*******^',
	'Content-Length: '.strlen($postData), 
	'Authorization: Basic '.$EncryptBase64
);

// 요청 URL 
$postUrl = "https://";

// 응답 파라미터 변수 선언 및 초기화
$response = "";

// API 호출 및 응답 데이터 저장
$response = reqPost($postData, $postUrl, $headers); 
	
// 응답 데이터 print
echo "Response : " . $response;

// api 요청
function apiCall($data, $url, Array $headers){
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HEADER, true);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);	
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);		//connection timeout 30
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);	
	curl_setopt($ch, CURLOPT_POST, true);			// API 호출 시 method를 post로 지정
	curl_setopt($ch, CURLOPT_POSTFIELDS, $data);	// Data 
	$response = curl_exec($ch);
	curl_close($ch);	 
	return $response;
}

// multipart/form-data 형식으로 변환하는 함수
function setMultipartFormData($arrayData){
	
	$fileData = $arrayData['fileContents'];
	$boundary = "^*******^";
	$data = "";
	unset($arrayData['fileContents']);

	foreach ($arrayData as $name => $content) {
		$data .= '--' . $boundary . '\r\n'
		. 'Content-Disposition: form-data; name="' . $name . '\"\r\n\r\n'
        . $content . '\r\n';
	}
		
	// 파일 데이터 저장
	$data .= '--' . $boundary . '\r\n'
		. 'Content-Disposition: form-data; name="file"; filename="' . $arrayData['fileDir'] . '"' . '\r\n'
		. 'Content-Type:application/octet-stream' . '\r\n\r\n';
	$data .= $fileData . '\r\n';
	$data .= "--" . $boundary . '--\r\n';

	return $data;
   }
?>

 

** 주의사항 : 요청 필드는 제가 임의로 작성해서 Key_1, Key_2 등으로 만든 것이지만 실제로는 API 명세서에서 요구하는 필드를 입력하여야 합니다. 일반적으로 파일 절대 경로나 파일명을 요구하므로 fileDir이라는 필드를 만들었지만 이는 제가 임의로 작성한 코드이므로 API 명세에 따라 수정이 필요합니다. 

또한 예시 코드로 작성하다보니 인증 방식 역시 HTTP 기본 인증 방식인 Basic Authorization을 선택하여 만들었습니다. 실제 코드를 작성하실 때 API 명세에 별도 암호화 방식을 요구할 수 있으니 주의하셔야 합니다.

 

이렇게 예시 코드를 작성해 보았는데요,

위에서 언급했던 "multipart/form-data" 파라미터는 $headers에 담아 HTTP header 정보에 담았습니다!

 

이중 가장 자세히 보아야 할 부분은 제가 임의로 만든 setMultipartFormData 함수입니다!

 

배열로 세팅한 $data를 매개변수로 받아 key-value 데이터와 파일 내용을 분리해서 다시 세팅하는 형태로 구성되어 있는데요, 굳이 이러한 과정을 거치는 이유는 multipart/form-data 형식을 준수하기 위함입니다!

 

우선 첫째로 $boundary 변수는 header에 Content-type=multipart/form-data 지정 시 함께 지정한 boundary와 같은 값을 가져야 합니다. 이유는 boundary가 HTTP 요청 Body 데이터 중 파일 데이터를 구분하기 위한 역할을 가지기 때문입니다. 

 

둘째로 $boundary 양 옆으로 "--" 기호와 "\r\n" 이스케이프 시퀀스를 넣어 놓았는데요,

먼저 "--" 기호는 body의 끝을 알리는 구분자이며 "\r\n" 이스케이프 시퀀스는 Header와 Body, Body 데이터 간의 구분을 위해 넣었다고 생각하시면 됩니다!

 

...?

이해가 되지 않는 부분들이 생기실 거에요..!

여기선 요청 Body 데이터만 세팅하는데 왜 또 header/body를 구분하느냐 말이죠??

 

이유는 body의 내용을 보시면 이해되실 거에요!!

body 데이터에서 Content-Disposition을 지정해주었죠? 이는 HTTP 응답 Header의 한 종류로 브라우저에 Content가 웹페이지로 나타낼지, 다운로드될지 정하는 속성이에요. 즉, $headers에 담은 HTTP 요청 Header 정보가 아닌 응답 Header 정보와 구분하기 위해 "\r\n"을 두번 써서 구분하는 것이랍니다 ㅎㅎ 

Body 데이터 간 구분은 "\r\n"을 한번 써서 구분합니다!

 

이외 자세한 HTTP 통신 규약은 아래 사이트를 참고해주세요!

https://www.donnywals.com/uploading-images-and-forms-to-a-server-using-urlsession/

 

추가적으로 응답 헤더 정보인

Content-Disposition, application/octet-stream에 대한 자세한 내용은 각각 아래 페이지를 참고해주세요!

 

Content-Disposition :

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition

 

Content-Disposition - HTTP | MDN

In a regular HTTP response, the Content-Disposition response header is a header indicating if the content is expected to be displayed inline in the browser, that is, as a Web page or as part of a Web page, or as an attachment, that is downloaded and saved

developer.mozilla.org

Content-Type: application/octet-stream : https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types

 

MIME 타입의 전체 목록 - HTTP | MDN

다음은 일반적인 확장자로 정렬된, 문서 타입과 관련된 MIME 타입의 포괄적인 목록입니다.

developer.mozilla.org

 

참고해야할 사이트가 많지만 찾아보면 분명 도움이 되실 내용들입니다!

.

제가 위에 작성한 코드들은 자바로 작성되어 있던 샘플과 위 페이지를 참고하여 만든 것으로,

필요하신 분들은 가져가서 작성해주셔도 무방합니다만 그냥 복사-붙여넣기하는 방식은 본인에게 제일 좋지 않은 개발습관이에요!

몇몇 분들께서 제 코드를 가져다가 본인이 작성한 코드라고 말하다가 신고되었다고 댓글로 알려주신 사례가 꽤나 적지 않네요..물론 바로 지워주시긴 하셨지만..

 

저 역시도 초급 개발자이다보니 많은 웹 페이지와 서적들을 보고 공부하느라 내용이 틀릴 수도 있으니 만약 제가 작성한 내용을 보시고 틀린 부분이 있다면 지적해주세요 ㅎㅎ

 

오늘 포스팅은 여기서 마치도록 할게요!

긴글 읽어 주셔서 감사합니다~~😃😃😃

안녕하세요 워누입니다. 

 

너무 오랜만에 tistory 블로그를 작성해보네요 ㅎㅎ

오늘은 그동안 바쁘다는 핑계로 이리저리 미루다가 드디어 PHP8을 설치하고 체험해보는 내용으로 포스팅해보겠습니다!

 

PHP로 개발을 하려면 웹 서버인 아파치, PHP 언어, DB를 사용한다면 MySQL 등 여러가지를 설치해야 하는데요, 

요즘에는 여러 회사들에서 이를 하나로 묶어

WAMP(Windows+Apache+MySQL+PHP), WAPP(Windows+Apache+PostgreSQL+PHP), MAMP(MacOS+Apache+MySQL+PHP) 등을 출시해서 서버부터 언어, DB를 한번에 통합으로 설치할 수 있게 배포하고 있습니다!

 

저는 윈도우로 사용할 예정이라 Bitnami사에서 제공하는 WAMP 스택으로 설치해보겠습니다. 

.

사실 Bitnami에서 제공하는 WAMP는 제가 PHP 관련해서 짧게나마 소개했었는데요!

 

https://seoneu.tistory.com/16

 

PHP 맛보기

안녕하세요 워누입니다! . 직장에 다닌다는 핑계로, tistory를 방치하고 있었네요..ㅜ 그래도 나름 자료가 유용했는지 방문자님들이 계셔서 감사한 마음입니다ㅎㅎ . 저는 직장에서 주로 PHP를 쓰

seoneu.tistory.com

 

오늘은 Bitnami 사이트에서 설치하는 방법을 제대로 소개해드리도록 해볼게요 ㅎㅎ

우선, Bitnami 사이트로 이동해서 통합버전 파일을 다운받아야겠죠?

 

https://bitnami.com/stack/wamp/installer

 

Install WAMP, Download WAMP

show MD5 4b221c61594ee6098ddc156acef7efc4 SHA1 799d7f122a3236f648effd6c4de77e3fcdf91a41 SHA256 a816b29ac59df47c1e9ceef4b546086ba40b7922446f603baa6d533c0d19e202

bitnami.com

 

저는 검색했지만 이 글을 보고 PHP8 설치하시려는 분은 위 사이트 클릭해서 바로 들어가세요 ㅎㅎ

.

여튼 위 사이트를 들어가면 아래와 같이 화면이 나올겁니다!

8월 22일 기준 가장 최신 버전은 PHP 8.0.9 입니다!

(PHP 메이저버전을 차용한듯 합니다.)

 

저는 최신버전인 8.0.9를 바로 다운로드 하겠습니다.

버전이 업데이트된다면 새로운 버전 다운받으셔도 될 것 같아요..!

.

주황색 다운로드 버튼을 클릭하면 아래 화면이 나오는데요,

 

Bitnami 커뮤니티에 의견을 제시하거나, 뉴스레터를 굳이 전달받지는 않을거라 

"No thanks, just take me to the download" 버튼을 클릭해서 다운로드를 진행하면 됩니다.

.

.

다운로드가 완료되면 exe 파일을 바로 실행해줍니다!

클릭하면 아래와 같이 설치 시작 화면을 볼 수 있어요

 

묻지도 따지지도 않고 "Next" 버튼을 클릭합니다!

 

다음 화면은 컴포넌트 선택화면인데요,

PHP하면 유명한 라라벨(Laravel) 프레임워크, 젠드(Zend) Framework 등 여러가지가 있네요ㅎㅎ

 

저는 바로 "Next" 버튼 눌러주겠습니다!

(필요없는 기능이라고 생각되면 빼셔도 상관은 없답니다 ㅎㅎ)

.

설치 경로를 설정할 수 있는데요,

저는 D 드라이브에 공간이 넉넉해서 "D:\Bitnami\wampstack-8.0.9-0"로 경로를 바꿨어요!

 

경로를 지정해줬다면 "Next" 버튼을 클릭합니다!

.

데이터베이스 비밀번호를 설정하는 화면이네요!

자신만의 비밀번호를 설정하고 "Next"를 클릭합니다. 

.

DB 포트 설정입니다.

저는 이미 사용하는 DB의 포트가 각각 3306, 3307로 설정되어 있어서 3308로 지정되어 있구요!

아마 각자 DB포트 설정에 따라 번호가 지정될거에요!

.

그대로 "Next" 버튼을 클릭해줍니다.

 여기서는 그냥 "Next" 버튼을 클릭해주세요!

설치 직전 화면입니다!!

준비가 되었다면 "Next" 버튼 클릭!

자 이제 설치를 시작합니다!

설치하는 동안 다른 거 잠깐 하고 오셔도 될거 같네요 ㅎㅎ

 

설치하던 도중 아파치 경고창이 떴습니다!

어차피 개인용으로 사용할 거라 둘다 체크하고 "엑세스 허용"하면 될거 같아요.

 

설치가 마무리되었습니다!

체크박스에 체크를 하고 "Finish" 버튼을 클릭해볼까요?

 

인터넷 브라우저에 이렇게 뜨면 설치 완료입니다!

 

설치 경로인 "D:\Bitnami\wampstack-8.0.9-0" 폴더도 정상적으로 세팅되었네요!

마지막으로, PHP 버전을 확인해봐야겠죠?

웹서버에 phpinfo() 함수를 걸어봅시다.

 

<?php
phpinfo();
?>

 

위 소스코드를 "phpinfo.php" 라는 파일명으로 저장한 후 브라우저에서 실행해보면.. 

정상 설치되었네요! 

이제 PHP8을 제대로 사용해보도록 하겠습니다!

간간히 PHP7과 PHP8 비교해보는 포스팅도 올려보도록 해볼께요 ㅎㅎ

 

오늘 포스팅은 여기서 마무리하도록 하겠습니다!

안녕하세요 워누입니다. 

오늘은 PHP에서 사용하는 비교연산자 중 헷갈릴만한 요소를 포스팅해보고자 합니다!

.

우선 소스부터 함께 보시죠!

.

:: 소스코드 - equalTest.php ::

<?php 

$int5 = 5;				// 정수형 숫자 5
$str5 = '5';				// 문자열 5

if ($int5 == $str5){		
	echo "true"."<br>";
} else {
	echo "false"."<br>";
}

if ($int5 === $str5){
	echo "true"."<br>";
} else {
	echo "false"."<br>";
}
?>

위 소스코드는 숫자 5와, 문자열 5를 비교하여 같으면 true, 다르면 false를 출력하는 소스코드입니다. 

아래 결과를 보기 전 결과가 어떨지  미리 생각해보아요~

.

결과는 어떤지 이제 한번 보도록 하죠!

.

:: 결과화면 ::

equalTest.php 실행화면

 

비교연산자 중 '==' 으로 비교한건 true가 나오고, '===' 으로 비교한건 false가 나왔네요! 

이유는 '=='으로 비교할 땐 값의 일치여부만 판단하지만,

'==='으로 비교하게 되면 자료형의 일치여부까지도 판단하기 때문인데요!

즉, 변수 int5와 str5의 값은 동일하게 '5'이므로 '=='으로 비교하였을 땐 같다고 판단하여 true를,

'==='으로 비교하였을 땐 자료형이 각각 정수, 문자열로 서로 다르기에 false를 출력하였습니다!

.

그렇다면 부정을 의미하는 !=, !==은 어떤지 같이 살펴 볼까요?

 

:: 소스코드 - equalTest2.php ::

<?php 

$int5 = 5;				// 정수형 숫자 5
$str5 = '5';				// 문자열 5

if ($int5 != $str5){		
	echo "true"."<br>";
} else {
	echo "false"."<br>";
}

if ($int5 !== $str5){
	echo "true"."<br>";
} else {
	echo "false"."<br>";
}

?>

 

이번엔 반대로 다르면 true, 같으면 false를 출력하도록 바꿨습니다.

결과를 바로 보시죠!

 

:: 결과화면 ::

equalTest2.php

 

예상대로 '!='로 비교하였을 땐 두 변수 모두 같은 값을 가지고 있어 false를 출력하였고, 

'!=='으로 비교하였을 땐 두 변수의 자료형이 다르니 true를 출력하였네요!

 

!= 연산자는 값의 다름만을 판별하지만,

!== 연산자는 값은 물론 자료형의 다름까지 판별한다는 점을 알게 되었네요 ㅎㅎ

.

위에서 언급한 '==', '===', '!=', '!==' 비교연산자는 javascript에서도 동일하게 적용된다고 하네요!

php가 웹에 특화된 언어인 만큼 javascript를 같이 사용하시는 분도 많을테니 참고하시면 도움이 될 듯합니다!

 

이번 포스팅도 유용한 글이 되었기를 바라며, 여기서 마무리 하겠습니다!

그럼 2만~

 

안녕하세요 워누입니다!

방통대 학업과 회사 일을 병행하다 보니 꾸준히 포스팅하겠다는 의지가 꺾여버렸네요..

그동안 포스팅해야 하는 내용들을 산더미처럼 쌓아놓고 정작 쓰질 않아 귀찮음이 좀 많이 생겼지만,

이제라도 하나씩 풀어야겠습니다!  

.

오늘 포스팅할 내용은 PHP로 JSON data를 다루는 법을 포스팅하겠습니다! 

PHP에서 JSON data를 처리할 수 있도록 json_encode(), json_decode() 함수를 지원합니다.

 

우선 json_encode() 부터 볼까요? 

.

1. json_encode()

:: php에서 배열 데이터를 json 데이터로 바꿔주는 역할을 합니다. 

사용 방법은 아래와 같이 사용하시면 됩니다!

 

json_encode(변수);

.

그럼 거두절미하고 바로 사용예시부터 볼까요?

:: 소스 코드(example) / jsonEncode.php :: 

<?php

//배열 데이터 생성 
$arrData = array(
	'ID' => 'testID',
	'buyerNm' => 'testName',
	'buyerPhoneNum' => '01012345678',
	'goodsData' => array(
		'goodsNm' => 'testGoods',
		'price' => 1000
	)
);

var_dump($arrData);
echo "<br>";

// json 데이터로 변경
$jsonData = json_encode($arrData); 

var_dump($jsonData);

?>

:: 출력 결과 ::

jsonEncode.php 실행 결과

보이시나요?

배열 데이터가 저장된 arrData를 json_encode()라는 함수 하나만으로 json 데이터 형식으로 변경이 되었습니다!!(박수)

변수의 저장 타입도 배열(array)에서 문자열(string)으로 변경된 것을 알수 있습니다 ㅎㅎ

 

그럼 이번엔 반대의 경우로 가볼까요?

우선 json data 파일을 만들어봅시다. json data 파일을 만드는 방법은 간단합니다!

json data 형식을 툴 아무데서나 작성한 뒤, 확장자를 json으로 저장해주시면 되거든요!!

.

:: json data 파일 (ex.json) ::

{
	"ID":"testID",
	"buyerNm":"testName",
	"buyerPhoneNum":"01012345678",
	"goodsData":{
		"goodsNm":"testGoods",
		"price":1000
	}
}

 

이렇게 작성된 json 파일을 file_get_contents() 함수로 불러와서 사용 예정입니다!

(file_get_contents()에 대한 설명은 아래 링크 참조해주세요!)

https://seoneu.tistory.com/25

 

API 통신할 때 file_get_contents(), curl은 무슨 차이일까?

안녕하세요 워누입니다! 오늘은 제가 회사에서 개발하다가 궁금한 점이 부딪혀서 직접 알아본 내용을 포스팅하고자 합니다. . 상황은 API 호출 시 특정 URL로 form-data를 post로 던지고 그 결과를 받

seoneu.tistory.com

 

그리고 아래와 같이 json data를 json_decode() 함수를 이용해 배열 데이터로 바꾸어봅시다!

json_decode(변수, true)

true..? 왜 들어갔는지는 글 아래에 후술해드릴게요!

간략하게만 설명드리면 json_decode에서 true로 지정이 되지 않으면 다른 파일 형태로 변경되더라구요!

그러니 우선은 꼭 true로 설정해주세요!! 

.

이제 사용 예시를 보여드릴께요!

.

:: 소스 코드(example) / jsonDecode.php :: 

<?php

//json data
$jsonData = file_get_contents("ex.json");
var_dump($jsonData);
echo "<br>";

// 배열 타입으로 변경
$arrData = json_decode($jsonData, true);

var_dump($arrData);

?>

:: 출력 결과 ::

jsonDecode.php 출력 결과

 

어떠신가요? 생각보다 간단하죠??

이렇게 json_encode(), json_decode() 사용 방법을 알아보았습니다!

근데 위에서 제가 json_decode()를 사용할 때, 2번째 매개변수로 true를 반드시 입력해야 한다고 했죠??

그 이유가 무엇인지 jsonDecode.php 파일에 코드를 추가하여 다시 실행해보도록 하겠습니다!

 

:: 소스 코드(example) / jsonDecode.php ::

<?php

//json data
$jsonData = file_get_contents("ex.json");
var_dump($jsonData);
echo "<br>";

$arrData = json_decode($jsonData, true); // true 입력
$arrData2 = json_decode($jsonData); // true 미입력 (false)

var_dump($arrData);  // true 입력한 결과
echo "<br>";
var_dump($arrData2); // true 미입력 결과 (false 결과)

?>

:: 출력 결과 ::

jsonDecode.php 출력 결과

....? 

true 값을 없애니, type이 array가 아닌 object(stdClass)라는 값이 왔네요??

이게 무엇인지 몰라 구글신께 검색하여 object라는 type이 PHP에 따로 있어서 찾아본 결과... 

 

일단 뜻은 흔히 알고 있는 객체(클래스의 '객체'할 때 그 객체가 맞습니다!)를 의미하고, 

stdClass는 PHP에서 일반적으로 쓰이는, 비어있는 클래스를 의미하며 다른 object를 캐스팅할 때 쓴다고 합니다. 

.

정리하면 변수 $arrData2는 stdClass에 캐스팅된 object 타입의 변수라 합니다..

(어려워서 좀더 찾아봐야 알 것 같지만 일반적인 배열이 아닌 object 타입의

클래스 기반 배열이라고 보시면 될 것 같네요.. 이거 때문에 회사에서 시간낭비한건 안비밀..)

 

PHP 개발자 분들 중 혹시 자세히 알고 계신 분이 있다면 댓글로 남겨주세요!! 

저도 더 정리할 수 있는 내용이 있다면 수정해서 올리거나, 댓글로 남기도록 하겠습니다!!

오늘 포스팅은 여기서 마치도록 할게요 ㅎㅎ 그럼 이만!

 

 

안녕하세요 워누입니다! 

오늘은 PHP로 이미지 파일을 업로드하는 방법을 포스팅하도록 하겠습니다!

거두절미하고 바로 가보도록 하죠~

.

여러분들도, 저도 인터넷에서 사진이나 문서 파일을 웹에서 업로드한 경험이 있을 것입니다!

이런 폼을 html에서 제공하는데요,

html 폼에서 파일을 업로드하기 위해서는 <input> 태그 내 type 속성 값으로 "file"을 사용하고, 

<form> 태그에 enctype 속성을 적용하고 값으로 "multipart/form-data"를 지정해야 합니다.

 

아래 예시코드처럼 작성을 해주시면 됩니다. 

(편의를 위해서 구분선을 작성했습니다!)

.

[fileUploadRequest.html]

<!DOCTYPE html>
<html>
<head>
</head>
<title>파일 업로드 테스트</title>
<body>
<form name="reqform" method="post" action="fileUploadResult.php" enctype="multipart/form-data"> 
 <p>이미지 파일 업로드 테스트</p>
 <hr> <br>
 <input type="file" name="imgFile" /><br>
 <input type="submit" value="업로드" />
</form>
</body>
</html>

.

이렇게 html로 요청 폼을 만들었으면 요청을 받는 응답 페이지도 만들어주어야 겠죠?

PHP에서는 파일을 어떻게 받아서 처리하는지 한번 보도록 합시다.

 

바로 PHP 응답 페이지 코드 보시죠!!

.

[fileUploadResult.php]

<?php 

/*********************************************
* 넘어오는 데이터가 정상인지 검사하기 위한 절차
* 실제 페이지에서는 적용 X
**********************************************/

//$_FILES에 담긴 배열 정보 구하기.
var_dump($_FILES);

// php 내부 소스에서 html 태그 적용 - 선긋기
echo "<hr>";

/*********************************************
* 실제로 구축되는 페이지 내부.
**********************************************/

// 임시로 저장된 정보(tmp_name)
$tempFile = $_FILES['imgFile']['tmp_name'];

// 파일타입 및 확장자 체크
$fileTypeExt = explode("/", $_FILES['imgFile']['type']);

// 파일 타입 
$fileType = $fileTypeExt[0];

// 파일 확장자
$fileExt = $fileTypeExt[1];

// 확장자 검사
$extStatus = false;

switch($fileExt){
	case 'jpeg':
	case 'jpg':
	case 'gif':
	case 'bmp':
	case 'png':
		$extStatus = true;
		break;
	
	default:
		echo "이미지 전용 확장자(jpg, bmp, gif, png)외에는 사용이 불가합니다."; 
		exit;
		break;
}

// 이미지 파일이 맞는지 검사. 
if($fileType == 'image'){
	// 허용할 확장자를 jpg, bmp, gif, png로 정함, 그 외에는 업로드 불가
	if($extStatus){
		// 임시 파일 옮길 디렉토리 및 파일명
		$resFile = "./img/{$_FILES['imgFile']['name']}";
		// 임시 저장된 파일을 우리가 저장할 디렉토리 및 파일명으로 옮김
		$imageUpload = move_uploaded_file($tempFile, $resFile);
		
		// 업로드 성공 여부 확인
		if($imageUpload == true){
			echo "파일이 정상적으로 업로드 되었습니다. <br>";
			echo "<img src='{$resFile}' width='100' />";
		}else{
			echo "파일 업로드에 실패하였습니다.";
		}
	}	// end if - extStatus
		// 확장자가 jpg, bmp, gif, png가 아닌 경우 else문 실행
	else {
		echo "파일 확장자는 jpg, bmp, gif, png 이어야 합니다.";
		exit;
	}	
}	// end if - filetype
	// 파일 타입이 image가 아닌 경우 
else {
	echo "이미지 파일이 아닙니다.";
	exit;
}
?>

이렇게 코드를 작성해보았습니다.

.

이전 PHP 포스팅에서 $_POST 필드를 이용해 form 태그의 method가 post인 data를 가져온 것을 볼 수 있습니다. 

즉, $_POST 필드는 요청 시 method 속성의 값이 post 방식인 데이터를 배열 형태로 가져온다는 것을 알 수 있습니다.

 

일반적인 데이터라면 $_POST 필드를 이용해 값을 가져왔겠지만, 파일 데이터는 조금 다릅니다. 

$_FILES라는 필드를 이용해 파일에 대한 데이터 값을 배열로 가져옵니다. 

 

자세한 내용을 설명드리기 위해 var_dump() 함수를 이용해 $_FILES 필드에 담긴 배열 데이터를 모두 print하였습니다. 

(PHP에서 데이터를 체크하기 위해 자주 사용하는 함수이니 꼭 알아두세요!!)

실행된 예시 화면을 보면서 조금 더 상세하게 설명드릴게요ㅎㅎ

.

1) fileUploadRequest.html 실행

fileUploadRequest.html 실행 화면

 

2) fileUploadRequest.html 페이지와 동일 경로 내 img 폴더 임의 생성

img 폴더 생성

 

빈 폴더

** 이미지가 업로드되는지 확인하기 위해 빈 폴더로 생성해 놓았습니다!

 

3) fileUploadRequest.html 페이지에서 "파일 선택" 버튼 클릭 후 첨부할 이미지 선택

첨부할 이미지 선택
"파일 선택" 버튼 옆에 선택한 이미지의 파일명이 체크됨.

 

4) fileUploadRequest.html 페이지에서 "업로드" 버튼 클릭 후 결과 확인

fileUploadResult.php 결과 화면

5) fileUploadResult.php 페이지에서 설정한 경로에 선택한 이미지가 업로드 되었는지 확인.

img 폴더 재확인, 선택한 파일이 업로드된 부분 확인.

.

이런 식으로 테스트가 진행되었습니다. 

 

1-3번 과정은 요청하는 페이지에 대한 과정이니 추가 설명을 생략하고, 바로 4번부터 상세하게 설명을 드리겠습니다. 

 

fileUploadResult.php 소스 내 9번째 라인에서 "var_dump($_FILES);"로 체크한 부분을 통해

파일 데이터가 어떻게 저장되어 넘어오는지 알수 있습니다. 

 

넘어온 데이터 형식을 보면 아래와 같은데요,


array(1) { ["imgFile"]=> array(5) { ["name"]=> string(10) "watch3.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(48) "C:\Bitnami\wampstack-7.2.14-0\php\tmp\phpFC9.tmp" ["error"]=> int(0) ["size"]=> int(367171) } }


imgFile이라는 배열 데이터 안에 name, type, tmp_name, error, size라는 필드들이 또 배열로 들어가 있는 것을 확인 할 수 있습니다. 아래 표를 통해 각 필드에 대한 설명을 드립니다. 

 

Field value
imgFile 요청 시 input 태그 내 name 속성으로 지정한 값을 그대로 받아옴.
Field in "imgFile" name 파일명
type 파일 타입과 확장자명을 받아옴 (구분자: /)
tmp_name 업로드한 파일을 임시로 저장할 폴더와 파일명
error 에러 여부
size 파일 사이즈 (단위: byte)

위 표에 대해서 인지를 하고 fileUploadResult.php 소스를 보시면 조금 더 이해가 되실 겁니다ㅎㅎ

다만 소스 내에서 언급한 것처럼 var_dump로 찍은 데이터는 어디까지나 개발할 때 데이터를 체크하기 위한 용도로 쓰기 때문에 만약 실제로 개발하실 때에는 위 데이터가 실제 서비스하는 페이지에서는 보이지 않게 반드시 주의해주세요!

 

다음부터는 주석을 참고하시면서 이런 의미구나 하고 소스를 이해해주시면 되겠습니다!

 

제작된 샘플 소스의 동작 구조는 임시로 저장된 파일경로를 변수에 담아두고 확장자를 검사해서 이미지 파일이 맞으면 

임시 파일 경로에 두었던 파일을 실제 서버 내 폴더에 업로드하고,

허용된 확장자를 쓰지 않았거나 이미지 파일이 아니라면 실패 처리를 알리는 문자열을 출력하는 형태로 구성됩니다!

 

이 소스에서 중요하게 사용된 함수는 아래 설명을 참고 바랍니다!

 

**

explode : PHP에서 하나의 구분자를 가지고 배열 데이터를 만드는 기능을 제공하는 함수

-> syntax : explode("구분자", "데이터");

 

move_uploaded_file : 임시적으로 업로드된 파일을 새로운 경로로 옮겨주는 기능을 제공하는 함수

-> syntax : move_uploaded_file("업로드한 파일의 임시 위치", "옮길 위치 및 파일명");

**

 

이렇게 제가 작성한 코드와 그에 대한 설명을 담아보았는데요. 

제가 드린 샘플 소스를 그대로 사용해도 좋지만 변형도 해보고,

일부러 다른 파일도 올려서 오류가 어떻게 나는지도 직접 시도해보는 것을 권장합니다!

 

저처럼 초보개발자라면 반드시 이렇게 직접 자신의 코드를 써보고, 설명해보고, 일부러 오류도 내보시면 

실력이 더 많이 향상될 것 같아요 ㅎㅎ

제 코드와 설명도 완벽하지는 않아서 언제나 피드백을 주시면 반영하도록 하겠습니다 ㅎㅎ 

 

오늘 포스팅은 여기서 마치도록 하겠습니다~

그럼 20000!!!

 

+ Recent posts