'php'에 해당되는 글 35건

  1. 2014.10.24 [우분투] php curl 설치 (1)
  2. 2013.06.13 session_save_path() 설정되지 않을 때
  3. 2013.02.14 [PHP] trim
  4. 2013.02.05 [설정] date.timezone
  5. 2013.01.23 [PHP] array_push(), array_pop()
  6. 2013.01.17 [PHP] mkdir(), rmdir(), is_dir(), scandir(), filetype(), unlink() (1)
  7. 2013.01.16 확장자 .htm 파일 내의 php 코드가 실행되지 않는 문제 해결 방법
  8. 2013.01.14 날짜와 시간을 저장하고 이용하는 방법에 관한 생각
  9. 2012.12.24 [PHP] number_format()
  10. 2012.12.21 [PHP] move_uploaded_file()
  11. 2012.12.21 [PHP] time(), date(), mktime()
  12. 2012.12.18 [PHP] htmlspecialchar()
  13. 2012.12.18 [PHP] nl2br()
  14. 2012.12.18 [PHP] ceil()
  15. 2012.12.17 [PHP] addslashes(), stripslashes() 그리고, get_magic_quotes_gpc() (1)
  16. 2012.12.17 [PHP] isset(), unset() (1)
  17. 2012.12.17 19. php 회원관리 및 게시판 소스 (2)
  18. 2012.12.17 18. 아차! 하고 빼먹은 로그아웃 구현하기 (5)
  19. 2012.12.17 17. php로 기초적인 게시판 만들기 - 글 삭제하기 (2)
  20. 2012.12.17 16. php로 기초적인 게시판 만들기 - 글 수정하기 (2)
  21. 2012.12.17 14. php로 기초적인 게시판 만들기 - 목록에 페이지 링크 추가하기 (3)
  22. 2012.12.17 13. php로 기초적인 게시판 만들기 - list.php (31)
  23. 2012.12.17 12. php로 기초적인 게시판 만들기 -write.php (6)
  24. 2012.12.13 10. 화면에 표시되는 내용 구분하기 (3)
  25. 2012.12.13 9. 중복 코드는 하나의 파일로 작성해서 포함시키기 (9)
  26. 2012.12.13 [PHP] session_start(), $_SESSION[]
  27. 2012.12.13 8. session으로 로그인 정보 유지시키기 (33)
  28. 2012.12.12 7. 로그인 페이지 만들기 (23)
  29. 2012.12.12 [PHP] header()
  30. 2012.12.12 6. 가입 정보 저장 후 완료 페이지로 전환하기 (13)

php 에서 사용할 curl 설치하는 방법


..은 무지 쉽다.



# sudo apt-get install php5-curl


하고 나서, 아파치 재시작해주면 되겠습니당~~


$ sudo service apache2 restart



php 카데고리로 갈까하다가 우분투 apt-get 사용해서 설치하는 거라 우분투 카테고리에 올림!


끝!





Posted by 똑똑한 영장류

session_save_path() 를 이용하면 세션 정보들을 저장하는 위치를 지정해 줄 수 있는데, 이게 제대로 설정되지 않아 조금 파 봤습니다.


phpinfo.php 만들었습니다.

<?php

phpinfo();

?>


브라우저에서 확인하니, 아래의 내용으로 설정되어 있습니다.




그리고, /etc/php.ini 도 살펴보니, 아래처럼 되어있습니다.

session.save_path = "/var/lib/php/session"



작업하고 있는 php 파일에서 session_save_path('./tmp'); 라고 아무리 해도 저 값이 바뀌지 않더군요.


여기저기 찾아보니, 아래와 같이 하니까 변경이 되었습니다.

ini_set('session.save_path', './tmp');


아래처럼 해서 현재의 세션 저장 디렉토리를 얻는 것은 잘 됩니다.

$path = session_save_path() ;


설정하는 것은 안 되더군요. 왜죠?





Posted by 똑똑한 영장류

[PHP] trim

웹 개발/PHP 2013.02.14 02:37



string trim ( string $str [, string $charlist ] )

입력한 $str 의 앞뒤 공백을 잘라내줍니다.


웹에서 form 문을 통해 전송받은 값들을 처리할 때, 사용한답니다.



기본적으로 아래 것들을 제거합니다.


  • " " (ASCII 32 (0x20)), an ordinary space.
  • "\t" (ASCII 9 (0x09)), a tab.
  • "\n" (ASCII 10 (0x0A)), a new line (line feed).
  • "\r" (ASCII 13 (0x0D)), a carriage return.
  • "\0" (ASCII 0 (0x00)), the NUL-byte.
  • "\x0B" (ASCII 11 (0x0B)), a vertical tab.


이거 말고 다른것을 없애버릴려면, $charlist 에 지정해주면 됩니다.


.. <- 점두개를 이용해서 범위를 설정하는 것도 가능합니다.






Posted by 똑똑한 영장류
TAG php, trim



timezone 사용에 문제가 있을 때는!!!


php.ini 열어서


date.timezone = Asia/Seoul


이라고 적어주자.



'웹 개발 > PHP' 카테고리의 다른 글

[PHP] trim  (0) 2013.02.14
php.ini 설정 항목들의 의미 - (추가중)  (0) 2013.02.13
[설정] date.timezone  (0) 2013.02.05
[PHP] array_push(), array_pop()  (0) 2013.01.23
[PHP] mkdir(), rmdir(), is_dir(), scandir(), filetype(), unlink()  (1) 2013.01.17
[PHP] number_format()  (0) 2012.12.24


Posted by 똑똑한 영장류



배열에다가 값을 밀어넣어줍니다.


int array_push ( array &$array , mixed $var [, mixed $... ] )


아래 코드와 같은 기능을 합니다.


$array[] = $var;


리턴되는 값은 배열에 값을 추가한 후의 배열의 크기입니다.



push 가 있으면 pop 도 있겠죠.ㅎ


mixed array_pop ( array &$array )



배열의 가장 뒤에 있는, 마지막 요소를 뿅!하고 꺼집어내 줍니다.





Posted by 똑똑한 영장류



php로 디렉토리를 만들려고 mkdir()를 이용했습니다만, 삽질을 좀 했네요..ㅡ.ㅡ


bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] )





php 가 실행되는 동안 현재 디렉토리 . 은 php 파일이 위치하고 있는 디렉토리를 의미하죠.


www/dir1/a.php 가 있다고 가정합니다.


a.php 안에서 아래 mkdir()를 실행시킵시다.



mkdir('test');


www/dir1/test/ 가 생깁니다.


mkdir('./test'); 와 결과가 같지요.


mkdir('../test');


www/test/ 가 생깁니다.


이제 삽질한 부분..ㅡ.ㅡ



www/test/test1 을 만들고 싶어서 아래와 같이 작성했었습니다.



mkdir('../test/test1');


결과는 실패...


www/test를 만들고 그 안에 들어가서 다시 test1 을 만들어야하죠.

recursive 한 상황이 생긴겁니다. 이걸 모르고 계속 다른 원인을 찾아 해맸습니다. ㅋ


디렉토리 하나가 아니고, 그 아래에 더, 더, 만들고 싶을 때는 recursive 인자를 true 로 설정하고 함수를 호출해야합니다.


mkdir('../test/test1', 0777, true);


0777 디렉토리의 권한설정입니다. 기본 값이 0777 이네요.


아! 그리고,


mkdir('../test/test1');


mkdir('../test/test1/');

는 같습니다.

디렉토리 이름 뒤에 / 를 붙여도 되고 안 붙여도 됩니다.


만든 디렉토리를 삭제하는 방법은 rmdir()입니다.


bool rmdir ( string $dirname [, resource $context ] )


이건 쉽습니다.


rmdir('../test/test1');


이렇게 하면 상위 디렉토리 test 안에 있는 test1 디렉토리를 삭제합니다.


그럼, rmdir('../test/'); 라고 하면, 그 안에 있는 test1 도 몽땅 같이 지워질까요??


recursive 하게 동작을 할까요??


No, recursive 하게 동작하지 않습니다.


그래서 , php.net 의 rmdir() 설명 부분에 있는 예를 올립니다. recursive 하게 동작하는, 하위 디렉토리까지 모조리 삭제해주는 코드입니다.



<?php
 function rrmdir($dir) {
   if (is_dir($dir)) {
     $objects = scandir($dir);
     foreach ($objects as $object) {
       if ($object != "." && $object != "..") {
         if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
       }
     }
     reset($objects);
     rmdir($dir);
   }
 }
?> 


rrmdir() 함수 내에 다시 rrmdir() 함수가 보이죠?? 까칠한 재귀함수입니다.



못 본 함수가 몇개 있네요.


is_dir()


bool is_dir ( string $filename )


$filename으로 입력해준 값이 존재하는 디렉토리라면 true를 리턴해줍니다.




scandir()


array scandir ( string $directory [, int $sorting_order = SCANDIR_SORT_ASCENDING [, resource $context ]] )


디렉토리를 지정하면 그 안에 있는 파일과 디렉토리를 배열로 리턴해주는 함수 입니다.



filetype()


string filetype ( string $filename )


$filename 의 타입을 리턴해줍니다. 유닉스, 리눅스의 경우, 모든 것이 파일로 처리됩니다. 그것들 중에 디렉토리도 있고, 파일도 있고, 소켓도 있고 머 그렇죠.


리턴값은 아래의 것들 중 하나입니다.


Possible values are fifo, char, dir, block, link, file, socket and unknown.


아니면, FALSE



unlink()


bool unlink ( string $filename [, resource $context ] )


파일을 지웁니다.




삽질하지 맙시다..



'웹 개발 > PHP' 카테고리의 다른 글

[설정] date.timezone  (0) 2013.02.05
[PHP] array_push(), array_pop()  (0) 2013.01.23
[PHP] mkdir(), rmdir(), is_dir(), scandir(), filetype(), unlink()  (1) 2013.01.17
[PHP] number_format()  (0) 2012.12.24
[PHP] move_uploaded_file()  (0) 2012.12.21
[PHP] time(), date(), mktime()  (0) 2012.12.21


Posted by 똑똑한 영장류

 

재밌게 가지고 놀고 있는 서버가 있습니다.

APM 설치해서 이것저것 테스트 하곤 하는데요.

간만에 가지고 놀다보니, 문제가 있었습니다.

 

웹서버가 정상동작을 하고 있는 건 알겠는데, php 실행에 약간 문제가 있었습니다.

 

확장자가 php 인 파일은 잘 동작을 하는데,

확장자가 htm 이면서 내부에 <?php ?> 로 php 코드를 삽입했을 경우,

php 코드가 전혀 동작하지 않음을 이제서야 발견했습니다. ㅎ

 

APM 설치하고 설정 파일을 제대로 살펴보지 않고 깔리는대로 뒀더니 이 모냥이네요.

 

그래서, 서버로 ssh 접속! 전 putty 라는 프로그램을 사용합니다.

 

vi /etc/httpd/conf/httpd.conf

 

php 단어를 찾아보니 디렉토리 인덱스 파일로 설정되어 있는 index.php 만 나타납니다.

적당한 곳에... (적당한 곳은 AddType 블라블라 가 모여있는 근처..ㅎ)

 

AddType application/x-httpd-php .php .htm .html

 

위 내용 추가 해주고,

 

/sbin/service httpd restart

 

해줬더니, 이제 잘 됩니다. ㅎ

 

추가 : 우분투에서는 /etc/apache/mods-available/mime.conf 에서 위 내용을 추가해주면 되네요.

 

 



Posted by 똑똑한 영장류

 

 

웹 개발을 할 때, 정보를 데이터베이스에 저장하는 일은 거의 불가피한 일입니다.

 

게시판도 그렇고, 무언가 이용자로부터 정보를 받으면, 저장을 하려고 하죠.

그중에서, 날짜는 어떻게 처리하는것이 좋은지 한번 생각해봤습니다.

 

이용자가 게시판에 글을 작성했다고 가정합시다.

그러면, 글이 작성된 시간을 데이터베이스에 함께 저장을 해야하겠네요.

 

사람이 보기에는, '2013년 1월 14일 밤 11시 5분 30초' 에 저장했음.이라고 바로 보이면 좋겠죠.

'2013년 1월 14일 밤 11시 5분 30초' 문자열을 데이터베이스에 바로 저장할 수도 있겠습니다만, 데이터베이스에서 이 문자열을 가져와, '밤'을 '오후'로 표시하고 싶을 경우에는 귀찮은 일이 생겨버립니다.

 

정보를 보여주는 방법은 여러가지일 수가 있겠지요. 하기 나름입니다.

다만, 순수 정보는 처리하기 쉬운 형태로 데이터베이스에 저장을 해 놓고, 보여주는 건 내 마음대로 할 수 있는 것이 효율적이라 생각됩니다.

 

처리하기 쉬운 형태의 시간 정보를 저장하고, 읽어오고, 보여줄 모습을 바꾸고...

이 과정이 php와 mysql을 이용할 때, 어떻게 처리되는 것이 좋은지에 관한 생각입니다.

 

 


1. php에서 현재 시간을 구하는 방법

 

int time()

1970년 1월 1일 0시 0분 0초를 시작으로 지나간 시간을 초단위로 리턴해 줍니다.

리턴값은 int 형입니다.

 

1분은 60초

1시간은 3,600초

1일은 86,400초

1년은 365일 경우, 31,536,000초

100년은 3,153,600,000초

 

100년의 경우, 10자리수 네요. 1,000년은 11자리 수겠군요.

 

mysql 데이터베이스에 테이블 만들고, 시간을 저장할 필드를 생성할 때, INT 로 만들면 되겠군요.

 

 



2. 데이터베이스에 저장하는 방법


시간은 int 형으로 다룰 것이기 때문에, 테이블 작성시 시간관련 필드는 int 형으로 설정합니다.


쿼리 등 mysql 관련 내용은 깊게 가지 않습니다. ㅎ





3. 데이터베이스에서 시간을 읽어와서 표시하는 방법


마찬가지로 시간을 읽어오는 부분은 mysql 영역이라 패스~하고..


표시하는 부분에 관한 것은 php 함수, date()에 모두 있습니다.



요점인 즉, 시간정보를 int 형인 타임스탬프를 기준으로 처리하자..라는 것입니다.



타임 스탬프 값을 다루면서, 일주일 후, 일년 후 등등 시간 연산은 어떻게 할 수 있을까~요?


그것도 살펴보고 글 올리겠습니다.





 

 

 

 

 

 

 

 

 

 



Posted by 똑똑한 영장류




숫자를 표시할 때, 세자리마다 콤마(,)를 표시하고 싶을 때, 사용할 수 있는 함수입니다.



string number_format ( float $number [, int $decimals = 0 ] )


string number_format ( float $number , int $decimals = 0 , string $dec_point = '.' , string $thousands_sep = ',' )



두가지 프로토타입으로 소개를 하고 있습니다. 함수 인자로 1개가 들어가는 방식과, 2개가 들어가는 방식, 그리고 4개가 들어가는 방식이 있습니다.



$money = 1234567.89;


위 값을 자릿수 포맷팅을 한 문자열로 돌려받는 방법을 살펴봅시다.



$str = number_format($money);


$str은 1,234,567.89 로 표시됩니다.




$str = number_format($money,1);


$str은 1,234,567.9 로 소수자리 아래 1개까지 표시해줍니다. 반올림이 되네요.




$str = number_format($money,1,'#','$');


$str은 1$234$567#89

소수자리 표시를 . 대신에 # 로 표시하고, 천단위 표시를 , 대신에 $ 로 표시하는군요.




'웹 개발 > PHP' 카테고리의 다른 글

[PHP] array_push(), array_pop()  (0) 2013.01.23
[PHP] mkdir(), rmdir(), is_dir(), scandir(), filetype(), unlink()  (1) 2013.01.17
[PHP] number_format()  (0) 2012.12.24
[PHP] move_uploaded_file()  (0) 2012.12.21
[PHP] time(), date(), mktime()  (0) 2012.12.21
[PHP] htmlspecialchar()  (0) 2012.12.18


Posted by 똑똑한 영장류



bool move_uploaded_file ( string $filename , string $destination )


move_uploaded_file()은 서버로 전송된 파일을 저장할 때 사용하는 함수입니다.


파일업로드 전체를 살펴보는 것이 이해가 빠를거 같습니다.


2개의 파일로 구현을 해 봅시다.


이용자에게 파일을 선택하고 업로드를 할 수 있도록 하는 폼 페이지가 필요하고, 폼에서 전송한 내용을 서버측 저장공간에 저장하는 기능을 할 파일이 필요합니다.


upload.html


body 태그 안에 아래 코드를 작성합시다.



<form method="post" enctype="multipart/form-data" action="upload.php">

<input type="file" name="upload_file">

<input type="submit" value="업로드">

</form>

 


업로드할 파일을 선택하고 '업로드'버튼을 클릭하면, 서버쪽 upload.php에 그 내용이 전달되도록 작성되어있습니다.


upload.php는 어떤 작업을 수행하는지 살펴보겠습니다.


upload.php


<?php
$file_name = $_FILES['upload_file']['name'];
$tmp_file = $_FILES['upload_file']['tmp_name'];

$file_path = './files/'.$file_name;

$r = move_uploaded_file($tmp_file, $file_path);
?> 


upload.html 의 form 태그를 이용해서 전송된 파일은 $_FILES 를 통해 접근 가능합니다.


서버가 업로드받은 파일은 $_FILES['upload_file']['tmp_name']에 들어있습니다.

이게 저장될 위치를 $file_path 로 설정하고, move_uploaded_file()함수를 위의 예처럼 실행시키면, 지정 위치에 업로드한 파일이 저장됩니다.








'웹 개발 > PHP' 카테고리의 다른 글

[PHP] mkdir(), rmdir(), is_dir(), scandir(), filetype(), unlink()  (1) 2013.01.17
[PHP] number_format()  (0) 2012.12.24
[PHP] move_uploaded_file()  (0) 2012.12.21
[PHP] time(), date(), mktime()  (0) 2012.12.21
[PHP] htmlspecialchar()  (0) 2012.12.18
[PHP] nl2br()  (0) 2012.12.18


Posted by 똑똑한 영장류



time() 은 1970년 1월 1일 0시 0분 0초부터 지금까지 지나온 초를 정수형태로 리턴해주는 함수 입니다.


int time ( void )



<?php

$now_timestamp = time();

echo $now_titmestamp;

?>


결과는 아래와 유사하게 표시될 겁니다.


1356066385





date()는 time()으로 구해진 타임스탬프를 읽기 좋게 포맷팅해 주는 함수 입니다.


string date ( string $format [, int $timestamp = time() ] )



게시판 등에서 글 작성한 시각을 time()으로 구해서 DB에 저장하고, 이후 표시해줄 때, date()를 이용해서 적절히 포맷팅을 해서 보여주면 되겠습니다.



date("Y-m-d h:i:s",$data['reg_date'])


위 포맷으로 표시하면, 아래의 형태를 나타냅니다.


2012-12-21 02:06:25


아래 표는 포맷팅에 사용할 수 있는 문자에 관한 설명입니다.


formatcharacterDescriptionExample returned values
Day------
dDay of the month, 2 digits with leading zeros01 to 31
DA textual representation of a day, three lettersMon through Sun
jDay of the month without leading zeros1 to 31
l (lowercase 'L')A full textual representation of the day of the weekSunday through Saturday
NISO-8601 numeric representation of the day of the week (added in PHP 5.1.0)1 (for Monday) through 7 (for Sunday)
SEnglish ordinal suffix for the day of the month, 2 charactersst, nd, rd or th. Works well with j
wNumeric representation of the day of the week0 (for Sunday) through 6 (for Saturday)
zThe day of the year (starting from 0)0 through 365
Week------
WISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0)Example: 42 (the 42nd week in the year)
Month------
FA full textual representation of a month, such as January or MarchJanuary through December
mNumeric representation of a month, with leading zeros01 through 12
MA short textual representation of a month, three lettersJan through Dec
nNumeric representation of a month, without leading zeros1 through 12
tNumber of days in the given month28 through 31
Year------
LWhether it's a leap year1 if it is a leap year, 0 otherwise.
oISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. (added in PHP 5.1.0)Examples: 1999 or 2003
YA full numeric representation of a year, 4 digitsExamples: 1999 or 2003
yA two digit representation of a yearExamples: 99 or 03
Time------
aLowercase Ante meridiem and Post meridiemam or pm
AUppercase Ante meridiem and Post meridiemAM or PM
BSwatch Internet time000 through 999
g12-hour format of an hour without leading zeros1 through 12
G24-hour format of an hour without leading zeros0 through 23
h12-hour format of an hour with leading zeros01 through 12
H24-hour format of an hour with leading zeros00 through 23
iMinutes with leading zeros00 to 59
sSeconds, with leading zeros00 through 59
uMicroseconds (added in PHP 5.2.2). Note that date() will always generate 000000 since it takes an integer parameter, whereas DateTime::format() does support microseconds.Example: 654321
Timezone------
eTimezone identifier (added in PHP 5.1.0)Examples: UTC, GMT, Atlantic/Azores
I (capital i)Whether or not the date is in daylight saving time1 if Daylight Saving Time, 0 otherwise.
ODifference to Greenwich time (GMT) in hoursExample: +0200
PDifference to Greenwich time (GMT) with colon between hours and minutes (added in PHP 5.1.3)Example: +02:00
TTimezone abbreviationExamples: EST, MDT ...
ZTimezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive.-43200 through 50400
Full Date/Time------
cISO 8601 date (added in PHP 5)2004-02-12T15:19:21+00:00
r» RFC 2822 formatted dateExample: Thu, 21 Dec 2000 16:01:07 +0200
USeconds since the Unix Epoch (January 1 1970 00:00:00 GMT)See also time()






mktime()은 날짜정보를 입력해서 타임스탬프를 구할 수 있는 함수입니다.


int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )




시간, 분, 초, 월, 일, 년의 순서대로 입력해서 타임스탬프를 구할 수 있습니다.


<?php
            $t = mktime(21, 21, 21, 12, 21, 2012);
            echo $t;
 ?>


마야달력의 마지막 순간의 타임스탬프는 아래와 같네요. ^^;


1356092481





'웹 개발 > PHP' 카테고리의 다른 글

[PHP] number_format()  (0) 2012.12.24
[PHP] move_uploaded_file()  (0) 2012.12.21
[PHP] time(), date(), mktime()  (0) 2012.12.21
[PHP] htmlspecialchar()  (0) 2012.12.18
[PHP] nl2br()  (0) 2012.12.18
[PHP] ceil()  (0) 2012.12.18


Posted by 똑똑한 영장류
TAG date, mktime, php, Time


다루려는 문자열 내에 HTML 태그의 의미를 가지고 있는 문자들을, 오류가 생기지 않게 변환시키는 함수입니다.




string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )



  • '&' (ampersand) becomes '&amp;'
  • '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set.
  • "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set.
  • '<' (less than) becomes '&lt;'
  • '>' (greater than) becomes '&gt;'


&

 &amp

 

 "

 &quot

ENT_NOQUOTES 가
세트되어 있지 않을 경우


 '

 &apos

 &#039 

ENT_QUOTES 가
세트되어 있을 경우

 <

 &lt

 

 >

 &gt

 



두 번째 함수 인자인 flag 에 ENT_NOQUOTES 등을 세트할 수 있습니다.


자세한 플래그 내용은 php.net 에서 검색해 보세요.




'웹 개발 > PHP' 카테고리의 다른 글

[PHP] move_uploaded_file()  (0) 2012.12.21
[PHP] time(), date(), mktime()  (0) 2012.12.21
[PHP] htmlspecialchar()  (0) 2012.12.18
[PHP] nl2br()  (0) 2012.12.18
[PHP] ceil()  (0) 2012.12.18
[PHP] addslashes(), stripslashes() 그리고, get_magic_quotes_gpc()  (1) 2012.12.17


Posted by 똑똑한 영장류

[PHP] nl2br()

웹 개발/PHP 2012.12.18 13:04


문자열 내의 줄바꿈 기호(new line) 을 HTML 태그의 <BR />로 바꾸어주는 함수입니다.



string nl2br ( string $string [, bool $is_xhtml = true ] )




입력한 $string 내에 있는 \r, \r\n, \n\r 을 <br> 이나 <br /> 로 바꾸어서 리턴해줍니다.


$is_xhtml 이 false 이면, <br> 로 바꾸고, true이면 <br /> 로 바꿉니다.


게시판 같은거 만들 때, 입력받은 text 를 저장할 때는 문자열을 그냥 저장하면 되겠습니다. 보여줄 때만, 텍스트를 웹에서 보여줄 때, 줄 바꿈을 <br />로 처리해야하니까, 그럴 때 사용할 수 있습니다.


예를 들어볼께요..



<?php
$para = "line1\r\nline2";
echo $para.'<br />';
$para = nl2br($para);
echo $para.'<br />';
?>


이걸 브라우저로 확인합시다.


브라우저 화면에는 이렇게 보입니다.



소스를 들여다보면 아래와 같습니다.



\r\n 이 소스에는 적용되서 16라인에서 17라인으로 줄바꿈이 되어있습니다만, 브라우저는 <br> 이 아니니까, 화면에 줄바꿔서 보여주지 않습니다.


nl2br()을 이용해서 변환 후, 다시 찍어보면, <br />이 있으니까, 화면에도 줄바꿈이 됩니다.






'웹 개발 > PHP' 카테고리의 다른 글

[PHP] time(), date(), mktime()  (0) 2012.12.21
[PHP] htmlspecialchar()  (0) 2012.12.18
[PHP] nl2br()  (0) 2012.12.18
[PHP] ceil()  (0) 2012.12.18
[PHP] addslashes(), stripslashes() 그리고, get_magic_quotes_gpc()  (1) 2012.12.17
[PHP] isset(), unset()  (1) 2012.12.17


Posted by 똑똑한 영장류
TAG nl2br, php

[PHP] ceil()

웹 개발/PHP 2012.12.18 10:52


수학함수 중에 ceil() 입니다.



float ceil ( float $value )


float 을 입력으로 받아서 입력받은 값보다 큰, 가장 작은 정수를 리턴해줍니다.

쉽게 소수점 이하에서 반올림을 해 정수를 리턴해줍니다.


예를 드는게 더 이해하기가 쉽겠네요.


<?php
echo ceil(4.3);    // 5
echo ceil(9.999);  // 10
echo ceil(-3.14);  // -3
?>



4.3보다 큰 정수들은... 5,6,7,8... 등이죠. 이중에서 가장 작은 값인 5를 리턴합니다.


입력하는 값이 음수일 경우, 헤깔릴 수 있는데요..


-3.14를 봅시다. 이것보다 큰 정수는 -3, -2, -1, 0, 1..  등이죠.


이중에서 가장 작은 것은 -3입니다.


이해가 되시나요?




'웹 개발 > PHP' 카테고리의 다른 글

[PHP] htmlspecialchar()  (0) 2012.12.18
[PHP] nl2br()  (0) 2012.12.18
[PHP] ceil()  (0) 2012.12.18
[PHP] addslashes(), stripslashes() 그리고, get_magic_quotes_gpc()  (1) 2012.12.17
[PHP] isset(), unset()  (1) 2012.12.17
[PHP] session_start(), $_SESSION[]  (0) 2012.12.13


Posted by 똑똑한 영장류
TAG ceil, php


addslashes() 함수와 그와 반대되는 stripslashes() 함수


DB 작업을 하기 위해서 쿼리를 작성하게 되는데, 이때 DB 시스템은 작은따옴표 ' 와 큰따옴표 " 그리고 백슬래시 / 그리고, NULL byte 를 문자열을 구분하는 등의 기준으로 이용하게 됩니다. 그런데, 하나의 문자열 안에 따옴표가 들어가 있게되면, 예상치 못하게 오류가 발생하게 됩니다. 그래서, 문자열을 데이터베이스에 저장할 수 있는 포맷으로 변화시켜줄 필요가 있습니다.


예를 들면,


I'm a boy 를 문자열로 지정해서 'I'm a boy' 이렇게 쿼리로 전송되게 되면, I 뒤의 작은 따옴표 때문에 오류가 발생하게 됩니다.

그래서, 내부에 위치하게 될 따옴표들을 기준을 가지고 다르게 표현을 해 줘야합니다. 흔히들 이스케이프(escape) 시킨다...라고 표현하는데요.


I\'m a boy 로 바꾸어 주는 작업을 말합니다. 그 작업을 해주는 함수가 아래의 addslashes() 함수입니다.



string addslashes ( string $str )



그럼, DB에서 다시 꺼내왔을 때는 추가됐던 백슬래쉬를 제거를 해줘야 원래의 문자열이 되겠지요? 추가됐던 백슬래쉬를 제거해주는 함수가 아래의 stripslashes() 입니다.



string stripslashes ( string $str )




근데, 이 작업을 자동으로 해주도록 PHP 를 설정하는 방법이 있답니다.


그걸 magic_quotes_gpc 라고 합니다.


GET, POST, COOKIE 를 통해 넘어오는 값들에 대해서 자동으로 이스케이프 시켜주는 기능입니다.


PHP 의 설정값이라, 우리가 php 파일내에서 임의로 세팅을 해 줄 수는 없습니다. 서버 관리자가 PHP를 설치할 때, 혹은 이후 설정을 하게 됩니다.


그럼, 현재 저 매직 쿼트 지피시 가 설정되어 있는지를 알아내는 함수가 있겠지요?


bool get_magic_quotes_gpc ( void )



이 함수가 FALSE을 리턴하면, 설정이 되어있지 않다는 뜻입니다.


php.net 에 있는 예를 살펴보는 것이 좋을 거 같습니다.


<?php
// If magic quotes are enabled
echo $_POST['lastname'];             // O\'reilly
echo addslashes($_POST['lastname']); // O\\\'reilly

// Usage across all PHP versions
if (get_magic_quotes_gpc()) {
    
$lastname stripslashes($_POST['lastname']);
}
else {
    
$lastname $_POST['lastname'];
}

?>



사용자가 가입폼 에서 이름을 입력하고 POST 방식으로 Submit 되어온 내용을 받아서 처리하는 부분인 것 같습니다. lastname 항목에 O'reilly 라고 입력을 했다고 보입니다.


magic quotes 가 ON 되어있으면, POST 방식으로 전달되어 온 $_POST['lastname'] 값은 자동으로 이스케이프가 되어있습니다. O'reilly 가 이스케이프 되었으니, O\'reilly 가 되어있겠군요.


화면에 lastname을 출력하고자 할때, get_magic_quotes()를 통해 설정상태를 확인을 하고, 설정되어 있으면, 자동으로 \가 붙어 있을테니, stripslashes()를 하고 출력을 해야겠구요. 그렇지 않을 경우는 그냥 출력을 하면 되겠지요.



mysql 에서의 고려사항은 따로 살펴보겠습니다.


















'웹 개발 > PHP' 카테고리의 다른 글

[PHP] nl2br()  (0) 2012.12.18
[PHP] ceil()  (0) 2012.12.18
[PHP] addslashes(), stripslashes() 그리고, get_magic_quotes_gpc()  (1) 2012.12.17
[PHP] isset(), unset()  (1) 2012.12.17
[PHP] session_start(), $_SESSION[]  (0) 2012.12.13
[PHP] mysqli 의 쿼리 결과 다루기  (0) 2012.12.12


Posted by 똑똑한 영장류


isset() 함수



bool isset ( mixed $var [, mixed $... ] )



변수가 세트되어있으면서 NULL 이 아닌지를 체크하는 함수입니다.


변수가 존재하고 NULL 이 아닌 값을 가지고 있으면 TRUE를 리턴합니다.

그 외에는 FALSE를 리턴합니다.


unset()함수로 변수를 unset 시킨 후, isset()으로 확인하면, FALSE가 리턴되지요.


함수의 인자로 여러개의 변수를 줄 수 있는데, 이때는 모든 변수가 세트되어 있어야 TRUE를 리턴합니다.





unset() 함수




void unset ( mixed $var [, mixed $... ] )



변수를 파과합니다. 아예 존재하지 않도록 만듭니다.

'웹 개발 > PHP' 카테고리의 다른 글

[PHP] ceil()  (0) 2012.12.18
[PHP] addslashes(), stripslashes() 그리고, get_magic_quotes_gpc()  (1) 2012.12.17
[PHP] isset(), unset()  (1) 2012.12.17
[PHP] session_start(), $_SESSION[]  (0) 2012.12.13
[PHP] mysqli 의 쿼리 결과 다루기  (0) 2012.12.12
[PHP] header()  (0) 2012.12.12


Posted by 똑똑한 영장류
TAG isset, php, unset


지금까지 구현한, 아주 기초적인 내용만 포함하고 있는 소스입니다.


조금씩 더 뼈대를 세우고 살을 붙여갈 생각입니다.

앞으로도 자세하게 설명글을 올리지는 못 해도, 업그레이드 되는 내용들 포스팅하도록 하겠습니다.


이건 출발점일 뿐입니다. ^^;



기존소스는 삭제했습니다.


22번 글에 정리된 소스를 다시 올리겠습니다.




Posted by 똑똑한 영장류


회원가입 받고 로그인 기능을 구현해봤습니다만, 로그아웃 기능을 빼먹었네요..ㅋ


로그아웃은 세션에서 관련 정보를 지우는 것으로 구현가능합니다.


header.php 에 아래 내용을 작성합시다.


<div class="header">
            <a href="http://<?php echo $_SERVER['HTTP_HOST'];?>">홈</a> <a href="http://<?php echo $_SERVER['HTTP_HOST'];?>/bbs/write.php">게시판 글쓰기</a><br />
            로그인 상태:
            <?php if($_SESSION['is_logged']=='YES') {
                echo '로그인 되었습니다. ';
                echo '<a href="http://'.$_SERVER['HTTP_HOST'].'/member/logout.php">로그아웃</a>';
            }
                ?>
    </div><!-- .header -->


로그인 되어있으면, 로그아웃 링크를 표시하도록 했습니다.


클릭하면? logout.php가 세션을 지우면 되겠네요.

www/member 디렉토리에 작성합시다.


logout.php는 아래와 같습니다.

<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
?>
<?php
$_SESSION['is_logged'] = 'NO';
$_SESSION['user_id'] = '';
$_SESSION['member_idx'] = '';

session_unset($_SESSION['user_id']);
session_unset($_SESSION['member_idx']);

header('Location: '.$url['root'].'member/logout_done.php');
exit();

?> 


logout_done.php는 단순히 로그아웃 되었다고 표시해주는 내용이면 되겠네요.


logout_done.php 입니다.

<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
include $_SERVER['DOCUMENT_ROOT'].'/header.php';
?>
  로그아웃 되었습니다.<br />
<?php
    include $_SERVER['DOCUMENT_ROOT'].'/footer.php';
?> 




이상입니다. ^^;




Posted by 똑똑한 영장류


Chap 17.



view.php 에서 글을 삭제하는 버튼을 하나 만들어 주고 글 삭제를 해봅시다.


수정 버튼 다음에 아래처럼 삭제버튼을 추가합시다.


<?php
    if( $_SESSION['member_idx']==$data['member_idx']) {
        echo '<a href="http://'.$_SERVER['HTTP_HOST'].'/bbs/delete.php?doc_idx='.$doc_idx.'">삭제</a>';
    }
?>


그리고, delete.php 를 만듭시다.


전달받은 doc_idx를 이용해서 DB에서 해당 데이터를 지워버리고 완료페이지를 표시하도록 합시다.


쿼리가 달라집니다.


$q = "DELETE FROM ap_bbs WHERE doc_idx=$doc_idx";
$result = $mysqli->query($q);


전체 코드는 아래와 같습니다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
?>
<?php

$q = "DELETE FROM ap_bbs WHERE doc_idx=$doc_idx";
$result = $mysqli->query($q);

if ($result==false) {
    $_SESSION['delete_status'] = 'NO';
}
else {
    $_SESSION['delete_status'] = 'YES';
}

//$result->free();

$mysqli->close();
//var_dump($url);

header('Location: '.$url['root'].'bbs/delete_done.php');
exit();

?> 


delete_done.php 는 아래와 같습니다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
include $_SERVER['DOCUMENT_ROOT'].'/header.php';


$delete_status = $_SESSION['delete_status'];
if($delete_status=='YES') {
    $message = '글이 삭제되었습니다.';
}
else {
    $message = '삭제 실패했습니다.';
}
?>
        delete_done.php - 게시판 글 삭제 완료 페이지<br />
        <hr />
<?php
    echo $message;
?>
<?php
    include $_SERVER['DOCUMENT_ROOT'].'/footer.php';
?>
 



지금까지 가장 기초적인 게시판을 제작해봤습니다.


고려해야 할 부분들이 많이 빠져있습니다.

각자 필요에 따라 하나하나 수정해 나가면서, 좋은 공부 되시길 바랍니다.



이상!









Posted by 똑똑한 영장류


Chap 16.



수정은 글 보기 와 매우 유사합니다. 우선 글 내용을 가져와서 화면에 뿌려주는데, Form 태그로 뿌려주어 수정할 수 있도록 하면 됩니다.


view.php를 수정해야겠네요.


현재 사용자와 글을 작성자가 같을 경우, 아래 쪽에 수정으로 가는 링크를 달아줍시다.


<?php
    if( $_SESSION['member_idx']==$data['member_idx']) {
        echo '<a href="http://'.$_SERVER['HTTP_HOST'].'/bbs/modify.php?doc_idx='.$doc_idx.'">수정</a>';
    }

?>


그리고, modify.php 를 작성합시다.


write.php 와 유사하니까, 그대로 가져오고, 입력하는 부분에 문서 내용을 초기 값으로 노출시키면 되겠습니다. 그리고, modify_check.php에게 현재 글번호를 전달하기 위해 doc_idx  를 hidden으로 전송합니다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
include $_SERVER['DOCUMENT_ROOT'].'/header.php';
?>
<?php
if(isset($doc_idx)==false) {
    echo '글번호가 지정되지 않았습니다.';
    exit();
}

$q = "SELECT * FROM ap_bbs WHERE doc_idx = $doc_idx";
$result = $mysqli->query($q);
$data = $result->fetch_array();

?>
글수정하기<br />
<form name ="modify_form" method = "POST" action = "./modify_check.php">
<input type="hidden" name="doc_idx" value="<?php echo $doc_idx ?>">
<table>
    <tr>
        <td>
    제목
    </td>
    <td>
            <input type ="text" name = "subject" size ="90" value="<?php echo $data['subject'];?>">
    </td>
    </tr>
    <tr>
        <td>
            내용
    </td>
    <td>
            <textarea name="content" cols="100" rows="10" ><?php echo $data['content'];?></textarea>
    </td>
    </tr>
</table>

<div>
    <input type = "submit" value = "저장">
</div>
   

</form>

<div>
    <?php
    echo '<a href="http://'.$_SERVER['HTTP_HOST'].'/bbs/list.php" class="btn" >목록</a>';
    ?>
</div>



<?php
    include $_SERVER['DOCUMENT_ROOT'].'/footer.php';
?> 


그리고,  submit 버튼이 클릭되면 받아서 처리할 modify_check.php를 만들어 줍시다.


modify_check.php 가 하는 일은 write_check.php와 유사합니다만, DB에 저장을 하는 것이 아니라, 기존 정보를 업데이트를 해야합니다. 쿼리가 달라지지요.

INSERT 가 아니라, UPDATE 문을 사용해야 합니다.


아래와 같습니다.


$q = "UPDATE ap_bbs SET subject='$subject',content='$content' WHERE doc_idx=$doc_idx";
$result = $mysqli->query($q); 



modify_check.php는 아래와 같습니다.


<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
?>
<?php

$q = "UPDATE ap_bbs SET subject='$subject',content='$content' WHERE doc_idx=$doc_idx";
$result = $mysqli->query($q);

if ($result==false) {
    $_SESSION['modify_status'] = 'NO';
}
else {
    $_SESSION['modify_status'] = 'YES';
}

//$result->free();

$mysqli->close();
//var_dump($url);

header('Location: '.$url['root'].'bbs/modify_done.php');
exit();

?> 


write_done.php 처럼 modify_done.php 를 작성해서 수정 후 결과 페이지를 만들어 줍니다. 내용을 거의 같습니다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
include $_SERVER['DOCUMENT_ROOT'].'/header.php';


$modify_status = $_SESSION['modify_status'];
if($modify_status=='YES') {
    $message = '글이 수정되었습니다.';
}
else {
    $message = '수정 실패했습니다.';
}
?>
        modify_done.php - 게시판 글 수정 완료 페이지<br />
        <hr />
<?php
    echo $message;
?>
<?php
    include $_SERVER['DOCUMENT_ROOT'].'/footer.php';
?>
 



여기까지 글 수정에 관한 내용이었습니다.


이상!








Posted by 똑똑한 영장류


Chap 14.



리스트 화면의 아래 쪽에 각각의 페이지로 이동할 수 있는 링크를 만들어 보겠습니다.


페이지 표시하는 구간을 블럭이라고 이름하고, 현재 표시하고 있는 페이지를 포함하는 블럭 내의 페이지를 링크로 제공하도록 하겠습니다.


블럭은 10 개 단위로 끊겠습니다.

1페이지~10페이지가 블럭 1, 11페이지~20페이지가 블럭 2..이런 식입니다.


현재 3페이지를 표시하고 있으면, 아래와 같이 표시한다는 말입니다.


[1] [2] 3 [4] [5] [6] [7] [8] [9] [10] [다음]


현재 페이지가 속해 있는 블록 번호는 아래와 같이 구할 수 있습니다.


$page_per_block = 10;

$now_block = ceil($now_page / $page_per_block);



전체 게시물의 숫자와 페이지당 표시할 글의 수를 이용해서 전체 페이지 수를 구해낼 수 있습니다.


$total_page = ceil($total_record / $record_per_page);


전체 페이지수를 구했으니, 블럭 당 페이지 수를 이용해서 전체 블럭 수를 구할 수 있습니다.


$total_block = ceil($total_page / $page_per_block);


부트스트랩의 pagination 관련 CSS를 이용해서 아래와 같이 작성할 수 있습니다.


<div class="pagination">
    <ul>
<?php
$total_page = ceil($total_record / $record_per_page);
$total_block = ceil($total_page / $page_per_block);

if(1<$now_block ) {
  $pre_page = ($now_block-1)*$page_per_block;
  echo '<a href="http://'.$_SERVER['HTTP_HOST'].'/bbs/list.php?page='.$pre_page.'">이전</a>';

}

$start_page = ($now_block-1)*$page_per_block+1;
$end_page = $now_block*$page_per_block;
if($end_page>$total_page) {
  $end_page = $total_page;
}

?>
   
<?php for($i=$start_page;$i<=$end_page;$i++) :?>
    <li><a href="./list.php?id=<?php echo $id ?>&page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
<?php endfor?>
</ul>
<?php
if($now_block < $total_block) {
  $post_page = ($now_block)*$page_per_block+1;
  echo '<a href="http://'.$_SERVER['HTTP_HOST'].'/bbs/list.php?page='.$post_page.'">다음</a>';
}

?>
</div><!-- .pagination --> 




아래쪽에 페이지 표시가 되었습니다.

2페이지를 눌러볼까요?






2페이지에 글이 하나 보이는군요.


글목록 표시가 잘 되는군요.


이제 제목을 클릭했을 때, 글 내용을 보여주는 기능을 추가해보겠습니다.


우선 list.php 에서 제목 표시 부분에 링크를 걸어줘야겠군요.

클릭하면, 글의 id를 가지고 가서 글내용을 가져와 뿌려주는 view.php가 실행되도록 해야겠습니다.


글목록을 뿌려주는 부분에 제목 부분이 아래와 같이 수정됩니다.


<td><a href="http://<?php echo $_SERVER['HTTP_HOST'];?>/bbs/view.php?doc_idx=<?php echo $data['doc_idx']; ?>" ><?php echo $data['subject']?></a></td>


list.php는 이정도로 하고, 이어서, view.php를 작성해 보겠습니다.


이상!















Posted by 똑똑한 영장류


Chap. 13


이어서 목록 보여주기 위한 기능을 구현해 봅시다.


http://mydomain.com/bbs/list.php 로 접근하면 글 목록을 보여줘야겠군요.

한번에 다 못 보여주면 페이지를 지정해줘야겠지요?

GET 방식으로 아래와 같이 페이지를 지정할 수 있도록 합시다.


http://mydomain.com/bbs/list.php?page=1


아래코드로 list.php 를 시작합시다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
include $_SERVER['DOCUMENT_ROOT'].'/header.php';
?>
        목록<br />
       
<?php
    include $_SERVER['DOCUMENT_ROOT'].'/footer.php';
?> 




이렇게 시작합니다.



$q = "SELECT * FROM ap_bbs";
$result = $mysqli->query( $q);
$total_record = $result->num_rows;


우선 ap_bbs 에 글이 있는지 없는지 부터 확인을 합니다.

$total_record 가 0이 아니면, 테이블을 이용해서 목록을 표시하고 아니면, 글이 없다고 표시합니다.


php 변수를 체크해서 html로 화면에 뿌려야합니다. php와 html이 섞이게 됩니다.

이때 if 문을 효율적으로 사용할 수 있는 방법은 아래와 같습니다.


<?php if($total_record==0) :?>
    글이 없습니다.
<?php else :?>
              
<?php endif?>



php 문법에서 if 뒤에 따라오는 { } 들을 위 방식으로 대체해서 손쉽게 html 코드와 섞어 쓸 수 있습니다.


목록<br /> 아래에 위 코드를 기록합시다.


else 안을 작성해 봅시다.

뭔가 표시를 할 것이 있으니까, 제대로 값을 가져와야겠지요.


글목록을 표시할 때, 한 페이지에 몇개를 표시할지, 현재 몇번째 페이지를 표시할지를 알아야겠지요?


if( isset($page) ) {
    $now_page = $page;
}
else {
    $now_page = 1;
}


한 페이지에 표시할 글 수를 5개로 설정합시다.


$record_per_page = 5;


한페이지에 표시할 글 수와 현재 페이지를 아니까, 쿼리에서 가져올 글의 위치와 갯수를 설정해 줍시다.



$start_record = $record_per_page*($now_page-1);
$record_to_get = $record_per_page;

if( $start_record+$record_to_get > $total_record) {
  $record_to_get = $total_record - $start_record;
}

$q = "SELECT * FROM ap_bbs WHERE 1 ORDER BY doc_idx DESC LIMIT $start_record, $record_to_get";
$result = $mysqli->query($q);


테이블 안에 데이터들이 쭈욱~ 있는데, 원하는 페이지의 글들만 가져오려면, 몇번 데이터부터 몇개를 가져와야하는지를 계산하고, 쿼리에 적용을 한 내용입니다.


$result 안에 있는 데이터들을 하나씩 fetch 해서 화면에 뿌려주면 되겠습니다.


<table class="table">
    <thead>
        <th>글번호</th>
        <th>제목</th>
        <th>작성자 인덱스</th>
        <th>등록일시</th>
    </thead>
<?php while($data = $result->fetch_array()) :?>
    <tr>
        <td><?php echo $data['doc_idx']?></td>
        <td><?php echo $data['subject']?></td>
        <td><?php echo $data['member_idx']?></td>
        <td><?php echo $data['reg_date']?></td>
    </tr>
   
<?php endwhile ?>
</table>


table 태그에 클래스를 table 로 설정해줬습니다. 이 클래스는 부트스트랩에서 제공합니다.


이제 list.php에 접속해 봅시다.




위 처럼 보입니다.


위에 header 부분이 이전과 바뀌었죠?

'홈'은 index.php 로, '게시판 글쓰기'는 write.php로 가는 링크입니다. 뒤에 보이는 숫자는 로그인한 사용자의 member_idx 를 나타냅니다.


더 수정할 내용들은 다음 편에 계속하겠습니다.


이상!










Posted by 똑똑한 영장류


Chap 12.



어제 작성해놓은게 다 날아가버렸네요.


그래서, 다시 작성합니다.


www 디렉토리 아래에 bbs 라고 만들고 그 안에 관련 파일들을 작성하겠습니다.



그에 앞서, 이전에 작성했던 것 중에 몇가지 수정을 하겠습니다.


먼저 main.css

header, footer 에 테두리를 빨간색에서 회색(#C1C1C1)으로 변경합니다. content 는 #0FF 로 변경합니다. 빨간색이 너무 강렬해서 ㅋㅋ


그리고, header.php

css를 읽어오는 부분이 상대경로로 되어있으니, 범용 이용가능하게 수정을 합니다.


<link href="http://<?php echo $_SERVER['HTTP_HOST']; ?>/bootstrap/css/bootstrap.css" rel="stylesheet">
<link href="http://<?php echo $_SERVER['HTTP_HOST']; ?>/main.css" rel="stylesheet">



자..그럼..bbs 갑시다.

게시판의 내용을 저장할 테이블을 DB에 마련해둬야겠네요. 테이블 명은 ap_bbs 로 합시다.




간단히 위처럼 만들어두고, 먼저 글을 작성하기 위한 폼을 만들어봅시다.


로그인 폼에서 해 봤던 거랑 기본적 구조는 별 차이가 없습니다. form 태그로 입력폼 만들어 주고, 받아서 DB에 저장하면 되지요.


write.php 작성해 봅시다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
include $_SERVER['DOCUMENT_ROOT'].'/header.php';
?>
글쓰기<br />
<form name ="write_form" method = "POST" action = "./write_check.php">
<input type="hidden" name="member_idx" value="<?php echo $_SESSION['member_idx'] ?>">
<table>
    <tr>
        <td>
    제목
    </td>
    <td>
            <input type ="text" name = "subject" size ="90">
    </td>
    </tr>
    <tr>
        <td>
            내용
    </td>
    <td>
            <textarea name="content" cols="100" rows="10"></textarea>
    </td>
    </tr>
</table>

<div>
    <input type = "submit" value = "저장">
</div>
   

</form>
       
<?php
    include $_SERVER['DOCUMENT_ROOT'].'/footer.php';
?> 


쉽죠? login.php 와 유사합니다. 각 항목값의 name 잘 봐두세요. 저값을 받아서 DB에 저장하게 됩니다.


write_check.php 를 만듭시다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
?>
<?php

$reg_date = time();
$member_idx = $_SESSION['member_idx'];

$q = "INSERT INTO ap_bbs (member_idx, subject,content,reg_date) VALUES('$member_idx', '$subject', '$content', '$reg_date')";

$result = $mysqli->query($q);

if ($result==false) {
    $_SESSION['writing_status'] = 'NO';
}
else {
    $_SESSION['writing_status'] = 'YES';
}

$mysqli->close();

header('Location: '.$url['root'].'bbs/write_done.php');
exit();

?> 


글 등록시간을 구하기 위해 time() 함수를 이용했습니다. UNIX Timestamp 를 구해주는 함수입니다.


그리고, 글 작성자가 누구인지를 기록하기 위해, 세션에 저장된 member_idx 를 가져옵니다.

이 값은 login_check.php 에서 세션에 기록을 해두어야하는데요, 이전 작업에서 빠져있습니다.

login_check.php에서 암호확인이 성공한 부분에 아래 내용을 더 추가해줍시다.


$_SESSION['member_idx'] = $row['member_idx'];


전달받은 값들을 쿼리를 통해 DB에 저장을 하고, 저장이 성공하면, writing_status 에 'YES'를 , 그렇지 않으면, 'NO'를 기록해두고, write_done.php 로 리다이렉트를 합니다.


write_done.php에서는 이 세션값을 확인하고, 글저장 결과를 메세지로 뿌려주게 됩니다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
include $_SERVER['DOCUMENT_ROOT'].'/header.php';


$writing_status = $_SESSION['writing_status'];
if($writing_status=='YES') {
    $message = '글이 저장되었습니다.';
}
else {
    $message = '저장에 실패했습니다.';
}
?>
        write_done.php - 게시판 글 저장 완료 페이지<br />
        <hr />
<?php
    echo $message;
?>
<?php
    include $_SERVER['DOCUMENT_ROOT'].'/footer.php';
?>
 


여기까지가 게시판에 글 저장하는 write 관련 내용이었습니다.









Posted by 똑똑한 영장류


Chap 10.


앞에서는 눈에 보이지 않는 중복 코드들을 하나로 작성해 봤었습니다. 이번엔 브라우저의 화면에 표시되는 내용을 내용에 따라 구분해 봅시다.


대부분의 경우, 화면 상단에는 메뉴바를 포함해서 사이트 모든 페이지에서 나타나는 내용들이 위치하게 됩니다. 그렇지 않을 수도 있지만요..대개 그렇다구요..


화면 하단에는 작은 메뉴 혹은 저작권 표시 등 전 페이지에 걸쳐 유사한 내용을 표시하곤 하지요.


그리고, 그 사이에는 페이지마다 달라지는 컨텐츠가 나타납니다.


왼쪽에 메뉴바가 있을 수도 있고, 오른쪽에 있을 수도 있고..그런 부분은 일단 컨텐츠 영역에 집어넣읍시다.


그러면... 위에서부터 헤더 영역, 컨텐츠 영역, 푸터 영역으로 이름을 붙이겠습니다.





아시다시피, BODY 태그 안의 내용들이 화면에 출력됩니다.

그 내용들이 위 3가지로 나누어질 수 있다는 말입니다.


header.php, footer.php 를 만들어 놓고, 화면에 뭔가를 표시하는 파일에서 이 두개를 포함시키면 되겠습니다.


위 내용을 Chap 2. 에 나왔던 기본 템플릿 버전 1에 적용해 봅시다.




<!DOCTYPE HTML>
<HTML>
    <HEAD>
        <TITLE>기본 틀</TITLE>
        <meta charset="utf-8">
    </HEAD>
    <BODY>
    <div class="header">
            헤더영역
    </div>
    <div class="content">

            컨텐츠영역
    </div>
    <div class="footer">
            푸터영역
    </div>

    </BODY>
</HTML>
 



빨간 색으로 표시된 부분을 header.php로 저장하고, 파란 색으로 표시된 부분을 footer.php 로 저장합시다. 위치는 www 디렉토리입니다.


그러면, 이후 다른 파일에서는 아래와 같이 작성을 할 수 있습니다.



<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/preset.php';
include $_SERVER['DOCUMENT_ROOT'].'/header.php';
?>
            컨텐츠영역
<?php
    include $_SERVER['DOCUMENT_ROOT'].'/footer.php';
?> 


페이지별로 바뀌는 컨텐츠 내용은 위의 컨텐츠 영역에 작성하면 됩니다.



이전에 작성했던 파일들을 위 방식대로 모두 수정합시다.


그리고, 하나 더 수정할 내용이 있습니다.


로그인 후에, login_check.php엣  login_done.php 로 전환하기 위해 header()함수를 이용하는 부분에서 사이트 주소가 하드코딩 되어있는데, 이것을 임의의 주소에 모두 이용가능 하도록 수정합시다.

하드코딩은 안 좋아요~~ ㅎ


header("Location: http://mydomain.com/member/login_done.php");


이 부분입니다.


mydomain.com이 아니더라도 이용가능 하려면, $_SERVER[] 변수에서 현재 도메인 주소를 가져오면 됩니다.


$_SERVER['HTTP_HOST'] 는 호스트명을 얻을 수 있는 변수입니다. 우리의 예에서는 mydomain.com 을 가지고 있습니다.


그럼, 다음과 같이 URL 관련 배열 변수를 하나 만들고, 그 안에 값을 입력합시다.


$url = array();
$url['root'] = 'http://'.$_SERVER['HTTP_HOST'].'/';
header('Location: '.$url['root'].'member/login_done.php');


위 처럼 다시 작성할 수 있습니다.


$url[] 변수도 아무곳에서나 이용할 수 있게, preset.php 에 작성해두면 좋을 거 같군요.


테스트 결과는 아래와 같습니다. 로그인해서 login_done.php 까지 잘 가는군요.





여기까지 작업한 파일입니다.


config.php 는 생략입니다. ^^




이상!




www.zip












Posted by 똑똑한 영장류
TAG HTTP_HOST, php


Chap 9.


파일이 하나 둘 늘어가고 있습니다. 그러다 보니, 상단의 공통된 내용들이 보이네요.


BODY 태그 안의 내용은 페이지에따라 달라지겠지만, DB관련 코드나, 세션 관련 코드들이 중복되네요.


이 내용들을 하나의 파일로 만들어두고, 각 페이지에서 include() 계열 함수를 이용해서 포함시키도록 하겠습니다.


함수 설명은 PHP 카테고리에서 찾을 수 있습니다.


어디서 어디까지를 잘라낼까요?

일단 아래 정도 preset.php 로 만들어 둡시다.



<?php
session_start();

$p = array();
$path['root'] = $_SERVER['DOCUMENT_ROOT'].'/';

require_once ($path['root'].'config.php');

$mysqli = new mysqli($DB['host'], $DB['id'], $DB['pw'], $DB['db']);
if (mysqli_connect_error()) {
    exit('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
}

extract($_POST);
extract($_GET);

?>



모든 파일의 상단에 preset.php 를 포함하도록 코드를 작성해야겠네요.


require_once( 'preset.php' );


...라고 적어봤더니... 이런..파일 경로가 문제네요. 파일의 위치와는 무관하게 항상 preset.php 를 포함시킬 수 있으려면, 상대경로가 아닌 절대경로로 preset.php 파일의 위치를 지정해줘야겠습니다.


위에 보이는 config.php 의 경로도 위치에 따라서 문제가 될 수 있겠네요.


서버 환경변수를 이용해야겠습니다.


수퍼글로벌 변수 중에 $_SERVER[] 가 있습니다.


배열 첨자에 따라서 여러가지 값을 구할 수 있습니다. 지금 우리에게 필요한건 DOCUMENT_ROOT 입니다.


require_once($_SERVER['DOCUMENT_ROOT'].'/preset.php');


모든 작성하는 파일 상단에 위 코드를 삽입해서 www  디렉토리 아래에 있는 preset.php를 포함시키도록 합니다. preset.php 는 공통적으로 사용될 모든 코드를 넣어두면 되겠습니다.




하나하나 다 보여줄 수 없으니, 이제 압축해서 파일로 업로드를 하겠습니다.


이상!




www.zip










Posted by 똑똑한 영장류


수퍼 글로벌 변수 $_SESSION[] 을 사용하는 방법입니다.



$_SESSION[] 변수를 사용하기 전에 다음 함수를 반드시 실행시켜야합니다.


bool session_start ( void )


그래야, 이후,  $_SESSION[] 을 자유롭게 이용할 수 있습니다.


$_SESSION[] 는 배열이니까, 첨자를 이용해서 많은 정보를 다룰 수 있습니다.


$_SESSION['user_id'] = 'member1';


세션에 저장되어 있는 값을 지우고 싶을 때는 아래와 같이 unset() 함수를 이용할 수 있습니다.


unset( $_SESSION['user_id'] );


unset()은 세션 변수뿐아니라 다른 변수에도 모두 사용가능합니다. 노파심에...ㅎㅎ



그리고, 세션에 저장된 정보를 삭제하는 방법은 아래 몇가지 함수들이 있네요.



void session_unset ( void )

The session_unset() function frees all session variables currently registered.




bool session_unregister ( string $name )

session_unregister() unregisters the global variable named name from the current session.




bool session_destroy ( void )

session_destroy() destroys all of the data associated with the current session. It does not unset any of the global variables associated with the session, or unset the session cookie. To use the session variables again,session_start() has to be called.

In order to kill the session altogether, like to log the user out, the session id must also be unset. If a cookie is used to propagate the session id (default behavior), then the session cookie must be deleted. setcookie() may be used for that.




'웹 개발 > PHP' 카테고리의 다른 글

[PHP] addslashes(), stripslashes() 그리고, get_magic_quotes_gpc()  (1) 2012.12.17
[PHP] isset(), unset()  (1) 2012.12.17
[PHP] session_start(), $_SESSION[]  (0) 2012.12.13
[PHP] mysqli 의 쿼리 결과 다루기  (0) 2012.12.12
[PHP] header()  (0) 2012.12.12
[PHP] md5(), sha1()  (0) 2012.12.11


Posted by 똑똑한 영장류


Chap 8.



아이디와 암호를 이용해서 사용자 확인을 하는 것까지 해봤습니다.

제대로 로그인이 된 사용자라면, 사이트 곳곳을 누비는 동안, 로그인 사용자로서의 권한을 가질 수 있어야 겠지요. 그럴려면, 서버는 지속적으로 그 정보를 가지고 있을 필요가 있습니다.

페이지가 바뀔 때마다 로그인을 강제할 수 없으니까요.


그럼, 로그인 정보처럼, 서버가 계속 가지고 가야하는 정보들은 어떻게 관리하면 좋을까요?


사용자가 사이트에 접속을 하게 되면, 세션 아이디를 가지게 됩니다. 그 세션이란거는 접속이 되어있는 동안 유지되는 또 하나의 연결의 끈이라고 칩시다. 그럼, 그 세션에다가 필요한 정보들을 기록해놓고 각각의 페이지에서 땡겨 쓸 수 있으면 좋겠군요.


그럴 목적으로 준비된 전역 변수가 있습니다. 페이지 내에서의 전역변수가 아니라, 서버에 접속되어 있는 동안 계속 이용할 수 있는 전역변수입니다.


$_SESSION[]


배열입니다. 첨자를 이용해서 여러개의 값을 저장할 수 있습니다.


이 변수를 사용하기 위해서는 세션을 이용하겠다는 의미로 초기화 함수를 한번 실행시켜줘야합니다.


session_start();


이 함수는 작성하는 php  파일의 초기 부분에 항상 실행이 되도록 해줘야 합니다. 그래야 이후, $_SESSION 변수를 제대로 이용할 수 있습니다.


그럼, login_check.php 를 수정해 볼까요?


앞 부분에 session_start(); 를 입력해줍니다.


그리고, 암호를 확인하고 정상적으로 사용자라고 확인된 부분에서 $_SESSION[] 에다가 관련 정보를 기록해 둡시다.


$_SESSION['is_logged'] = 'YES';

$_SESSION['user_id'] = $user_id;



if( $row['pw'] == $encryped_pass ) {
        $_SESSION['is_logged'] = 'YES';
        $_SESSION['user_id'] = $user_id;
        header("Location: http://snspd.com/member/login_done.php");
        exit();
    }
    else {
        $_SESSION['is_logged'] = 'NO';
        $_SESSION['user_id'] = '';
        header("Location: http://snspd.com/member/login_done.php");
        exit();
    } 


암호가 정확하든지, 정확하지 않든지 모두 login_done.php 로 이동을 합니다. 하지만, 가지고 가는 정보는 다릅니다.


그럼, login_done.php 에서 세션값을 읽어서 그 결과에 맞는 내용을 출력해야겠네요.


login_done.php 의 가장 앞부분, <html>태그가 시작되기 전에 관련 작업을 해 줍시다. 그리고, BODY  태그 안에서 해당 메세지를 출력하도록 수정합시다.



<?php
session_start();
$is_logged = $_SESSION['is_logged'];
if($is_logged=='YES') {
    $user_id = $_SESSION['user_id'];
    $message = $user_id . ' 님, 로그인 했습니다.';
}
else {
    $message = '로그인이 실패했습니다.';
}

var_dump($_SESSION);

?>
<html>
    <head>
        <title>로그인 완료 페이지</title>
        <meta charset="utf-8" >
    </head>
    <body>
        login_done.php - 로그인 완료 페이지<br />
        <hr />
<?php
    echo $message;
?>
    </body>
</html> 




테스트 해보면, 아래는 틀린 암호를 입력했을 때,





아래는 맞는 암호를 입력했을 때입니다.





세션을 이용해서 로그인 정보를 유지시키는 방법을 살펴봤습니다.


이상!











Posted by 똑똑한 영장류


Chap 7.



이제까지 회원가입을 받는 기능은 최소한의 기능으로 구현해봤습니다.

그럼, 가입한 회원이 로그인해서 사이트를 이용할 수 있도록 로그인 기능을 구현해봅시다.


index.php 에 로그인 버튼을 만들어 줍시다.


<a href="./member/login.php">로그인</a>


회원가입 아래에 표시되도록 합니다.


그리고,

login.php 를 www/member에 만듭니다.


회원으로부터 아이디와 암호를 입력받아야 하니까, form 태그를 이용한 signup.php 와 유사하게 만들수 있겠네요.


<html>
    <head>
        <title>로그인 페이지</title>
        <meta charset="utf-8" >
    </head>
    <body>
        login.php - 로그인 페이지<br />
        <hr />

         <form name="login_form" method="post" action="./login_check.php" >
            아이디 : <input type="text" name="user_id" /><br />
            비밀번호 : <input type="password" name="user_pass" /><br />
            <input type="submit" value="로그인" />
        </form>   
       
    </body>
</html>
 


user_id 와 user_pass 를 입력받아 login_check.php 로 전달합니다.


login_check.php에서는 입력받은 값과 DB에 저장되어 있는 값을 비교해서 로그인을 허락할지 말지를 결정해야겠지요.


<?php
include_once ('../config.php');
$mysqli = new mysqli($DB['host'], $DB['id'], $DB['pw'], $DB['db']);
if (mysqli_connect_error()) {
    exit('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
}

extract($_POST);



우선 DB관련 설정값을 위해 config.php 를 포함시키고, DB와의 연결의 끈을 만듭니다.


그 다음엔, extract($_POST)로 POST 방식으로 전달된 값들을 뽑아내서 값으로 사용할 수 있게 준비시킵니다. $user_id 와 $user_pass 를 이용할 수 있습니다.


먼저 DB에서 $user_id 라는 회원이 있는지, 있으면 그 데이터를 뽑아와야겠지요?


$q = "SELECT * FROM ap_member WHERE id='$user_id'";
$result = $mysqli->query( $q);


SELECT 를 이용한 쿼리문입니다. ap_member 테이블에서 id 가 $user_id 와 같은 행을 가져오라는 겁니다.

그 결과는 $result 에 담겨있습니다.


if($result->num_rows==1) {
    //해당 ID 의 회원이 존재할 경우
    // 암호가 맞는지를 확인

    $encryped_pass = sha1($user_pass);
    $row = $result->fetch_array(MYSQLI_ASSOC);
    if( $row['pw'] == $encryped_pass ) {
        // 올바른 정보
        header("Location: http://mydomain.com/member/login_done.php");
        exit();
    }
    else {
        // 암호가 틀렸음
        echo 'wrong password';
    }

}
else {
    // 없거나, 비정상
   
}


결과값이 1개라면 DB에 해당 아이디의 정보가 있다는 말이니까, 이후 암호를 비교해서 같으면 정상적으로 로그인 시켜줍니다.

암호를 비교할 때는 입력받은 $user_pass 를 회원가입때 암호화했던 방법과 같은 방법, sha1()으로 암호화를 해서 DB에 있는 값과 비교를 해야합니다.


mysqli에 새로운 함수들이 나타났는데요, php 카테고리의 다음 글을 참고하시기 바랍니다.


mysqli <- 클릭해서 확인하기


올바른 값으로 로그인이 이루어지면, 이후 사이트 전체에서 로그인 상태를 유지를 할 수 있어야 합니다. 주로 session 을 이용하게 되는데요, 다음 편에서 더 알아보겠습니다.


이상!










Posted by 똑똑한 영장류

[PHP] header()

웹 개발/PHP 2012.12.12 18:03


php를 이용해서 HTTP Raw header 를 전송할 수 있는 함수입니다.



void header ( string $string [, bool $replace = true [, int $http_response_code ]] )



<?php
header
("HTTP/1.0 404 Not Found");
?>


<?php
header
("Location: http://www.example.com/"); /* Redirect browser */

/* Make sure that code below does not get executed when we redirect. */
exit;
?>


전송하는 파일을 다운로드받도록 하는 헤더 조작 방법입니다.


<?php
// We'll be outputting a PDF
header('Content-type: application/pdf');

// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// The PDF source is in original.pdf
readfile('original.pdf');
?> 


아래는 캐슁 컨트롤입니다.


<?php
header
("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?> 


모두 테스트 한번씩 해봐야겠군요..



'웹 개발 > PHP' 카테고리의 다른 글

[PHP] session_start(), $_SESSION[]  (0) 2012.12.13
[PHP] mysqli 의 쿼리 결과 다루기  (0) 2012.12.12
[PHP] header()  (0) 2012.12.12
[PHP] md5(), sha1()  (0) 2012.12.11
[PHP] mysqli 로 쿼리 날리기  (0) 2012.12.11
[PHP] mysqli 접속 및 접속 끊기  (0) 2012.12.11


Posted by 똑똑한 영장류


Chap 6.


php에서 사용자의 클릭없이 자동으로 다른 페이지로 전환하도록 하기 위해서는 header() 함수를 이용할 수 있습니다.




header("Location: http://mydomain.com/member/signup_done.php");

exit();


주의할 점은, header() 이전에  화면에 무언가를 출력해서는 안 됩니다. header()함수가 HTTP raw header를 전송하는 함수니까, 다른 무엇보다 우선되어야 하겠지요.



exit() 함수는 페이지 전환 후에, 이후 영향을 미치기 않게 하기 위해서 적어주는 편이 좋습니다.


위 내용을 signup_check.php 의 마지막 부분에 넣도록 하겠습니다.


그리고, www/member 디렉토리 안에 signup_done.php 파일을 만들어야겠군요.


'회원가입이 완료되었습니다'라고 표시하도록 만들어봅시다.



<html>
    <head>
        <title>회원가입 완료 페이지</title>
        <meta charset="utf-8" >
    </head>
    <body>
        signup_done.php - 회원가입 완료 페이지<br />
        <hr />

         회원가입이 완료되었습니다.
       
    </body>
</html>
 




index.php로부터 회원가입을 다시 한 번 테스트하고 DB도 살펴보세요.

제대로 잘 동작하나요? ^^


이상!






Posted by 똑똑한 영장류