일단 해보는 코딩/PHP

[PHP] 무슨 수업인지 기억이 안나는데...

eun_zoey2 2022. 6. 1. 14:48
728x90

$sid = $_GET[sid]; // 외부에서 sid 데이터를 입력받음
$id = array("201901", "201902", "201903", "201904", "202005");
$ph = array("111-1111", "222-2222", "333-3333", "444-4444", "555-5555"); 
// 원래는 데이터베이스 등에 저장되어져 있어야 하지만 소수이기 때문에 개별적으로 데이터를 배열로 생성해서 저장 
각각 $id와 $ph가 1:1 Mapping된다. <- 전체 5개의 요소이고 [0]~[4] 요소를 지정할 수 있다.
echo "찾는 사람의 학번 : $sid<br>";
for ($i = 0; $i < count($id); $i++) { 
// for(범위의_시작;범위의_끝;시작에서_끝으로 이르는_증가) // ++은 전체가 5이면 시작부터 하나씩 증가해서 끝에 이름 =>for (i=1; i<= 10; i++)라면 i는 1부터 시작해서 하나씩 늘어서 최종적으로 10에 이른다.)
 echo "그 학생의 전화번호: $ph[$i]";
 break; // 네가 찾는 학생이 있다면 나머지를 보지말고 코드블럭 밖으로 나가세요
 } 
if ($i >= count($id)) // 여기에 없는 학생을 찾는다면 전체5명(=)인데 5명 이상(>)이면 
  echo "그런 학생 없습니다";

  연관 배열(associate array)
  대부분 프로그래밍에서는 배열 $user[...]의 인덱스를 숫자로 사용해서 $user[1](두번째 요소), $user[3](네번째 요소)식으로 해주는데 PHP와 몇몇 프로그램은 인덱스를 문자로 사용할 수 있어서 $user['kim'], $user['lee']식도 가능해서 문자로 요소를 찾을 수 있다. 
  숫자 인덱스에 비해서 문자로 되어 있기 때문에 요소의 의미를 쉽게 파악할 수 있다. 하지만 일일이 인덱스 문자열을 써줘야 하는 번거로움이 있다. 연관배열은 앞에서 본 예처럼 width 값을 입력받는 $_GET나 $_POST에서 $w=$_GET[width]나 $h=$_POST[height]식으로 값을 입력받아서 변수 $w나 $h에 값을 저장했는데 사실 여기서의 wdith나 height도 연관배열이다.

  연관배열과 관련이 있는 함수로 extract()가 있는데 연관배열을 분석해서 한 무리의 일반 변수들을 생성해준다. 이를 이용해서 생성되는 변수명은 배열의 인덱스 이름과 같다.

a, b, .... 문자(char)
love, friendship, .... 문자열(string)
=>데이터 타입은 여러 가지가 있지만 웬만한 프로그램에서는 모두 문자열로 취급하는 경우가 많다.
  문자열 String이 최상위 클래스이기 때문이다.
  id int, phone char, ....
  기존의 legacy한 프로그램에서는 정형화가 되어 있었지만 현재는 프로그램 스스로가 판단해서 예를 들어 형변환이 
없이도 정수와 실수의 연산이 가능하다.
==>AI(Artificial Intelligence)으로 이용해서 목적에 맞는 프로그램을 머신이 스스로 꾸며준다.
==>역시 AI를 이용해서 데이버베이스 분석, 관리 등도 스스로 해준다.
==>Cloud 부분도 반드시 알고 있어야 합니다.

  다차원배열
  5명의 학생이 있는 한 학급에서 성적을 처리하는 간단한 프로그램에서 5명씩 있는 학급이 3개 있다면 1학급당 하나의 배열이 소요되므로 3개의 배열이 필요해진다. 배열x배열을 다차원 배열이라고 한다.
=>배열, 빅데이터(Python, R, Scala/Spark라는 프로그램에서는 배열을 매우 매우 중요하게 여긴다. 특히 통계에 막강  한 R에서는 대부분이 배열로 처리된다. Machine Learning 부분에서도 배열이 중요하다. Deep Learning에서는 신경  망구조를 사용하기 때문에 배열을 별로 중시하지 않는다. <=행렬구조
  그리고 분류 등의 알고리즘에서도 매우 중시한다.

  함수
  함수는 function 이라는 단어 뒤에 함수_명을 주고, 그 뒤에 ()를 넣고 (인자(arguments))를 써주는데, 인자를 소재로 해서 함수 본체에서 정의된 작업을 수행하는 코드 블럭이다. 결과를 반화거나 반환하지 않을 수도 있다.
  함수에는 사용자가 생성해서 사용하는 '사용자 정의 함수(user defined function)'와 array(), count(), extract() 등 불러서 바로 쓰면 되는 '내장함수(nested function)'가 있다. PHP 역시 많은 내장함수가 있다.
 
  함수는 function 뒤에 함수_명을 주고, 그 뒤 () 속에 (인자(arguments))를 써주는데, 인자를 소재로 해서 함수 본체에서 정의된 작업을 수행하는 코드 블럭이다. 형태는 다음과 같다.
function 함수_명(arg1, arg2, ...) {   // 함수 선언-함수 헤더
  작업할_PHP_문장들                   // 함수 몸체

함수_명(param1, param2, )          // 함수 호출

  매개변수가 있는 함수
  함수는 자신이 처리해야 할 일에 필요한 정보를 매개변수를 통해서 받아와서 실행하기도 한다. 함수_명 뒤의 ()가 바로 매개변수를 받아온다. 매개변수 값은 함수를 호출할 때 전해져서 함수 몸체가 실행되기 전에 함수에 투입된다. 함수에게 넘겨주는 값을 인자(argument)라고 하고, 함수를 호출할 때 주는 값을 매개변수(parameter)라고 하는데 이 매개변수가 함수의 인자로 들어가서 함수에 필요한 값들을 주어서 이를 재료로 함수가 요리하게 한다. 

외부에서 첫번째 입력값에서 두번째 입력값까지 합을 구하는 프로그래밍 작성
1) html로 입력값 받는 폼 : 첫번째 값 입력, 두번째 값 입력
2) php 프로그램으로 이 두 사이의 수를 더하는 함수 summ()을 선언하고 두 인자를 받아들여서 더함

  반환값이 있는 함수
  함수 실행에서 매개변수가 필요 없을 때에는 매개변수(parameters)와 인자(arguments)를 생략할 수 있듯이 
함수가 어떤 작업을 한 결과를 반환값이라고 하는데 반환값이 필요 없는 경우에는 return 지시어 뒤에 반환 값을 생략할 수 있다.  
  하지만 매개변수가 있고 반환값이 있는 함수는 매개변수를 함수 실행(연산) 시 입력 값으로 써주어야 하고, 
반환값이 있는 경우에는 return 뒤의 반환 값을 그냥 화면에 출력할 수도 있지만, 어느 변수에 담아 두었다가 다른 계산의 입력 등으로 사용되게 할 수도 있다. 

  쿠키와 세션
  웹 서핑에서 사용자가 웹 페이지로 이동하더라도 특정 페이지에서의 정보는 계속 유지되어져야 할 필요가 있다. 
예를 들어서 A 쇼핑몰에서 담은 품목들은 A 쇼핑몰을 닫고 B 쇼핑몰로 이동해도 A 쇼핑몰의 품목들이 모두 어디엔가 저장되어있어야 나중에 B 쇼핑몰에서의 품목과 한꺼번에 보일 수 있게 된다. 따라서 이전의 정보가 계속 어딘가에 유지되고 있다는 것은 보안상 쿠키가 위험한 요소가 될 수 있어서 잘 관리해야 한다. 쿠키의 이런 보안 상 위험을 줄인 것이 세션이다.

  쿠키(Cookies)
  한 페이지에서 정보를 입력받고 이 정보를 다른 곳으로 옮길 수 있다. 한 페이지의 데이터를(e.g. ~.html 폼) 다른 페이지(e.g. ~.php 폼)로 넘겨줄 때 $_GET[...]나 $_POST[...]를 사용해 보았다. 이때 데이터를 받는 페이지에서는 $_GET[...]이나 $_POST[...] 배열을 사용해서 전달되어 온 ... 값을 추출한다. 
  그런데 하나의 웹 사이트에 한 두 페이지가 연계된 것이 아니라 수십 개의 페이지가 연계되어 있다면 작업이 복잡해진다. 이럴 때 쿠키를 사용하는데 쿠키는 특정 사이트에 대한 사용자의 동작에 필요한 데이터를 해당 사용자의 컴퓨터에 저장해 놓은 것으로 보면 된다. 이렇게 특정 사이트에 대한 정보를 호스트에 저장해두면 해당 사이트의 어떤 페이지에도 이 정보를 이용해서 쉽게 접근할 수 있다. 
  쿠키는 특수한 형태의 변수로 볼 수 있다. 우리가 인터넷 뱅킹을 할 때 PC와 휴대폰의 인증서를 서로 옮기는 것, 특정 사이트에 대한 로그인 크레덴셜(ID와 PASSWD를 합친 용어)을 저장해두고 해당 사이트에 로그인할 때마다 자동으로 로그인되게 하는 것 등도 모두 쿠키로 처리되기 때문에 보안에 취약하다는 것이다.

  PHP에서도 한 프로그램에서 사용되는 변수는 다른 PHP 프로그램에서 사용될 수 없다. 한 PHP 프로그램에서의 변수를 다른 PHP 프로그램에서도 사용되게 한다면 쿠키로 만들어 두면 되는데 setcookie("쿠키_명", "쿠키_값", 만료_시간);식으로 해주면 된다.

  두 개의 PHP 파일에서 한 PHP의 값이 다른 PHP로 이동되는 쿠키의 예를 보자. Linux 시스템에서는 Named Pipe와 같은 개념이다. 시스템에서 보면 Fork로 볼 수도 있다.

  세션
  한 사이트에 연계되어 있는 여러 페이지에서 테이터를 공유하기 위해서 쿠키를 사용하지만 사용자의 컴퓨터에 파일형태로 저장되기 때문에 이 머신에 접속하면 누구나 볼 수 있어서 보안에 취약하다. 
  이런 쿠키의 보안 문제를 해결하기 위해서 PHP 4부터는 세션 변수를 사용한다. 클라이언트가 서버에 접속하면 서버는 각 사용자마다 session_id라는 아이디를 부여하고 그 이름으로 폴더를 생성해서 각 클라이언트 별로 세션 변수 값(일종의 쿠키)들을 저장해둔다. 즉, 쿠키 데이터가 클라이언트 컴퓨터에 저장되지 않고 클라이언트가 접속하는 서버에 저장되는 것을 세션 변수라고 하는데 현재 대부분 서버 시스템에서는 세션 변수를 사용한다. 
  세션은 쿠키보다 더 간단한데 세션 변수를 사용(생성, 읽기, 삭제)하려면 그 전에 세션을 시작시켜 두어야 한다. 세션을 생성하기 위해서는
session_start();를 써준 뒤 
$_SESSION[세션_변수_명] = 값해서 생성하면 된다. 

  쿠키를 사용해서 로그인을 받는 프로그램을 생성해보자. 
로그인은 프론트 엔드에 있는 웹 페이지의 로그인 페이지에서 유저_아이디와 비밀번호를 입력받아서, 
백 엔드에 있는 데이터베이스에 저장된 크레덴셜과 일치하는지 확인해서 로그인을 처리하는 메카니즘이다. 
아이디는 admin, 비밀번호는 1234로 해서 PHP 로그인 페이지 프로그램을 작성해보자. 

  먼저 입력 form의 PHP로 생성하고, 
  로그인 버튼을 누르면 링크된 다른 PHP에서 크레덴셜을 체크해서 로그인 성공과 로그인 실패를 보이는 프로그램이다. 로그아웃하는 프로그램도 필요해서 총 login form PHP, login PHP, logout PHP 세 개의 파일을 생성한다.  

  로그인 폼을 html 이외에 php로 작성할 수도 있다.

html에서 <header>부분은 lang=utf-8과 같은 지시사항을 기록하는 곳이다.
제목은 html에서 <h1>....<h6>

방명록 생성하기

1) 먼저 필요한 모듈을 설치한다.
rpm -qa libjpeg* libpng* freetype* gd-* gcc gcc-c++ gdbm-devel libtermcap-devel
yum -y install libjpeg* libpng* freetype* g* gcc gcc-c++ gdbm-devel libtermcap-devel
2) 이어서 웹 서버를 설치하는데 
yum -y install httpd 해주고 
3) 이어서 MariaDB 데이터베이스를 설치한다. 먼저 리포지터리 파일을 만드는데
init 하고 
[mariadb]
name = MariaDB
baseurl = http://yum.mariadbg/10.1/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-KEY-MariaDB
gpgcheck=1 해서 저장한 다음
yum -y install MariaDB-server MariaDB-client 해준다.
4) 이어서 PHP를 설치하는데 
yum -y install epel-release 해주고 
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum -y install php7w 해준다.
5) PHP와 SQL 연동 프로그램을 설치한다.
yum install php70w-mysql php70w-pdo php70w-pgsql php70w-odbc php70w-mbstring php70w-mcrypt php70w-gd
yum -y install php70w-pear php70w-pdo_dblib php70w-pecl-imagick php70w-pecl-imagick-devel php70w-xml php70w-xmlrpc
6) 설치가 되었으면 각 버전을 확인한다.
httpd -v
php -v
mysql -v 해보고 
7) 웹 서버의 메인 설정 파일을 변경하는데 
nano /etc/httpd/conf/httpd.conf 하고 
66 User nobody와
67 Group nobody로 고치고
96 ServerName 192.168.100.200:80로 만들고 저장한다.
8) 이어서 방화벽을 여는데 
nano /etc/sysconfig/iptables 하고 
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT 를 추가하고 저장한 뒤
service iptables restart 하고 
iptables -nL 해서 확인한다.
9) 이제 웹 서비스 시작과 설정이다.
systemctl start httpd && systemctl enable httpd 하고 
firefox http://192.168.100.200 해서 웹 페이지를 본다.
  이어서 
nano /etc/httpd/conf/httpd.conf 하고 
165 DirectoryIndex index.html index.htm index.php
274 AddType application/x-httpd-php .php .html .htm .inc
275 AddType application-httpd-php-source .phps로 고친 뒤 저장한다.
10) PHP 설정인데 
nano /var/www/html/phpinfo.php 하고 
<?php
  phpinfo();
?>를 입력해서 저장한다.
이어서 
firefox http://192.168.100.200/phpinfo.php 해본다.
11) 데이터베이스 설정이다.
systemctl start mariadb 하고 
mysql_secure_installation 한 뒤 root 패스워드를 rootoot로 지정한다.
이어서 
mysql -u root -p 하고 rootoor을 입력해서 mariadb>가 보이면 된다.

'일단 해보는 코딩 > PHP' 카테고리의 다른 글

[PHP] 함수활용  (0) 2022.06.01
[PHP] 기본개념 및 연산자  (0) 2022.05.24