'PHP'에 해당되는 글 5건

  1. 2015.10.05 <?php ?> 와 <? ?> 차이
  2. 2015.10.03 EC2의 웹서버에서 session 사용하는 방법
  3. 2015.05.07 [07] php 셋팅, mysql 연동, 계정 인증, Web 인증방식, cookie 이용 인증 및 logout
  4. 2015.05.07 [06] php 및 mysql 설치, 인증, SQL, get & post, http 헤더
  5. 2015.04.26 Linux WebServer Directory List 출력(with php)

<?php ?> 와 <? ?> 차이

|


출처 : http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_function&wr_id=412766&sca=&sfl=wr_subject%7C%7Cwr_content&stx=%3C%3Fphp+%BE%F8%C0%CC&sop=and


기본적으로 <?php ?>과<? ?>은 같다.

하지만 <? ?>으로는 되지 않는 경우가 있다.

이 경우엔 <?=$var?> 와 같이 변수를 간략하게 출력하는 것도 되지 않는다.


해결 방법

short_open_tag 옵션을 켜주면 된다.


# vi /etc/php.ini

    229 short_open_tag = On




'Language > PHP' 카테고리의 다른 글

Linux WebServer Directory List 출력(with php)  (0) 2015.04.26
And


EC2의 웹서버에서 session 사용하는 방법

|


Local의 VM 에선 잘 되는 session을 이용한 로그인이 AWS에만 올리면 안되는 증상이 발생했다.

구글링을 해보니 php.ini의 설정과 httpd 안의 php 설정이 부딪혀서 나타나는 증상인 듯하다.


$ sudo vi /etc/httpd/conf.d/php.conf

     32 #php_value session.save_path    "/var/lib/php/session"

$ sudo service httpd restart


맨 아래에 있는 session.save_path 설정을 주석처리 하니 된다.




And


[07] php 셋팅, mysql 연동, 계정 인증, Web 인증방식, cookie 이용 인증 및 logout

|


- 2015.03.17

 


1. php 연동


1) php.ini 파일 수정


# vi /etc/php.ini
    457 register_globals = On
    462 register_long_arrays = On


# service httpd restart


* register_globals : 전역변수 사용 가능 설정 - $id, $pw 등을 사용하기 위함

 

 


2) php 기본 사용법


<?
     $var = 0;     # 변수 선언 시 $ 를 붙이면 된다. type 지정 및 선언 필요 없음


?>    #  <-  이 안에 php 내용 삽입

 

 


3) 출력 확인


변수를 받아 출력 되는지 확인


# vi login_check.php
      1 <?
      2
      3   echo "id: $id";
      4   echo "<br>";
      5   echo "pw: $pw";
      6
      7 ?>


login.html 에서 확인 해보면 정상적으로 작동한다.

 

 


4) php변수


- 글로별 변수 : get, post 방식 상관 없이 처리 가능
- $_GET[] : get 방식으로 데이터가 전달 된 경우
- $_POST[] : post 방식으로 데이터가 전달 된 경우

 

 


[ 예제 ]


# vi login_check.php
      1 <?
      2
      3   echo "id: $id";
      4   echo "<br>";
      5   echo "pw: $pw";
      6
      7   echo "<br>";
      8   echo "<br>";
      9
     10   echo "id: $_GET[id]";
     11   echo "<br>";
     12   echo "pw: $_GET[pw]";
     13
     14   echo "<br>";
     15   echo "<br>";
     16
     17   echo "id: $_POST[id]";
     18   echo "<br>";
     19   echo "pw: $_POST[pw]";
     20
     21 ?>

 


- POST 방식


http://192.168.133.142/login_check.php 에서 전송하면 POST 결과 확인 가능

 


- GET 방식


현재 login.html 소스코드가 POST 방식이기 때문에 아래 url을 통해 확인 가능


http://192.168.133.142/login_check.php?id=asdf&pw=asdf

 


* Tip


php 는 컴파일이 없기 때문에 에러메세지가 따로 나오지 않는다.
눈으로 소스코드를 찾아보거나 명령어 방법으로 에러를 찾아야 한다.

 

 

 

 


2. php와 mysql


1) mysql 관련 library in php


- mysql_connect() : mysql server 접속
     server : localhost
     username : root
     password : xxxx


- mysql_select_db() : 사용할 DB 선택
     DB_name : test
     file descriptor : DB id - mysql_connect() 를 통해 반환됨


- mysql_query() : 쿼리 전송
     query : 실행할 쿼리


- mysql_fetch_array() : 쿼리 결과를 배열 형태로 반환
     result : 쿼리 실행 결과
     상수 : 배열의 형태
                    MYSQL_NUM         - 숫자로 가져옴
                    MYSQL_ASSOC     - field 값으로 가져옴
                    MYSQL_BOTH        - 둘 다로 가져옴

 


* 쿼리 실행 결과를 가져올 수 있는 또 다른 함수


- mysql_fetch_row()
- mysql_fetch_assoc()

 


ex)


# vi login_check.php
      1 <?
      2   $DB = mysql_connect( 'localhost', 'root', 'a' );
      3   mysql_select_db( 'test', $DB );
      4
      5 ?>


=>
# mysql -u root -p
mysql> use test;


까지 진행 된 상황.

 

 


[ 예제 ]


# vi login_check.php
      1 <?
      2   $DB = mysql_connect( 'localhost', 'root', 'a' );      # mysql Server 접속
      3   $ret = mysql_select_db( 'test', $DB );                # DB 접속
      4
      5   $sql = "select * from user";                          # query 실행
      6   $result = mysql_query( $sql );                        # 결과를 result에 저장
      7
      8   while( $row = mysql_fetch_array( $result, MYSQL_NUM ) ) {     # row에 NULL값이 들어갈 때까지 반복
      9     echo "num: $row[0] name: $row[1] id: $row[2] pw: $row[3]";  # 반복문 없다면 첫번째 열만 출력함
     10     echo "<br>";
     11   }
     12
     13 ?>

 

 

 


2) 인증 예제


id & pw 인증


# vi login_check.php
      1 <?
      2   $DB = mysql_connect( 'localhost', 'root', 'a' )                                   ;      # mysql Server 접속
      3   $ret = mysql_select_db( 'test', $DB );                                                      # DB 접속
      4
      5   $sql = "select * from user where id='$id' and pw=password('$pw')";       # query 실행
      6   $result = mysql_query( $sql );                                                                 # 결과를 result에 저장
      7
      8   #$row = mysql_fetch_array( $result, MYSQL_NUM );
      9
     10   $count = mysql_num_rows( $result );                                                     # result는 몇열인가?
     11   echo $count;                                                                                           # 조건 맞는 열의 개수 저장하여 출력
     12
     13 ?>


=> http://192.168.133.142/login_check.php?id=admin&pw=xxxx   확인 시 1 이 나온다. 이를 이용하여 아래처럼 꾸며보자.

 


# vi login_check.php
      1 <?
      2   $DB = mysql_connect( 'localhost', 'root', 'a' );                                            # mysql Server 접속
      3   $ret = mysql_select_db( 'test', $DB );                                                         # DB 접속
      4
      5   $sql = "select * from user where id='$id' and pw=password('$pw')";           # query 실행
      6   $result = mysql_query( $sql );                                                                     # 결과를 result에 저장
      7
      8   #$row = mysql_fetch_array( $result, MYSQL_NUM );
      9
     10   $count = mysql_num_rows( $result );                                                         # result는 몇열인가?
     11   if ( $count > 0 ) {
     12     header('location: http://192.168.133.142/login.html');
     13   }
     14   else {
     15     echo "authentication fail... ";
     16   }
     17
     18 ?>


=> 인증은 된다. but 일반적으론 tcp 세션이 끊기기 전까지 인증이 유지되어야 하는데 여기선 그렇지 못하다.

 

 

 


3. Web 인증 방식


1) TCP 통신


연결을 계속 유지시키지는 않음
세션을 맺고 페이지를 모두 받아오면 바로 세션을 끊는다.

 

 


2) cookie, session


인증된 사용자임을 알기 위해 서버가 제공해주는 것들

 


* php 내의 이미 선언 되어 있는 변수


$_COOKIE[]
$_SESSION[]

 

 


3) cookie 굽기


- setcookie()
     cookie name
     cookie value
     expire time
     path
     (option) domain
     (option) security

 


# vi login_check.php
      1 <?
      2   $DB = mysql_connect( 'localhost', 'root', 'a' );      # mysql Server 접속
      3   $ret = mysql_select_db( 'test', $DB );                # DB 접속
      4
      5   $sql = "select * from user where id='$id' and pw=password('$pw')";    # que        ry 실행
      6   $result = mysql_query( $sql );                # 결과를 result에 저장
      7
      8 #  $row = mysql_fetch_array( $result, MYSQL_NUM );
      9
     10   $count = mysql_num_rows( $result );           # result는 몇열인가?
     11   if ( $count > 0 ) {
     12     setcookie('cookie', $pw, 0, '/');           # cookie 굽기, 만료 시간 없음
     13   }
     14   header('location: http://192.168.133.142/login.php');
     15
     16 ?>

 


# vi login.html
      1 <?
      2   if( !$_COOKIE[cookie] ) {
      3 ?>
      4 <html>
      5 <head>
      6         <title> Log In </title>
      7 </head>
      8
      9 <body>
     10         <form method=POST action=login_check.php>
     11                 id <input type="text" name="id"><br>
     12                 pw <input type="password" name="pw"><br>
     13                 <input type="submit" value="Login">
     14         </form>
     15 </body>
     16 </html>
     17
     18
     19 <?
     20   }
     21   else {
     22     echo "already login...";
     23   }
     24 ?>


html 파일을 php로 바꿔준다.


# mv login.html login.php


# vi index.html
     17                                         <li> <a href="login.php">Log In</a> <        /li>

 

 


4) logout


아래와 같이 Logout 버튼을 만들 수 있다.


# vi login.php
     21   else {
     22     echo "already login...";
     23     echo "<br>";
     24     echo "<a href='logout.php'> Logout </a>";
     25   }

 


# vi logout.php
      1 <?
      2   setcookie( 'cookie', '', 0, '/');
      3   header('location: http://192.168.133.142/login.php');
      4 ?>


=> cookie의 value를 초기화해서 쓸모 없는 cookie로 바꿔버림.


 

 

And


[06] php 및 mysql 설치, 인증, SQL, get & post, http 헤더

|


- 2015.03.16

 


1. 실습 사전 준비


1) php 설치 여부 확인


# rpm -qa | grep php

 


2) php 설치


- php.i386
- php-devel.i386
- php-mysql.i386
- 나머지 필요 항목은 yum이 알아서 설치


# yum install -y php.i386 php-devel.i386 php-mysql.i386
# service httpd restart
# cd /var/www/html

 


3) php 설치 확인


php 테스트 코드
    # vi test.php
          1 <?
          2         phpinfo();
          3 ?>


http://ip/test.php 에서 페이지 제대로 작동하는지 확인

 


4) mysql 설치


- mysql-server.i386


# yum install -y mysql-server.i386
# service mysqld start
# mysqladmin -u root password [New_Password]

 


5) mysql 로그인


# mysql -u root -p
Enter Password:

 

 

 


2. 인증


- ID, Password
- 공인 인증서
- OTP (One Time Password)
- 금액 인증 방식 (AA)

 

 

 


3. SQL


SQL : Structured Query Language
- 구조화된 질의 언어
- 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위해 설계된 특수목적 프로그래밍 언어 (위키백과)

 


1) SQL 명령어 종류


DDL ( Data Definition Language) : 데이터 정의어, 데이터 변경 불가
   - CREATE : DB 나 Table 생성
   - DROP : DB 나 Table 삭제
   - ALTER : 속성 변경


DCL ( Data Control Language ) : 데이터 제어어
   - GRANT : 권한 부여
   - REVOKE : 권한 제거
   - BEGIN
   - COMMIT
   - ROLLBACK


DML ( Data Manipulation Language ) : 데이터 조작어
   - SELECT : 조회
   - UPDATE : 수정
   - DELETE : 삭제
   - INSERT : 입력

 

 


2) mysql 명령어 - DDL


- db와 table 목록 출력
mysql> show databases;
mysql> show tables;


- db 선택
mysql> use [db_name];


- table 정의
mysql> desc [table_name];


- table 생성 : 데이터를 정의
mysql> CREATE [table_name]( column1 type, column2 type, ... );


* varchar(SIZE) : 선택한 size 로 만들어짐. 대용량 일 시 속도 빠름
* text : size 자동 설정, 대용량 일 시 크기를 계산해야 하기 때문에 속도 느림


- table 삭제 : 테이블 안에 데이터가 남아 있으면 안됨.
mysql> DROP TABLE [table_name];

 

 


3) mysql 명령어 - DML


* SELECT : 조회


전체 목록 조회
mysql> Select [column_name], [column_name] ... FROM [table_name];


조건 목록 조회
mysql> Select [column_name], [column_name] ... FROM [table_name] WHERE [condition];

 


* INSERT : 입력


mysql> INSERT INTO [table_name] VALUES( colomn1, column2, .... )
mysql> INSERT INTO [table_name] ( [column1_name], [column2_name], ...) VALUES( [column1_data], [column2_data], ... );

 


* UPDATE : 수정


mysql> UPDATE [table_name] SET [column_name] = value, [column_name] = value, ...; (X)
    => 가능하지만 모든 행의 데이터가 바뀌기 때문에 조건 필수
mysql> UPDATE [table_name] SET [column_name] = value, [column_name] = value ... [WHERE condition];

 


* DELETE : 삭제


mysql> DELETE FROM [table_name]; (X)
   => table 전체 삭제
mysql> DELETE FROM [table_name] WHERE [condition]

 

 


[ 실습 ]


mysql> show databases;
mysql> use test;
mysql> CREATE TABLE user ( num int, name varchar(20), id text, pw text );
mysql> show tables;
mysql> desc user;
mysql> DROP TABLE user;
mysql> CREATE TABLE user ( num int, name varchar(20), id text, pw text );
mysql> INSERT INTO user VALUES( 0, 'admin', 'admin', password('1234') );
mysql> INSERT INTO user( num, id, pw ) VALUES(1, 'guest', '1234' );
mysql> SELECT * FROM user;
mysql> SELECT * FROM user WHERE num = 0;
mysql> SELECT * FROM user WHERE id = 'admin';
mysql> SELECT * FROM user WHERE id = "guest";
mysql> SELECT * FROM user WHERE num = 0 and id = 'admin';
mysql> SELECT * FROM user WHERE num = 0 or id = 'admin';
mysql> UPDATE user SET name='guest', pw=password('1234') WHERE num = 1;
mysql> INSERT INTO user VALUES( 2, 'asdf', 'asdf', password('1234') );
mysql> DELETE FROM user WHERE id = 'asdf';
mysql> quit

 

 

 


4. 페이지 작성


[ longin.html ]             [ login_check.php ]
 input : id, pw      ->               Auth
                                             <┘ 성공
                                             <┘ 실패


# pwd
/var/www/html


# vi login.html
      1 <html>
      2 <head>
      3         <title> Log In </title>
      4 </head>
      5
      6 <body>
      7         <form method=POST action=login_check.php>
      8                 id <input type="text" name="id"><br>
      9                 pw <input type="password" name="pw"><br>
     10                 <input type="submit" value="Login">
     11         </form>
     12 </body>
     13
     14 </html>

 


# vi index.html
     17                                         <li> <a href="login.html">Log In</a>         </li>

 

 


* Server side script : 서버에서 처리한 결과만 받아볼 수 있음
   - php, jsp


* Client side script : 내가 볼 수 있음
   - html, Ajax, JavaScript

 

 

 


5. GET, POST


1) http의 stack


http              -- Application Protocal
tcp               ┐
ip                 -- 전송
Ethernet      ┘

 


[ HTTP Header ]


- Start-line : POST, URL, HTTP/1.1
- header : 서버와의 원할한 통신 위한 정보
- 빈칸
- Message-Body : id=asdf&pw=asdf   ..... 


이렇게 Message-Body 에 값이 숨겨져서 인수가 전달 되는 것이 POST 방식이다.
반면, header의 url에 정보를 붙여 보내는 방식이 GET 방식이다.
하지만 헤더의 크기가 정해져 있고 url 창에 노출되기 때문에 상대적으로 보안에 취약하다.


ex)
http://gall.dcinside.com/board/list/?id=girl
protocol   -   URL  -    WebApplication - ? 로 URL과 변수 구분
(=> ? 앞에 index.php 가 숨겨져 있음)

 

 

 

And


Linux WebServer Directory List 출력(with php)

|


1. 제작 동기


java 수업의 강사님께서는 hfs라는 프로그램을 이용하여 WebFileServer를 구축하셔서 파일을 공유하셨다.

해당 프로그램의 모든 기능을 구현하기란 아직 내 실력으로 힘들겠지만

디렉터리 이동 및 개별파일 다운로드 기능 구현은 할만하다고 생각되어 도전해보았고 어느정도 구현하였다.



2. 구현 환경


리눅스 가상머신을 설치하여 Apache, php가 설치된 리눅스 웹서버에서 동작하는 환경을 구축하였다.

(내가 구축한 소스는 리눅스 웹서버에서만 동작한다.)


1) Apache 설정


기존 /var/www/html 에는 구동중인 웹서버가 있기 때문에 다른 공간이 필요했다.

그래서 선택한 것은 Apache에서 제공하는 UserDir 기능이다.

UserDir기능은 http://Serverip/~Username 의 경로에 각 사용자별 웹서버를 띄우는 기능이다.


# vi /etc/httpd/conf/httpd.com

    # 특정 사용자만 UserDir 사용하도록 설정

    366     UserDir disabled
    367     UserDir enabled username


    # 사용자 홈 디렉터리 밑에 사용할 Web Root Directory

    374     UserDir public_html


    # /home/*/public_html 에 적용되는 Apache세부 설정

    382 <Directory /home/*/public_html>

          ...

          # Options 에서 Indexes를 설정하면 내가 구현한 정도의 기능은 자동으로 구현된다.
    384     Options -Indexes

    # index.php가 아닌 숨김파일을 index page로 설정
    385     DirectoryIndex .....list.php

          ...

    # 다른 기타 설정은 개인의 취향에 맞게 설정
    394 </Directory>



httpd 재시작

# service httpd restart



2) 사용자 홈 디렉터리 설정


사용자 홈 디렉터리에 웹 루트 디렉터리 생성 및 외부에서 접근 가능하도록 권한 설정

# cd ~username

# mkdir public_html/

# chmod o+x public_html/



3) 개발 툴


Editplus를 사용하였으며, FTP 설정을 해주면 실시간으로 업로드하여 결과를 확인할 수 있다.

구지 FTP를 연동하여 실시간 업로드를 설정한 이유는 리눅스에 명령어를 입력하여 파싱해왔기 때문이다.




3. 구현 코드


문법적 오류가 다분한 영어로 주석을 달아놓았다.

(다운로드하여 리눅스 웹서버에 올려놓고 직접 확인하면서 보면 좋을것 같다.

.....list.php



<!--
 @ Copyright : Jiwoong Jung
 @ E-mail : kanziwoong@gmail.com
-->
<?php
 // For Index where title and body
 // 1. Execute "pwd" command and Get result to $pwdExecc
 // 2. Explode $pwdExecc with "/" and Save result to $curPathArr
 // 3. In Linux Server, web root directory is located in /home/$USERNAME/public_html/
 //    So conceal "/home/$USER/public_html" through rearrangement to $curPathArr.
 $curPathArr = explode("/", exec("pwd", $pwdExecc, $er));
 $curPath = "/";
 for ($i=0;$i<count($curPathArr)-4 ;$i++ ) {
    $curPath = "$curPath".$curPathArr[$i+4]."/";
  }
?>
<html>
 <head>
  <title>Index of <?php echo "$curPath"; ?></title>
  <!-- CSS from http://ftp.kaist.ac.kr/CentOS/ -->
  <style type="text/css">
   a, a:active {text-decoration: none; color: blue;}
   a:visited {color: #48468F;}
   a:hover, a:focus {text-decoration: underline; color: red;}
   body {background-color: #F5F5F5;}
   h2 {margin-bottom: 12px;}
   table {margin-left: 12px;}
   th, td {font: 90% monospace; text-align: left;}
   th {font-weight: bold; padding-right: 14px; padding-bottom: 3px;}
   td {padding-right: 14px;}
   td.s, th.s {text-align: right;}
   div.list {background-color: white; border-top: 1px solid #646464; border-bottom: 1px solid #646464; padding-top: 10px; padding-bottom: 14px;}
   div.foot {font: 90% monospace; color: #787878; padding-top: 4px;}
  </style>
 </head>

 <body>
  <h2>Index of <?php echo "$curPath"; ?></h2>
  <div class="list">
   <table summary="Directory Listing" cellpadding="0" cellspacing="0">
    <thead><tr><th class="n">Name</th><th class="m">Last Modified</th><th class="s">Size</th><th class="t">Type</th></tr></thead>
    <tbody>
<?php
 // If $cupPath != "/", print Parent Directory Link
 if ($curPath!="/"){
?>
     <tr>
      <td class="n"><a href="../">Parent Directory/</a></td>
      <td class="m"></td>
      <td class="s">-</td>
      <td class="t">Directory</td>
     </tr>
<?php
 }
?>
     <tr>
<?php

 // For save parameter for print table
 // 1. Execute "ls -l" command and Get result to $output
 exec("ls -l ./", $output, $error);
 // 2. Seperate $output per line to $val
  while(list($key, $val) = each($output)) {
 // 3. ls -l command prints "total Size", so except this.
   if ($key!=0) {
 // 4. Seperate $val by space and save this to $rst
    $rst = explode(" ", $val);
 // 5. Some $rst array has NULL value, so rearray to rstTrue
    $j=0;
    for ( $i=0 ; $i<count($rst) ; $i++)
    {
     if ($rst[$i]){
      $rstTrue[$j]=$rst[$i];
      $j++;
     }
    }
 // 6. Mark FILENAME, SIZE and DATE parameter
    $FILENAME = $rstTrue[8];
    $SIZE = $rstTrue[4];
    $DATE = "$rstTrue[5]"." $rstTrue[6]"." $rstTrue[7]";
 // 7. Mark Directory PROPERTY parameter
    if (substr($rstTrue[0], 1)=="d"){
     $PROPERTY = "Directory";
    }

 // 8. Mark Application PROPERTY parameter
    else if (substr($rstTrue[0], 4, 1)=="x" || substr($rstTrue[0], 7, 1)=="x" || substr($rstTrue[0], -1)=="x"){
     $PROPERTY = "application";
 // 9. Mark Additional Application PROPERTY parameter
     if (substr($rstTrue[0], -6)=="tar.gz")
      $PROPERTY = "$PROPERTY"."/tar.gz";
     }
 // 10. with else if, we can set more PROPERTY parameter
    else $PROPERTY = "text/plain";
?>
      <td class="n"><a href="./<?php echo "$FILENAME" ?>"><?php echo "$FILENAME" ?></a></td>
      <td class="m"><?php echo "$DATE" ?></td>
      <td class="s"><?php echo "$SIZE" ?></td>
      <td class="t"><?php echo "$PROPERTY" ?></td>
     </tr>
<?php
   
  }
 }
?>
    </tbody>
   </table>
  </div>
  <div class="foot">Copyright Jiwoong Jung</div>
 </body>
</html>




4. 단점 및 추가/개선해야할 점


가장 큰 단점은 .....list.php 파일을 생성되는 모든 디렉터리 안에 넣어줘야 한다는 것이다.

디렉터리가 생성 될 떄마다 위 파일을 넣어주는 것이 여간 귀찮은 일이 아닐 것이다.

또한 이 코드는 Linux환경에서만 유효하다.

나는 CentOS6.6 인데 다른 배포판, 혹은 다른 버젼은 안될 수도 있다.

하지만 리눅스 환경이라면 코드를 조금만 수정 하면바로 적용 가능할 것이다.


가능하다고 생각되어 지는 추가 기능으로는 버튼을 눌렀을 때 디렉터리 째로 압축되는 기능이다.

하지만 .....list.php의 존재 때문에 모든 하위디렉터리까지는 힘들것 같다.

혹 .....list.php를 모든 디렉터리에 넣어야 하는 단점이 극복된다면 하위디렉터리까지도 압축 가능하다.


개선해야할 점으론 디렉터리 링크 클릭 시에는 디렉터리간 이동이,

비 디렉터리 파일 클릭 시에는 파일 다운로드가 진행되어야 하는데 html, php 등의 파일이 업로드 되어있으면 다운로드가 되지 않는다.

<a> 태그에 download를 기입하면 다운로드 창이 뜬다고는 하는데 알 수 없는 이유로 구현 실패했다.

Directory가 아니면 download를 <a>태그에 추가하는 기능이었는데 구현 실패했다.




'Language > PHP' 카테고리의 다른 글

<?php ?> 와 <? ?> 차이  (0) 2015.10.05
And


prev | 1 | next