세션

값을 전달하지 않고 값을 계속 유지시켜주는 방식

*세션에 많은 정보를 저장하면 안된다.

 

세션 VS 쿠키

세션에 저장되는 정보는 서버쪽에 저장

쿠키는 브라우저에 저장 (해킹 쉬움)

 

a.php

<?
  session_start();

  $_SESSION["name"] = '학생';
  $_SESSION["passwd"] = '암호';

  $name=$_SESSION["name"];
  $passwd= $_SESSION["passwd"];

  echo(" name = $name <br>");
  echo(" passwd = $passwd <br>");

  echo("<a href='./b.php'>b.php</a>");
?>

 

b.php

<?
  session_start();

  $_SESSION["name"] = '학생';
  $_SESSION["passwd"] = '암호';

  $name=$_SESSION["name"];
  $passwd= $_SESSION["passwd"];

  echo(" name = $name <br>");
  echo(" passwd = $passwd <br>");

  echo("<a href='./b.php'>b.php</a>");
?>

a.php
b.php

php.ini에 'session.auto_start = 1'로 설정하면 session_start() 함수를 생략 할 수 있다.

$_SESSION["name"] 변수와 $_SESSION["passwd"] 변수에 세션 값을 저장한다. 

이들 변수는 session_destroy() 함수나 session_unset() 함수가 호출되기 전까지 계속 유지된다.

 

▶ 세션 관련 함수

• bool session_start ( void )

  - 세션을 시작한다.
  - 매개 변수 없이 쓰인다.
  - session.auto_start=1로 설정하면 함수를 자동으로 실행한 것과 동일하다.
  - $_SESSION 배열을 이용해서 세션 변수를 등록한다.

 

• bool session_destroy( void )
  - 세션을 종료한다.
  - 매개 변수 없이 쓰인다.
  - 이후 세션을 이용하려면 새로운 세션을 시작해야 한다.

 

• void session_unset ( void )
  - 세션 변수를 모두 초기화 한다.
  - 매개 변수와 반환 값이 모두 없다.
  - 세션자체를 없애는 것은 아니다.

 

• string session_id ( void )
  - 세션 ID를 반환한다.

 

세션을 이용한 인증 처리

실선 : 마우스 클릭 / 점선 : 자동으로

• 테이블 입출력 프로그램
  - st_vi.php : student 테이블 출력 프로그램
  - st_in.html : student 테이블 입력 폼
  - st_in.php : student 테이블 입력 프로그램
• 인증 정보(계정) 등록 프로그램
  - id.html : 계정 등록 폼
  - id.php : 계정 등록 프로그램
• 로긴 프로그램
  - check.html : 로긴 정보 입력 폼
  - check.php : 로긴 프로그램

 

세션을 이용한 인증 처리 실습

인증을 위해 미리 테이블을 생성한다.

오라클에 접속해서 생성한다.

SQL> CREATE TABLE id(
  2  id varchar2(10),
  3  passwd varchar2(32) CONSTRAINT id_nu_passwd NOT NULL,
  4  CONSTRAINT user_pk_id PRIMARY KEY (id)
  5  );

테이블이 생성되었습니다.

 

• 계정 등록 프로그램

 

id.html

<html><head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<title> 계정등록 </title>
</head>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<form name="id" action="id.php" method="POST">
<center>
<table border="0" width="250">
  <tr>
    <td width="50"><p align="center">ID</p></td>
    <td>&nbsp;&nbsp;<input type="text" name="id"></td>
  </tr>
  <tr>
    <td width="50"><p align="center">passwd</p></td>
    <td>&nbsp;&nbsp;<input type="password" name="passwd"></td>
  </tr>
  <tr>
    <td colspan="2">
      <p align="center"><input type="submit" name="확인" value="확인"></p>
    </td>
  </tr>
<table>
</form>
</body></html>

 

id.php

<?
  require('conn.php');

  $id = $_POST["id"];
  $passwd = $_POST["passwd"];

  $sql="insert into id (id, passwd)
        values ('$id', DBMS_CRYPTO.Hash(to_clob(to_char('$passwd')),2))";

  $result=oci_parse($conn,$sql);
  $re=@oci_execute($result); // 입력된 값을 테이블에 저장한다.

  oci_free_statement($result);
  oci_close($conn);

  if(!$re){
    echo(" <script>
            window.alert('계정 등록 장애입니다.');
            history.go(-1);
            </script>
          ");
      exit;
    } // st_vi.php를 호출할 때 $id나 $passwd는 세션변수에 등록되었음으로
  else // 전달할 필요가 없다.
      echo(" <meta http-equiv='Refresh' content = '0; URL=st_vi.php'>");
?>

 

• 로긴 프로그램
로긴 프로그램은 st_vi.php로부터 호출된다. st_vi.php의 [login] 버튼을 클릭하면 check.html을 호출하여 id와 패스워드를 입력 받는다. 

입력된 id와 패스워드는 POST방식으로 check.php에 전달된다.

 

check.html

<html><head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<title> login </title>
</head>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<form name="login" action="check.php" method="POST">
<center>
<table border="0" width="250">
  <tr>
    <td width="50"><p align="center">ID</p></td>
    <td>&nbsp;&nbsp;<input type="text" name="id"></td>
  </tr>
  <tr>
    <td width="50"><p align="center">passwd</p></td>
    <td>&nbsp;&nbsp;<input type="password" name="passwd"></td>
  </tr>
  <tr>
    <td colspan="2">
      <p align="center"><input type="submit" name="확인" value="확인"></p>
    </td>
  </tr>
<table>
</form>
</body></html>

 

check.php

<?
  session_start();
  require('conn.php');

  $id = $_POST["id"];
  $passwd = $_POST["passwd"];

  $sql="select * from id
        where id = '$id'
        and passwd = DBMS_CRYPTO.Hash(to_clob(to_char('$passwd')),2)";

  $result=oci_parse($conn,$sql);
  $re=oci_execute($result);
  $row_num=oci_fetch_all($result,$row);
  oci_free_statement($result);
  oci_close($conn);

  if($row_num == 1){
    $_SESSION["id"] = $id;
    $_SESSION["passwd"] = $passwd;
    echo(" <meta http-equiv='Refresh' content = '0; URL=st_vi.php'>");
  }
  else{
    echo(" <script>
            window.alert('잘못된 계정 정보입니다.');
            history.go(-1);
            </script>
        ");
    exit;
  }
?>

 

• 로그인이 안된 상태에서 접근 불가능

log.php

<?
session_start();

   if(empty($_GET["logout"]))
   {}
   else session_unset();

   $id = $_SESSION["id"];
   $passwd = $_SESSION["passwd"];

   require('conn.php');

   $sql="select * from id
      where id= '$id'
      and passwd = DBMS_CRYPTO.Hash(to_clob(to_char('$passwd')),2)";

   $result=oci_parse($conn,$sql);
   $re=oci_execute($result);
   $row_num=oci_fetch_all($result,$row);

   if($row_num == 1)
   {
   }
   else
   {
      echo(" <script>
         window.alert('로그인이 필요합니다');
         history.go(-1);
         </script>
         ");
      }
?>

 

st_in.html

<?
  require('log.php')  // login이 안되어 있으면 접근 불가능한 것을 추가
?>

<html><head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<title> student 입력폼 </title>
</head>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<form name="insert" action="st_in.php" method="POST">
<center>
<table border="0" width="250">
  <tr>
    <td width="50"><p align="center">학번</p></td>
    <td>&nbsp;&nbsp;<input type="text" name="sno"></td>
  </tr>
  <tr>
    <td width="50"><p align="center">이름</p></td>
    <td>&nbsp;&nbsp;<input type="text" name="sname"></td>
  </tr>
  <tr>
    <td width="50"><p align="center">성별</p></td>
    <td>&nbsp;&nbsp;남<input type="radio" name="sex" value="남">,
                    여<input type="radio" name="sex" value="여"></td>
  </tr>
  <tr>
    <td width="50"><p align="center">학과</p></td>
    <td>&nbsp;&nbsp;<select name="major" size="1">
                      <option value="화학">화학</option>
                      <option value="생물">생물</option>
                      <option value="물리">물리</option>
                      <option value="유공">유공</option>
                      <option value="식영">식영</option></td>
  </tr>
  <tr>
    <td width="50"><p align="center">학년</p></td>
    <td>&nbsp;&nbsp;1<input type="radio" name="syear" value="1">,
                    2<input type="radio" name="syear" value="2">,
                    3<input type="radio" name="syear" value="3">,
                    4<input type="radio" name="syear" value="4"></td>
  </tr>
  <tr>
    <td width="50"><p align="center">학점</p></td>
    <td>&nbsp;&nbsp;<input type="text" name="avr"></td>
    </tr>
  <tr>
    <td colspan="2">
      <p align="center"><input type="submit" name="확인" value="확인"></p>
    </td>
  </tr>
</table>
</form>
</body></html>

 

로그인이 안된 상태에서 자료 입력하기를 바로 들어가려면 접근이 불가능하다.

 

• 테이블 입출력 프로그램
st_vi.php를 제외한 st_in.html과 st_in.php는 이전 소스와 동일해서 생략한다. st_vi.php는 로그인 상태와 로그인되지 않은 상태에 따라 출력 내용이 달라진다.

로그인 상태인 경우 데이터를 입력 버튼을 보여주지만 로그인이 아닌 상태에서는 로그인과 등록 메시지만 보여준다.

 

st_vi.php

<?
  //==========================로그인========================================
  session_start();

  if(empty($_GET["logout"])){}
  else session_unset(); // session_distroy 사용과 비교한다.

  $id = $_SESSION["id"];
  $passwd = $_SESSION["passwd"];

  require('conn.php');

  $sql="select * from id
        where id = '$id'
        and passwd = DBMS_CRYPTO.Hash(to_clob(to_char('$passwd')),2)";

  $result=oci_parse($conn,$sql);

  $re=oci_execute($result);
  $row_num=oci_fetch_all($result,$row);

  if($row_num == 1){ // 로긴 상태
      echo("<a href=./st_in.html>자료 입력하기</a>
            <a href=./st_vi.php?logout=$row_num>logout</a><hr>
      ");
  }
  else{ // 비로긴 상태
      echo(" <a href=./id.html>계정등록</a>
            <a href=./check.html>login</a><hr>");
  }

  //==========================자료입력========================================
  //echo("<a href=./st_in.html>자료 입력하기</a><hr>");

  //require('conn.php');

  //==========================삭제기능========================================
  $del=$_GET[del];        // $del 변수가 null이 아니면 행을 삭제하는 else절이 실행된다.
  if (empty($del)){}
  else {
	  $sql="delete from student where sno='$del'";
	  $result=oci_parse($conn,$sql);
	  oci_execute($result);
	  oci_free_statement($result);
	  }

  //==========================검색기능=========================================

    $search = $_GET[search];
	if (empty($search)) {
	 	$sql="select sno,sname,sex,major,syear,to_char(avr,'0.00') avr
	 	     from student order by sno";
	 	$result=oci_parse($conn,$sql);
	 }
	else {
	 	$sql="select sno,sname,sex,major,syear,to_char(avr,'0.00') avr
	 	       from student
	 	       where sname like '%{$search}%' order by sno";
	 	$result=oci_parse($conn,$sql);
	 }
	 oci_execute($result);

  //==========================================================================


  $row_num=oci_fetch_all($result, $row);  // $row_num : 전제 행의 수
  //echo("Row의 개수는 $row_num 입니다.<br><hr>"); // 행은 컬럼명, 열은 행번호

  oci_free_statement($result);
  oci_close($conn);

   $scale=5;                           // 화면에 출력할 행의 개수
   $start = $_GET[start];
   if (empty($start)){$start=0;}    // 첫 화면은 0에서 시작, 배열의 키값은 0에서 시작

  echo("<table border='1'>");
  for($i=$start; $i<($start+$scale); $i++) {
   if ($i<$row_num){
     echo("
    	<tr>
    		<td width='50'><p align='center'>{$row['SNO'][$i]}</p></td>
    		<td width='80'><p align='center'>{$row['SNAME'][$i]}</p></td>
    		<td width='20'><p align='center'>{$row['SEX'][$i]}</p></td>
    		<td width='20'><p align='center'>{$row['SYEAR'][$i]}</p></td>
    		<td width='50'><p align='center'>{$row['MAJOR'][$i]}</p></td>
    		<td width='30'><p align='center'>{$row['AVR'][$i]}</p></td>
    		<td width='30'><a href=./st_vi.php?del={$row[SNO][$i]}>del</a></td>
    	</tr>
    	");
  	}
	}
  echo("</table><br>");


  $p=$start-$scale;     // 이전 화면의 시작 위치
  $n=$start+$scale;     // 다음 화면의 시작 위치

  if($p>=0)
    echo("<a href=./st_vi.php?start=$p&search=$search>[이전페이지]</a>&nbsp;&nbsp;");
  else
    echo("이전페이지&nbsp;&nbsp;");
  if($n<$row_num)
    echo("<a href=./st_vi.php?start=$n&search=$search>[다음페이지]</a>");
  else
    echo("다음페이지");

  //echo("<br>");
  //echo($search); // 확인하기 위해 search 변수 출력
  echo("<hr>");
  echo("$row_num 열이 검색됨<br><br>");
?>

<form name='search' method='get' action='st_vi.php'>
 검색창 &nbsp;<input type='text' name='search'>
		   <input type='submit' name='확인' value='확인'>
 </form>

실행결과

login 전

계정을 등록한다.

 

계정등록

계정을 등록하고 로그인을 클릭한다.

 

login

로그인이 된다.

 

login 후

로그인하면 자료 입력하기를 할 수 있다.

* AP 서버 설치 환경

호스트명 : ap
IP : 192.168.10.19
아파치 서버 경로 : /app/apache
아파치 : 2.2.34 (httpd-2.2.34.tar.gz)
PHP : 5.6.39 (php-5.6.39.tar.gz)
오라클 인스턴스 클라이언트 : 19.5.0.0.0

 

$ORACLE_BASE : /app/ora19c
$ORACLE_HOME : /app/ora19c/19c


* 설치 과정

step 1. 오라클 인스턴스 클라이언트 설치
step 2. Apache 설치
step 3. PHP 설치
step 4. Apache, PHP 설정
step 5. 서버 실행 후 연동 확인

 

[root@CentOS7-3 ~]# vi /etc/rc.d/rc.local
[root@CentOS7-3 ~]# /app/apache/bin/apachectl stop
[root@CentOS7-3 ~]#


이미 설치된 아파치를 삭제하고 시작한다.

[root@CentOS7-3 ~]# cd /app/apache
[root@CentOS7-3 apache]# ls
bin    cgi-bin  error   icons    lib   man     modules
build  conf     htdocs  include  logs  manual
[root@CentOS7-3 apache]# cd
[root@CentOS7-3 ~]# rm -rf /app/apache
[root@CentOS7-3 ~]# cd /app/apache
-bash: cd: /app/apache: 그런 파일이나 디렉터리가 없습니다

 

step 1. 오라클 인스턴스 클라이언트 설치

① 설치할 오라클 인스턴스 클라이언트는 오라클 한국어 사이트인 https://www.oracle.com/kr/index.ht
ml 에서 oracle-instantclient19.5-basic-19.5.0.0.0-1.x86_64.rpm 와 oracle-instantclient19.5-devel-
19.5.0.0.0-1.x86_64.rpm 두 개의 파일을 다운 받는다.

ftp서버에 있으므로 ftp로 다운 받을 것이다.

[root@CentOS7-3 ~]# ls
anaconda-ks.cfg                                         공개      사진
initial-setup-ks.cfg                                    다운로드  서식
oracle-instantclient19.5-basic-19.5.0.0.0-1.x86_64.rpm  문서      음악
oracle-instantclient19.5-devel-19.5.0.0.0-1.x86_64.rpm  바탕화면
pcre-8.45.tar.gz                                        비디오

 

② /usr/lib/oracle/19.5을 ORACLE_BASE 디렉토리로 설치된다.

[root@CentOS7-3 ~]# rpm -Uvh oracle-instantclient19.5-basic-19.5.0.0.0-1.x86_64.rpm
준비 중...                         ################################# [100%]
Updating / installing...
   1:oracle-instantclient19.5-basic-19################################# [100%]
[root@CentOS7-3 ~]# rpm -Uvh oracle-instantclient19.5-devel-19.5.0.0.0-1.x86_64.rpm
준비 중...                         ################################# [100%]
Updating / installing...
   1:oracle-instantclient19.5-devel-19################################# [100%]

 

③ sqlnet.ora 파일과 tnsnames.ora 파일을 생성한다.

[root@CentOS7-3 ~]# mkdir -p /usr/lib/oracle/network/admin/
[root@CentOS7-3 ~]# vi /usr/lib/oracle/network/admin/sqlnet.ora
[root@CentOS7-3 ~]# cat /usr/lib/oracle/network/admin/sqlnet.ora
NAMES.DIRECTORY_PATH= (TNSNAMES)

 

tnsnames.ora 파일을 수정한다.

[root@CentOS7-3 ~]# vi /usr/lib/oracle/network/admin/tnsnames.ora
[root@CentOS7-3 ~]# cat /usr/lib/oracle/network/admin/tnsnames.ora
oracle =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.11.135)(port = 1521))
      (CONNECT_DATA = (SID = DB19))
    )

ora =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.10.138)(port = 1521))
      (CONNECT_DATA = (SID = DB19))
    )

dal =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.10.11)(port = 1521))
      (CONNECT_DATA = (SID = DB19))
    )

 

step 2. Apache 설치

① httpd-2.X 소스파일을 /usr/local/에 다운받고 압축을 해제한다.

[root@CentOS7-3 ~]# cd /usr/local/
[root@CentOS7-3 local]# ls
apache2                games                include    pcre-8.45.tar.gz   share
apr-1.6.5.tar.gz       httpd-2.2.34         lib        php                src
apr-util-1.6.1.tar.gz  httpd-2.2.34.tar.gz  lib64      php-7.4.26         var
bin                    httpd-2.4.51         libexec    php-7.4.26.tar.gz
etc                    httpd-2.4.51.tar.gz  pcre-8.45  sbin
[root@CentOS7-3 local]# cd ./httpd-2.2.34

 

② configure → make → make install 순으로 컴파일 설치한다. 그 뒤에 여기부터 하기

[root@CentOS7-3 httpd-2.2.34]# ./configure --prefix=/app/apache --enable-rewrite --enable-so
[root@CentOS7-3 httpd-2.2.34]# make
[root@CentOS7-3 httpd-2.2.34]# make install

 

③ 아파치 서버를 실행하고 브라우저를 이용해서 접속 테스트를 진행한다.

[root@CentOS7-3 httpd-2.2.34]# /app/apache/bin/apachectl start
httpd: Could not reliably determine the server's fully qualified domain name, using fe80::da2f:8c5b:1b46:2ceb for ServerName

 

이런 경고 메시지가 뜨면 아래와 같이 /app/apache/conf/httpd.conf에 ServerName localhost를 추가한다.

[root@CentOS7-3 httpd-2.2.34]# vi /app/apache/conf/httpd.conf
...
ServerName localhost
...

 

아파치 서버를 다시 죽였다 살린다.

[root@CentOS7-3 httpd-2.2.34]# /app/apache/bin/apachectl stop
[root@CentOS7-3 httpd-2.2.34]# /app/apache/bin/apachectl start
[root@CentOS7-3 httpd-2.2.34]#

 

잘 실행되는 것을 확인할 수 있다.

 

step 3. PHP 설치

① PHP 설치전 컴파일을 위해 libxml 패키지 설치를 확인 후 설치한다.

[root@CentOS7-3 ~]# yum install -y libxml2*

 

이미 설치 되어있으므로 넘어간다.

[root@CentOS7-3 ~]# yum list libxml2*
Loaded plugins: fastestmirror, langpacks
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Loading mirror speeds from cached hostfile
 * base: ftp.jaist.ac.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp.iij.ad.jp
Installed Packages
libxml2.x86_64                         2.9.1-6.el7_9.6                  @updates
libxml2-devel.x86_64                   2.9.1-6.el7_9.6                  @updates
libxml2-python.x86_64                  2.9.1-6.el7_9.6                  @updates
libxml2-static.x86_64                  2.9.1-6.el7_9.6                  @updates
Available Packages
libxml2.i686                           2.9.1-6.el7_9.6                  updates
libxml2-devel.i686                     2.9.1-6.el7_9.6                  updates
libxml2-static.i686                    2.9.1-6.el7_9.6                  updates

 

② TNS_ADMIN, LD_LIBRARY_PATH와 같이 오라클 관련 경로 설정에 정의된 내용이 시스템에 존재하
는지 반드시 확인한다.

[root@CentOS7-3 local]# cd /usr/local/
[root@CentOS7-3 local]# tar xvfz php-5.6.39.tar.gz
[root@CentOS7-3 local]# cd php-5.6.39/
[root@CentOS7-3 local]# ./configure --with-apxs2=/app/apache/bin/apxs --with-oci8=instantclient,/usr/lib/oracle/19.5/client64/lib --enable-sigchild
[root@CentOS7-3 local]# make
[root@CentOS7-3 local]# make install
[root@CentOS7-3 php-5.6.39]# cp php.ini-development /usr/local/lib/php.ini
cp: overwrite `/usr/local/lib/php.ini'? y

 

step 4. Apache, PHP 설정

① /app/apache/conf/httpd.conf 파일의 내용을 수정한다. APO 서버 설정과 동일하다.

ServerName localhost // 추가 내용
.............
LoadModule php5_module modules/libphp5.so
AddType application/x-httpd-php .php .html .htm .inc // 추가 내용

 

② /usr/local/lib/php.ini 파일에 PHP 실행 환경을 설정한다. APO 서버 설정과 동일하다.

short_open_tag = On
default_charset = "UTF-8" (or "EUC-KR")
include_path=".:/usr/local/lib"
upload_tmp_dir = /tmp
date.timezone = Asia/Seoul
error_reporting = E_ALL & ~E_NOTICE

 

③ /app/apache/bin/apachectl를 열어서 다음의 내용을 추가한다.

[root@CentOS7-3 ~]# vi /app/apache/bin/apachectl
...
# oracle install
export TNS_ADMIN=/usr/lib/oracle/network/admin
export LD_LIBRARY_PATH=/usr/lib/oracle/19.5/client64/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

(또는 AMERICAN_AMERICA.KO16MSWIN949)

 

step 5. 서버 실행 후 연동 확인

① /app/apache/htdocs/index.html 파일을 다음과 같이 수정한다.

[root@CentOS7-3 ~]# vi /app/apache/htdocs/index.html
<?
 $server = "oracle";
 $user_name = "st";
 $password = "st";
 $conn=@oci_connect($user_name,$password,$server) or die('not connect:');
 echo("Oracle 19c \$conn : $conn<br>");
 $st=oci_server_version($conn);
 echo("$st<br>");
 phpinfo();
?>

 

웹페이지에서 확인한다.

 

Document Root 변경

/home/httpd/html/index.html

이때 vi /app/apache/conf/httpd.conf 에서 Document Root가 /home/httpd/html으로 되어있는지 확인한다.

 

vi /home/httpd/html/index.html

<html>
 <head>
   <title> st04 </title>
   <meta charset="UTF-8">
 </head>
 <body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
 <p>&nbsp;</p>
 <table border="1" align="center">
   <tr>
         <td width="100">
                 <p align="center">목록<br></p>
                                <p align="center"><a href="html">html</a><br></p>
                                <p align="center"><a href="python">python</a><br></p>
         </td>
    </tr>
 </table>
</html>
<br>
<?
 $server = "oracle";
 $user_name = "st";
 $password = "st";
 $conn=@oci_connect($user_name,$password,$server) or die('not connect:');
 echo("Oracle 19c \$conn : $conn<br>");
 $st=oci_server_version($conn);
 echo("$st<br>");
 phpinfo();
?>

아파치 설치

① 사전 작업 패키지 설치

# yum install -y gcc gcc-c++ cmake apr apr-util zlib-devel wget net-tools expat-devel

 

PCRE(Perl Compatible Regular Expressions)를 설치한다.

파일은 아래 경로에서 다운 로드 한다.
https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz/download

 

/usr/local 디렉토리에 파일을 복사한다.

 

# tar xvfz pcre-8.45.tar.gz

 

아래 명령을 통해 실행한다.

# cd pcre-8.45/

# ./configure --prefix=/usr/local
# make
# make install

 

 

② Apache 2.4와 관련 소스파일을 /usr/local/에 다운받는다.

# wget https://downloads.apache.org/httpd/httpd-2.4.51.tar.gz

# wget http://apache.tt.co.kr/apr/apr-1.6.5.tar.gz

# wget http://apache.tt.co.kr/apr/apr-util-1.6.1.tar.gz

 

 

③ 소스파일 압축을 푼다.
# tar xvfz apr-1.6.5.tar.gz
# tar xvfz apr-util-1.6.1.tar.gz
# tar xvfz httpd-2.4.51.tar.gz


# mv apr-1.6.5 ./httpd-2.4.51/srclib/apr
# mv apr-util-1.6.1 ./httpd-2.4.51/srclib/apr-util


④ 아파치를 설치한다.
# cd httpd-2.4.51
# ./configure --prefix=/app/apache --enable-rewrite --enable-so
# ./configure --with-included-apr --with-pcre=/usr/local/bin/pcre-config
# make
# make install


⑤ /app/apache/conf/httpd.conf 파일 편집한다.
# vi /app/apache/conf/httpd.conf
#ServerName www.example.com:80
ServerName localhost

 

⑥ 아파치서버를 실행한다.
# /app/apache/bin/apachectl start

 


PHP 설치

① 관련 패키지를 설치한다.
# yum install -y sqlite-devel libxml2* libpng-devel, libjpeg-devel


② PHP 7.X 소스파일을 /usr/local/에 다운받는다.
# wget https://www.php.net/distributions/php-7.4.26.tar.gz

 

③ 소스파일 압축을 풀고 설치한다.
# tar xvfz php-7.4.26.tar.gz
# cd php-7.4.26
# ./configure --with-apxs2=/app/apache/bin/apxs --enable-sigchild
# make
# make install
# cp php.ini-development /usr/local/lib/php.ini


④ Apache와 PHP 설정
# vi /app/apache/conf/httpd.conf
.............
LoadModule php7_module modules/libphp7.so

AddType application/x-httpd-php .php .php3 .php4 .php5 .html .htm .inc


.............
# vi /usr/local/lib/php.ini
short_open_tag = On

include_path = ".:/usr/local/lib"

upload_tmp_dir = /tmp

error_reporting = E_ALL & ~E_NOTICE


⑤ test page를 생성하고 아파치서버를 재실행한다.

이때 vi /app/apache/conf/httpd.conf 에서 Document Root가 /home/httpd/html으로 되어있는지 확인한다.


# vi /home/httpd/html/index.html


# /app/apache/bin/apachectl stop
# /app/apache/bin/apachectl start

 

192.168.10.133 으로 접속하면 아래와 같이 php가 뜨는 것을 확인할 수 있다.


web 페이지에 디렉토리 업로드하기

 

# vi /home/httpd/html/index.html

<html>
 <head>
   <title> st04 </title>
   <meta charset="UTF-8">
 </head>
 <body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
 <p>&nbsp;</p>
 <table border="1" align="center">
   <tr>
         <td width="100">
                 <p align="center">목록<br></p>
                 <p align="center"><a href="html">html</a><br></p>
                 <p align="center"><a href="python">python</a><br></p>
         </td>
    </tr>
 </table>
</html>
<br>
<?
phpinfo()
?>


재시작한다.
# /app/apache/bin/apachectl restart

 

디렉토리 업로드하기

업로드할 디렉토리는 일단 zip으로 압축한다.

먼저 업로드할 디렉토리가 있는 위치로 접속한다.

ftp 192.168.10.133 으로 접속한다.

업로드할 디렉토리를 put으로 올린다.

 

/home/webmaster에 파일이 업로드 된 것을 확인할 수 있다.

Document Root에 파일을 이동한다.

 

unzip을 통해 압축을 푼다.

 

압축이 풀린것을 확인한다.

 

192.168.10.133 에 접속하면 html이 있는 것을 확인할 수 있다.

 


samba 로 접속

 

samba 실습 2 - webmaster samba 실습

실습 < 실습 일지 > 1) 리눅스에 samba 설치 및 확인 2) webmaster 그룹 및 사용자 생성, samba 사용자 생성 3) 마운트 해제 및 링크디렉토리 연결 4) smb.conf 파일 수정 및 samba 서비스 실행 5) 링크 디렉토리.

lemonandgrapefruit.tistory.com

링크를 걸지 않고 진행할 것이다.

 

cat /etc/samba/smb.conf 에서 아래와 같이 추가

[st]
    comment = Test dir
    path = /home/httpd
    public = no
    writable = yes
    write list = st04
    create mask = 0777
    directory mask = 0777
    valid users = st04
    browseable = yes

 

그룹 소유자를 st04로 변경하고 그룹권한에 쓰기를 추가한다.

chgrp st04 /home/httpd

chmod g+w /home/httpd

 

 

 

samba 재시작

 

디렉토리 생성이 잘 되는 것을 확인할 수 있다.

▶ 폼 태그 구조

<form name="폼 이름" action="프로그램명" method="전달 방식"
[target="대상 윈도우"] [enctype="인코딩 형식"]>
입력 양식
......
</form>

 

▶ 데이터 전달 방식과 변수

GET 방식

: GET방식은 입력 값을 action에 지정한 URL에 첨가하여 전달하는 방식을 의미

(처리를 요청하기보다는 정보를 요청하는 용도)

 

예제 1. GET 예제 폼 파일

4-1.html

<html><head><title>GET 예제</title></head>

<form name="get_ex" action="4-1.php" method="get">
<p><input type="text" name="text"><input type="submit" name="확인" value="확인"></p>
</form>

</body></html>

4-1.php

<?
  $text = $_GET['text'];
  echo("전달된 값은 {$text}입니다.");
?>

 

GET 예제 파일

//a.php

<?
  $a = 1;
  echo("\$a = {$a}<br>
  <a href=./b.php?a=$a>b.php</a>");
?>


//b.php
<?
  $a = $_GET["a"];
  echo("\$a = {$a}");
?>

왼쪽 a.php / 오른쪽 b.php

 

POST 방식

예제 2. POST 예제 폼 파일

4-2.html

<html><head><title>POST 예제</title></head>
<form name="get_ex" action="4-2.php" method="post">
<p>텍스트 입력: <input type="text" name="text"><input type="submit" name="확인" value="확인"></p>
</form>
</body></html>

4-2.php

<?
  $text = $_POST['text'];
  echo("전달된 값은 {$text}입니다.");
?>

 

* register_globals
php.ini파일에 register_globals의 역할은 EGPCS(Environment, GET, POST, Cookie, Server)의 값들을
자동으로 PHP에 전역변수로 저장해주는 옵션이다. EGPCS에 의해서 전달된 값들은 각각 연관 배열인
$_ENV, $_GET, $_POST, $_COOKIE, $_SERVER에 저장된다. 이때 전달 킷값과 동일한 변수를 전역변
수로 만들어줄려면 register_globals를 On으로 지정하면 된다.


/usr/local/lib/php.ini 파일의 설정을 다음과 같이 수정하고 수행해 보자

 

register_globals = On

 

예제 3. GET, POST 변수를 전역변수로 전달하기위한 폼 파일

4-3.html

<html><head><title>전역변수로 전달</title></head>
<form name="get_ex" action="4-3.php?get=get" method="post">
<p><input type="text" name="post"><input type="submit" name="확인" value="확인"></p>
</form>
</body></html>

4-3.php

<?
  echo("get에 전달된 값은 {$get}입니다.<br>
  post에 전달된 값은 {$post}입니다.<br>
  \$_GET[get]에 전달된 값은 {$_GET['get']}입니다.<br>
  \$_POST[post]에 전달된 값은 {$_POST['post']}입니다.
  ");
?>

 

▶ 다양한 input type 폼 태그

* text와 password

<input type="text" || "password" name="전달 변수명" maxlength="입력크기"
size="창크기" value="미리 입력된 값">

예제 4. input type text와 password

4-4.html

<html><head><title>Input type text와 password</title></head>
<form name="tx_pw" action="4-4.php" method="post">
  이름 : <input type="text" name="id" size="8"><br>
  암호 : <input type="password" name="pw" size="8"><br>
  <input type="submit" name="확인" value="확인">
</form>
</body></html>

 

4-4.php

<?
  echo(" 이름은 {$_POST['id']}입니다.<br>
  암호는 {$_POST['pw']}입니다.");
?>

 

▶ input type radio

<input type="radio" name="전달 변수명" value="전달될 값" [checked]>

 

예제 5. input type radio

4-5.html

<html><head><title>Input type radio</title></head>

<form name="radio" action="4-5.php" method="post">
 1<input type="radio" name="rd" value="1" checked>,
 2<input type="radio" name="rd" value="2">,
 3<input type="radio" name="rd" value="3">,
 4<input type="radio" name="rd" value="4">,
 <input type="submit" name="확인" value="확인">
</form>
</body></html>

4-5.php

<?
  echo(" 선택한 값은 {$_POST['rd']}입니다.");
?>

 

▶ input type checkbox

<input type="checkbox" name="전달 변수명" value="전달될 값" [checked]>

 

예제 6. input type chechbox

4-6.html

<html><head><title>Input type chechbox</title></head>

<form name="chechbox" action="4-6.php" method="post">
  1<input type="checkbox" name="cb1" value="1" checked>,
  2<input type="checkbox" name="cb2" value="1">,
  3<input type="checkbox" name="cb3" value="1">,
  4<input type="checkbox" name="cb4" value="1">,
  <input type="submit" name="확인" value="확인">
</form>

</body></html>

4-6.php

<?
  echo(" cb1은 {$_POST['cb1']}입니다.<br>
        cb2은 {$_POST['cb2']}입니다.<br>
        cb3은 {$_POST['cb3']}입니다.<br>
        cb4은 {$_POST['cb4']}입니다.");
?>

 

 

▶ input type file

<form ... enctype="multipart/form-data">
 <input type="file" name="전달 변수명" enctype="multipart/form-data">

 

▶ TEXTAREA

<textarea name="전달 변수명" rows="행수" cols="너비">초기값</textarea>

 

예제 9. Input type file

4-9.html

<html><head><title>Textarea</title></head>

<form name="textarea" action="4-9.php" method="post">
  <textarea name="tarea" rows="2" cols="30"></textarea><br>
  <input type="submit" name="확인" value="확인">
</form>
</body></html>

4-9.php

<?
  $tarea = $_POST["tarea"];
  $tarea = nl2br($tarea);
  echo("$tarea");
?>

 

▶ SELECT

<select name="전달 변수명" size="행수" [mutiple]>
<option value="전달될 값">출력값</option>
......
</select)

 

 

예제 10. select 태그 폼 파일

4-10.html

<html><head><title>Select</title></head>

<form name="select" action="4-10.php" method="post">
  <select name="select" size="1">
    <option value="1">1번</option>
    <option value="2">2번</option>
    <option value="3">3번</option>
  </select>
  <input type="submit" name="확인" value="확인">
</form>

</body></html>

4-10.php

<?
  $select = $_POST["select"];
  echo("선택된 값은 {$select}입니다.");
?>

 

1. While문과 Do..While문

while (조건) {
	실행문;
}

- 조건이 참인 동안 실행문이 반복되어 실행된다.
- 반복을 벗어나기 위해서는 실행 문내에 조건을 변경하거나 break문이 필요하다.
- 조건에 변화가 없으면 무한 반복된다.
- 조건은 실행문이 반복될 때마다 반복해서 실행된다.

 

$a = 1; 		// 초기식
while ($a <= 10) { 	// 조건
echo(" {$a}<br> "); 	// 명령문
$a++; 			// 증감식
}

While뿐 아니라 do..while문이나 for문에서도 반복문의 네 가지 요소(초기식, 조건, 증감식, 명령문)는 항상 동
일하다.

 

2. For문 

for (초기식; 조건; 증감식) {
	실행문;
}

- 일반적으로 사용

- 조건이 참인 동안 실행문을 반복 실행한다.
- 초기식은 맨 처음 한 번만 실행된다.
- for문은 반복 횟수를 구체적으로 확인 가능함으로 반복문 중에 가장 가독성이 좋다.

 

잘못된 값 입력 시 사용하는 코드

if($num < 1 ) {
      echo("
           <script>
           window.alert('1보다 큰값을 입력하세요');
           history.go(-1);
           </script>
          ");
      exit;
   }

 

3. Continue 문

- Continue문은 반복문 내에서 쓰이는 제어문

- 이런 제어문으로는 앞에서 살펴본 break문이 있는데, break문은 반복문을 완전히 빠져나오는 기능을 수행하는 반면   continue문은 현재 수행중인 반복을 종료하고 다음 반복으로 건너뛰는 기능을 담당

<?
for($a = 1; $a <= 10; $a++) {
if($a%2==0) continue;
echo(" {$a}<br> ");
}
?>

<?
  $a = 1;
  while ($a <=10) {
	if($a%2==0){
	$a++;
	continue;
	}
	echo(" {$a}<br> ");
	$a++;
  }
  show_source(__FILE__);
?>

 

while, for문 실습

예제 3-1. 0 보다 큰 값을 입력받아 1에서 입력 값까지의 합을 출력한다.

3-1.html

<html>
<head>
<title>3-1.html 입력 폼파일</title>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
</head>
<form method="post" action="3-1.php">
	1보다 큰 값을 입력하세요 : <input type="text" name="num"><br>
		<input type="submit" name="확인" value="확인">
		<input type="reset" name="취소" value="취소"><br>
</form>
<hr>
<? show_source(__FILE__); ?>
</html>

 

while 문 3-1.php

<?
   $num = $_POST["num"];

   $sum = 0; // 누적 변수, 1..$num 까지 값을 누적한다.
   $a = 1 ; // 초기식
   if($num > 1) {
       while($a <= $num) { // 조건, $a가 $num보다 커지면 반복을 종료한다.
           $sum = $sum + $a;
           echo("\$a: {$a}, \$sum: {$sum}<br>");
           $a++; // 증감식
        }
        echo("<hr>");
        echo("1에서 {$num}까지의 합은 {$sum}입니다.");
     }
     else echo("입력 값이 올바르지 않습니다.");
     echo("<hr>");
     show_source(__FILE__);
?>

실행결과

 

예제 3-1 for문

3-1f.php 

<?
   $num = $_POST["num"];

   if($num < 1 ) {
      echo("
           <script>
           window.alert('1보다 큰값을 입력하세요');
           history.go(-1);
           </script>
          ");
      exit;
   }
   $sum = 0;
   for($a = 1; $a <= $num; $a++){
   $sum = $sum + $a;
   echo("\$a: {$a}, \$sum: {$sum}<br>");
   }
   echo("<hr>");
   echo("1에서 {$num}까지의 합은 {$sum}입니다.");
   echo("<hr>");
   show_source(__FILE__);
?>

실행결과

 

예제 3-2. 2~9 까지의 숫자를 입력받아 구구단을 출력하는 프로그램을 작성한다.

3-2f.html

<html>
<head>
<title>3-2f.html 구구단 폼파일</title>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
</head>
<form method="post" action="3-2f.php">
	출력하고자 하는 단을 입력 하세요 : <input type="text" name="gu"><br>
	<input type="submit" name="확인" value="확인">
	<input type="reset" name="취소" value="취소"><br>
</form>
</html>

 

3-2f.php

<?
	$gu = $_POST["gu"];
	if(!($gu >= 2 && $gu <= 9)) {
		echo("
		  <script>
		  window.alert('2에서 9사이에 값을 입력하세요');
		  history.go(-1);
		  </script>
		  ");
		  exit;
	}
	for($i = 1;$i <= 9;$i++){
		$s = $i * $gu;
		echo("{$gu}x{$i}={$s}<br>");
	}
?>

 

실습

실습 1. 0보다 큰 정수를 입력받아 입력받은 정수까지 홀수의 합과 짝수의 합을 각각 출력하는 프로그램을 작성한다.

* while문과 for문을 둘 다 사용해 작성 (두 번 출력하기)

3-ex01.html

<html>
<head>
<title>3-ex01.html 입력 폼파일</title>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
</head>
<form method="post" action="3-ex01.php">
	0보다 큰 값을 입력하세요 : <input type="text" name="num"><br>
		<input type="submit" name="확인" value="확인">
		<input type="reset" name="취소" value="취소"><br>
</form>
<hr>
<? show_source(__FILE__); ?>
</html>

 

3-ex01.php

<?
   $num = $_POST["num"];

   if($num < 0 ) {
      echo("
           <script>
           window.alert('0보다 큰값을 입력하세요');
           history.go(-1);
           </script>
          ");
      exit;
   }
   $sum_odd = 0;
   $sum_even = 0;
   $i=1;
   while($i <= $num) {
         if($i % 2 == 0){
            $sum_even += $i;
         }
         else {
            $sum_odd += $i;
         }
         echo("\$i: {$i}, \$sum_odd: {$sum_odd}, \$sum_even: {$sum_even}<br>");
         $i++;
   }
   echo("<hr>");
   echo("while문<br>");
   echo("0에서 {$num}까지 홀수합: {$sum_odd}, 짝수합: {$sum_even}");
   echo("<hr>");

   $sum_odd = 0;
   $sum_even = 0;
   for($a = 1; $a <= $num; $a++){
    if($a % 2 == 0){
      $sum_even += $a;
    }
    else{
      $sum_odd += $a;
    }
    echo("\$i: {$i}, \$sum_odd: {$sum_odd}, \$sum_even: {$sum_even}<br>");
   }
   echo("<hr>");
   echo("for문<br>");
   echo("0에서 {$num}까지 홀수합: {$sum_odd}, 짝수합: {$sum_even}");
   echo("<hr>");
   show_source(__FILE__);
?>

실행결과
실행결과 show_source(__FILE__)

 

실습2. 값을 입력받아 입력된 값이 소수인지 확인하는 프로그램을 작성한다.
* 소수란 : 약수가 1과 자신밖에 없는 수
* 소수 판별 방법
- 제수의 값을 2부터 시작해서 1씩 증가 하면서 피제수를 나눠서 나머지가 0이 될 때까지 수행한다.
- 나눠서 떨어졌을 때 제수와 피제수가 같으면 피제수는 소수이다.

 

pri.html

<html>
<head>
<title>pri.html 입력 폼파일</title>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
</head>
<form method="post" action="pri.php">
	3이상인 값을 입력하세요  <br>
  <input type="text" name="num">
	<input type="submit" name="확인" value="확인"><br>
</form>
<hr>
<? show_source(__FILE__); ?>
</html>

pri.php

<?
  $num = $_POST["num"];

  if($num < 3 ) {
        echo("
             <script>
             window.alert('3이상인 값을 입력하세요');
             history.go(-1);
             </script>
            ");
        exit;
     }

  for($i = 2; $num % $i != 0; $i++){
  }

  if($num == $i)
    echo("{$num}: 소수");
  else
    echo("{$num}: 합성수");
?>
<hr><p>
<? show_source(__FILE__); ?>

 

'PHP 공부 기록' 카테고리의 다른 글

(수정중) PHP 5 - 배열  (0) 2021.11.23
PHP 4 - 폼(Form)  (0) 2021.11.19
PHP 2 - 조건문 (IF, SWITCH)  (0) 2021.10.29
PHP 1 - 변수와 연산자  (0) 2021.10.22
PHP 0 - 프로그램 사용해보기  (0) 2021.10.22

HTML 먼저 공부하고 진행하기

HTML 파일 내에서 PHP 실행

 

예제 1

<html> 
<head> 
<title>0-1.html</title> 
<meta http-equiv="content-type" content="text/html; charset=euc-kr"> 
</head> 
<body>
<hr> 
<?
   $a = 1;
   $b = 2;
   $c = $a + $b;
   echo("두 수의 합은 {$c}입니다.");
?>
<hr> 
</body> 
</html>

페이지 소스코드

페이지 소스코드는 위와 같이 PHP 파서에서 변경된 것을 확인할 수 있다.

 

예제 2

<html> 
<head> 
<title>0-1.html</title> 
<meta http-equiv="content-type" content="text/html; charset=euc-kr"> 
</head> 
<body>
<?
   $a=1;
   $b=2;
   $c=$a+$b;
?>
<table border="1">
  <tr>
     <td align="center" width="140" height="10" colspan="2">
     <? echo("\$a=$a, \$b=$b"); ?> </td>
  </tr>
  <tr>
     <td width="120" height="10">두 수의 합은 </td>       
     <td width="20" height="10"><? echo("{$c}"); ?></td> 
  </tr>
</table> 
</body> 
</html>

예제 3

.html

<html> 
<head> 
<title>0-3.html 폼파일</title> 
<meta http-equiv="content-type" content="text/html; charset=euc-kr"> 
</head>

  <form method="post" action="0-3.php">
     입력 값 : <input type="text" name="in"><br>
        <input type="submit" name="확인" value="확인"> 
        <input type="reset" name="취소" value="취소"><br> 
  </form> 
</html>

.php

<?  
  $in = $_POST["in"];  
  echo(" 입력된 값은 {$in} 입니다. "); 
?>

+ Recent posts