1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php if( !isset($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest' ) { die(json_encode(array('status' => "잘못된 호출입니다."))); } // 데이터를 준비 $value = array( 1 => array('item' => '라면', 'price' => 580, 'orders' => 113), 2 => array('item' => '라면(아메리칸)', 'price' => 580, 'orders' => 72), 3 => array('item' => '볶음밥', 'price' => 630, 'orders' => 87), ); header("Content-Type: application/json; charset=UTF-8"); // IE가 Content-Type 헤더를 무시하지 않게 함 header('X-Content-Type-Optoins: nosniff'); echo json_encode( $value, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP ); |
2018년 5월 22일 화요일
[PHP예제] 237 JSON 형식의 데이터를 반환하는 Web API 만들기
[PHP예제] 235 다른 페이지로 건너뜀
1 2 3 4 | <?php header('HTTP/1.1 303 See Other'); header('Location: http://www.woorits.com/'); exit(); |
http://www.woorits.com 사이트로 강제 이동
[PHP예제] 231 강제로 파일 다운로드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php $fileName = 'test.jpg'; $fileSize = filesize($fileName); $mime = 'image/jpeg'; //$mime = 'application/octet-stream'; // MIME 타입이 불분명한 경우 header('Content-Type: ' . $mime); // IE가 Content-Type 헤더를 무시하지 않게 함 header('X-Content-Type-Optoins: nosniff'); header('Content-Disposition: attachment; filename="' . $fileName . '"'); header('Content-Transfer-Encoding: binary'); header('Cache-Control: no-store, no-cache, must-revalidate'); if( isset($_SERVER['HTTP_USER_AGENT']) && strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE') ) { header('Cache-Control: post-check=0, pre-check=0', false); header('pragma: public'); } header('Content-Length: ' . $fileSize); readfile($fileName); |
test.jpg 파일이 다운로드 됨
[PHP예제] 230 여러장의 이미지 업로드하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 | <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>여러장의 이미지 업로드하기</title>
</head>
<body>
<div>
<?php
require_once './h.php';
$dir = './upload';
const MAX_SIZE = 102400;
// 'php.ini'의 post_max_size를 넘은 데이터가 전송되었는지 확인함
if( !checkPostMaxSize() )
{
echo "파일 크기는 100KB 이하로 하시오.<br><br>";
}
// 파일이 업로드 되었는지 확인
if( isset($_FILES['uploadfile']) )
{
// 반복 처리
for( $i = 0; $i < count($_FILES['uploadfile']['name']); $i++ )
{
// 업로드 파일을 확인함
list($result, $ext, $error_msg) = checkFile($i);
if( $result )
{
$name = $_FILES['uploadfile']['name'][$i];
$tmp_name = $_FILES['uploadfile']['tmp_name'][$i];
// 여기에서는 저장할 디렉터리의 아래쪽에 '"upfile_" + 현재의 타임스탬프
// + 일련번호 + "_"
// + 마이크로초와 전체 파일명, 연결 전 IP 주소에 근거하는 MD5
// + 확장자'로 배치함
$move_to = $dir . '/upfile_' . time() . $i . '_'
. md5(microtime() . $name . $_SERVER['REMOTE_ADDR'])
. '.' . $ext;
// 업로드한 임시 파일을 지정한 장소로 이동함
if( move_uploaded_file($tmp_name, $move_to) )
{
// 이미지 파일을 표시함
echo h($move_to) . '<br>';
echo '<img src="' . h($move_to) . '" alt="업로드된 이미지"><br>';
}
else
{
$error_msg[] = '이미지의 업로드 실패';
}
}
// 오류 메시지가 있으면 표시
if( count($error_msg) > 0 )
{
foreach( $error_msg as $msg )
{
echo h($msg) . "<br>";
}
}
}
}
function checkFile($i) // 업로드 파일을 확인하는 함수
{
$error_msg = array();
$ext = '';
$size = $_FILES['uploadfile']['size'][$i];
$error = $_FILES['uploadfile']['error'][$i];
$img_type = $_FILES['uploadfile']['type'][$i];
$tmp_name = $_FILES['uploadfile']['tmp_name'][$i];
if( $error != UPLOAD_ERR_OK ) // 업로드 오류의 경우
{
if( $error == UPLOAD_ERR_NO_FILE )
{
// 업로드되지 않은 경우는 오류 처리를 하지 않음
}
elseif( $error == UPLOAD_ERR_INI_SIZE
|| $error == UPLOAD_ERR_FORM_SIZE )
{
// 파일 크기 오류
$error_msg[] = '파일 크기는 100KB 이하로 하시오.';
}
else
{
$error_msg[] = '업로드 오류임';
}
return array(false, $ext, $error_msg);
}
else
{
// 전송된 MIME 타입으로부터 확장자를 결정함
if( $img_type == 'image/gif' )
{
$ext = 'gif';
}
elseif( $img_type == 'image/jpeg' || $img_type == 'image/pjpeg' )
{
$ext = 'jpg';
}
elseif( $img_type == 'image/png' || $img_type == 'image/x-png' )
{
$ext = 'png';
}
// 이미지 파일의 MIME 타입을 판별
$finfo = new finfo(FILEINFO_MIME_TYPE);
$finfoType = $finfo->file($tmp_name);
// 이미지 파일의 크기의 하한을 확인함
if( $size == 0 )
{
$error_msg[] = '파일이 존재하지 않거나 빈 파일임';
}
elseif( $size > MAX_SIZE )
{
$error_msg[] = '파일 크기는 100KB 이하로 하시오.';
}
elseif( $img_type != $finfoType )
{
$error_msg[] = 'MIME 타입이 일치하지 않음';
}
elseif( $ext != 'gif' && $ext != 'jpg' && $ext != 'png' )
{
$error_msg[] = '업로드 가능 파일은 gif, jpg, png 임';
}
else
{
return array(true, $ext, $error_msg);
}
}
return array(false, $ext, $error_msg);
}
// 'php.ini'의 post_max_size를 넘은 데이터가 전송되었는지를 확인하는 함수
function checkPostMaxSize()
{
$max_size = ini_get('post_max_size');
// post_max_size가 8MB와 같이 설정된 경우에 정수로 함
$multiple = 1;
$unit = substr($max_size, -1);
if( $unit == 'M' )
{
$multiple = 1024 * 1024;
}
elseif( $unit == 'K' )
{
$multiple = 1024;
}
elseif( $unit == 'G' )
{
$multiple = 1024 * 1024 * 1024;
}
$max_size = substr($max_size, 0, strlen($max_size) - 1) * $multiple;
// post_max_size를 넘어선 데이터가 게시되었는지 확인
if( $_SERVER['REQUEST_METHOD'] == 'POST' &&
$_SERVER['CONTENT_LENGTH'] > $max_size )
{
return false;
}
else
{
return true;
}
}
?>
<hr>
<p>업로드하고 싶은 이미지 파일(gif, jpg, png)을 지정하시오</p>
<form method="post" action="230.php" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo h(MAX_SIZE); ?>">
<input type="file" name="uploadfile[]"><br>
<input type="file" name="uploadfile[]"><br>
<input type="file" name="uploadfile[]"><br>
<input type="submit" value="전송"><br>
이미지 사이즈는 1개의 이미지에 대해 100KB 이하
</form>
</div>
</body>
</html>
|
[PHP예제] 223 세션 사용하기
PHP에서 세션은 세션ID와 세션 변수의 조합으로 실현됨
- 세션을 사용하기
- session_start()
- 세션 데이터를 초기화해 세션을 시작
- 이미 세션이 시작된 경우에는 기존의 세션을 다시 시작
- 클라이언트쪽에서는 웹브라우저의 쿠키에 세션ID가 저장됨
- 서버쪽에는 'php.ini'의 session.save_path에서 지정한 디렉터리에 세션 변수를 저장할 파일이 생성됨
- 브라우저에 출력하기 전에 session_start() 함수를 기술해야 함
- 세션명을 구하고 설정하기
- session_name()
- 영어와 숫자만으로 구성되어야 함
- 세션명을 'INFOPUB'에 설정함
- $oldSessionName = session_name('INFOPUB');
- session_name() 함수에 의한 세션명을 변경하려면 session_start() 함수보다 앞에 기술해야 함
- 세션 ID를 구하기
- session_id()
- 인수를 지정하지 않으면 현재의 세션 ID를 되돌려줌
- 기본 설정에서 세션 데이터는 'sess_'+'세션ID'라는 이름의 파일에 저장됨
- 현재 세션이 없으면 공백문자('')를 되돌림
- 같은 세션 ID를 계속 사용하는 것은 보안상 바람직하지 않으므로
- session_regenerate_id() 함수로 세션 ID를 변경
- 세션 변수를 사용하기
- $_SESSION['세션변수명']
- 세션 변수를 사용하려면 먼저 session_start() 함수로 세션을 시작해야 함
- 세션 변수를 파기하기
- unset()
- unset($_SESSION['세션변수명']);
- 모든 세션 변수를 파기(초기화)하려면 다음과 같이 해야 함
- $_SESSION = array();
- 세션 쿠키의 파라미터를 설정하기
- session_set_cookie_params()
- 세션을 파기하기
- session_destroy()
[PHP예제] 222 쿠키 사용하기
222_w.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php // 쿠키에 대입할 데이터를 설정 $cookie_data = 'data1=PHP 프로그래밍&data2=인기 발매 중'; // 쿠키에 쿠키명 'php_sample'로 저장 setcookie('php_sample', $cookie_data); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <title>Cookie에 데이터 쓰기</title> </head> <body> <div> <p>Cookie를 저장함</p> </div> </body> </html> |
222_r.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Cookie에서 데이터 읽기</title>
</head>
<body>
<div>
<?php
require_once './h.php';
echo "<p>Cookie의 내용: ";
echo h($_COOKIE['php_sample']);
echo "<p>parse_str() 함수로 분리한 쿠키의 내용:";
parse_str($_COOKIE['php_sample'], $output);
echo "data1: " . h($output['data1']) . "<br>";
echo "data2: " . h($output['data2']) . "<br>";
?>
</div>
</body>
</html>
|
[PHP예제] 156 spl_autoload_register() 함수에 의한 오토로드
FileInfo.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <?php class FileInfo { private $retCode; // 줄 바꿈 코드 보존용 // 파일을 읽고 조사하는 메소드 public function readFile($file) { $this->retCode['CRLF'] = 0; // 줄 바꿈 코드가 CRLF인 행 수 $this->retCode['LF'] = 0; // 줄 바꿈 코드가 LF인 행 수 $fp = fopen($file, 'r'); if (! is_resource($fp)) { die('파일을 열지 않음'); } while (($line = fgets($fp)) !== false) { if (preg_match('/\r\n\z/', $line)) { $this->retCode['CRLF']++; } else { $this->retCode['LF']++; } } fclose($fp); } // 줄 바꿈 코드를 되돌려주는 메소드 public function getRetCode() { if ($this->retCode['CRLF'] == 0 && $this->retCode['LF'] == 0) { return ''; // 줄 바꿈이 없는 경우 } elseif ($this->retCode['CRLF'] == 0) { return 'LF'; // 모두 LF의 경우 } elseif ($this->retCode['LF'] == 0) { return 'CRLF'; // 모두 CRLF의 경우 } else { return 'CRLF & LF'; // CRLF와 LF가 함께 있는 경우 } } } |
Counter.class.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php // Counter 클래스를 정의합니다. class Counter { // 정적 프로퍼티 $count를 선언합니다. public static $count = 0; // 정적 메서드 increment()를 선언합니다. public static function increment() { static::$count++; } // 정적 메서드 current()를 선언합니다. public static function current() { return static::$count; } } /* ?>종료 태그 생략 [레시피 001]*/ |
autoload.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php // 익명 함수를 사용하여 오토로드 함수를 등록함 spl_autoload_register( function ($classname) { // __DIR__은 이 소스 파일이 있는 디렉터리가 정의되는 매직 상수 // 인수로서 전달된 클래스명을 바탕으로 '클래스명.class.php'를 찾음 $filepath = __DIR__ . '/' . $classname . '.class.php'; // 파일의 존재 확인을 진행 if( is_readable($filepath) ) { // 인수로 전달된 클래스명을 바탕으로 대응하는 파일을 읽음 require $filepath; } } ); spl_autoload_register( function ($classname) { // __DIR__은 이 소스 파일이 있는 디렉터리가 정의되는 매직 상수 // 인수로서 전달된 클래스명을 바탕으로 '클래스명.class.php'를 찾음 $filepath = __DIR__ . '/' . $classname . '.php'; // 파일의 존재 확인을 진행 if( is_readable($filepath) ) { // 인수로 전달된 클래스명을 바탕으로 대응하는 파일을 읽음 require $filepath; } } ); |
156.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>spl_autoload_register() 함수에 의한 오토로드</title>
<link href="style.css" rel="stylesheet">
</head>
<body>
<div>
<?php
// 오토로드의 설정을 읽음
require './autoload.php';
echo "FileInfo 클래스를 인스턴스화 함: ";
$obj = new FileInfo();
$obj->readFile(__FILE__);
echo "<br>getRetCode() 메소드를 호출함: ";
echo $obj->getRetCode();
echo "<br>";
echo "Counter::current()를 호출함";
echo Counter::current();
?>
</div>
</body>
</html>
|
피드 구독하기:
글 (Atom)




