WEB 기초 여름1주차 정리 - PHP 1~17
1. 수업소개 ~ 2. 수업의 목적
PHP의 등장배경 : HTML에서의 불만족에서 비롯
- HTML로 된 페이지를 수동으로 하나하나 만들기보단 기계에게 관리하게 시킬 수 없을까?
-> PHP의 등장, 사람이 웹 페이지의 내용을 써서 기계에게 넘기면 기계가 알아서 그것을 HTML로 변환.
운영자는 컨텐츠에 전념할 수 있게 됨
PHP로는 무엇을 할 수 있는가?
: 단 하나의 파일로 여러 개의 웹페이지를 표시할 수 있음
: 일정한 양식에 따라 복수 개의 웹페이지를 찍어냄
: 사용자는 오직 페이지의 '내용'만을 입력, 양식에 맞추어 생성하는 것은 프로그램이 수행
3. PHP 설치 & 환경 설정
- bitnami 페이지에서 bitnami wamp 시리즈를 다운로드받기
- 로컬 디스크 > Bitnami > wampstack (버전명) > manager-windows 실행 :: 비트나미 매니저 프로그램.
- Manage Servers 탭에서 사용을 원하는 서비스를 눌러 Start 버튼 누르기 (초록색이 활성화 상태)
- 실습을 진행할 때는 위 경로에서 apache2 > htdocs 디렉토리에 파일 생성. 기존에 있던 파일은 모두 삭제해도 무방.
에디터는 저번 실습과 마찬가지로 Atom 사용.
위 내용대로 간단한 php 코드를 입력하고,
브라우저에서 127.0.0.1/(파일이름).php 주소를 치면
이런 정보 페이지가 나온다. 여기까지 왔다면 php 설치가 성공적으로 이루어진 것이라고 볼 수 있다.
다음으로는 php의 설정을 만지는 법을 알아보자.
wampstack(버전명) > php > php(구성 설정) 파일을 마우스 우클릭해 '편집'을 누르면
메모장에 다음과 같은 내용이 뜬다.
여기서 Ctrl + F를 눌러서 display_errors를 검색해보자.
첫 검색결과는 앞에 세미콜론이 붙어 있을 것이다. 그 다음 검색결과로 넘겨서 세미콜론이 없는 줄을 찾는다.
Off로 되어 있는 것이 보이는가? 저것은 웹페이지의 에러를 표시해 주느냐/주지 않느냐를 결정하는 옵션이다.
기본이 Off로 되어 있는 것은 에러가 밖으로 드러나면 취약점이 외부에 훤히 드러나 있는 것이나 마찬가지이기 때문이다.
공격자들에게는 좋은 먹잇감이라고 할 수 있다. php를 이용해서 정식으로 서비스를 하는 사람이라면 저 옵션을 꺼야 한다.
하지만 우리는 학습 중이기 때문에 우리가 만든 페이지의 에러를 파악할 수 있어야 한다.
Off로 되어 있는 부분을 On으로 바꾼다.
다음은 opcache.enable 로 검색해 보자.
1로 되어 있다. 값을 0으로 바꿔주어야 한다.
저 옵션은 웹 서비스의 성능에 관여한다.
저 옵션이 1로 켜져 있으면 같은 시간 내에 서버가 더 많은 페이지를 만들어낼 수 있다.
그러나 그만큼 우리가 에디터에서 페이지를 수정한 사항이 한참 더 느리게 (30초~1분 소요) 반영되기 때문에
바로바로 변경사항을 보아야 하는 학습자 입장에서는 끄는 편이 좋다.
다 수정했으면 저장을 누르고 끄자. 그리고 다시 manager-windows를 열어준다.
그리고 위에서 보았던 Manager services 탭에서 Apache Web Server를 Restart해준다.
잠시 노란 불이 들어왔다가 다시 초록불이 들어올 것이다.
php는 끄는 방법이 없다. 때문에 php 설정을 변경하려면 php가 의존하고 있는 웹 서버인 아파치를 껐다 켜야 한다.
아파치는 켜질 때만 설정 파일인 php.ini를 한 번 읽어오기 때문에 변경된 설정을 적용하려면 Restart할 필요가 있다.
(이유는... 성능 때문이다. 사용자가 들어올 때마다 일일이 설정 파일을 확인한다면 얼마나 느려지겠는가?)
아파치를 재부팅했다면 이제 그대로 Restart 버튼 밑의 Configure을 누른다.
작은 창이 하나 뜰 것이다. 거기서 Open Access Log를 누른다.
이런 창이 뜰 것이다.
이것은 말 그대로 접속 로그다. 이 php로 서비스하는 사이트에 사용자들이 접속하면 그 기록이 여기에 남는다.
마찬가지로 Open Error Log를 누르면 에러 기록이 나타난다. 사이트에 문제가 발생하면 그 사항이 여기에 기록된다.
4. PHP의 원리
- 웹 브라우저(클라이언트)가 웹 페이지 파일 요청 -> 웹 서버가 컴퓨터에 저장 중인 웹페이지 파일을 서비스
- .html 파일을 요청했을 경우 : 위의 과정대로 통상적으로 서비스
- .php 파일을 요청했을 경우 : 서버 혼자서는 처리할 수 없는(읽을 수 없는) 파일
- -> php 프로그램에 인계 -> php 프로그램에서 해독해 html 소스로 변환 -> 웹서버가 서비스
- => 클라이언트가 웹페이지를 서비스받아 코드를 보면 (해독 결과인) html 파일만이 나타남
ex) php 코드에서는 '현재 시각을 표시해주는 함수' 임에도
클라이언트가 받은 html 코드에서는 현재 시각을 나타낸 스트링 자체만이 표시됨
= php는 동적, html은 정적. html로 나타나는 것은 php의 결과값 뿐
5. PHP의 데이터 타입 ~ 5-2. PHP와 문자열
1. php에서 숫자를 표현하는 방법
- 정수형(Integer)과 실수형(Float)이 존재함
- 작동 원리는 자바스크립트와 유사함 (<? ?> 안에 코드를 삽입, 동적으로 결과값만 표시)
- 출력할 때는 echo를 사용
- 문장 끝에는 세미콜론
2. php에서 스트링을 표현하는 방법
- 스트링은 큰따옴표(" ")나 작은따옴표(' ') 안에 표현
- 문장에 따옴표가 나타나게 하고 싶으면 다른 종류의 따옴표로 스트링을 감싸거나 이스케이프(\") 활용
- 문장을 접합하는 연산자로 온점(.) 사용
- strlen() 함수 사용 가능 (스트링 길이 리턴)
6. PHP의 변수
php에서의 변수 = $(변수명)
- 변수를 선언할 때는 $ 기호 뒤에 변수명만 적어주면 된다
- 선언할 때 이외에도 php 코드 어디에서든 $를 붙이고 나타나는 이름은 변수명이 된다
- 변수명은 그 자체로 . 기호를 이용하여 스트링과 접합될 수 있다
예시 )
(Atom은 lorem 키워드를 입력하면 예시 스트링 문단을 생성해 준다)
예시 문단 사이사이 동일한 단어를 삽입해야 할 때 변수를 이용하면 수정과 관리가 편안하다.
삽입되는 단어가 변수 $name이라는 이름으로 관리되고 있는 모습.
$name의 값이 다른 스트링으로 변경되었지만
별도의 예시 스트링 수정 없이 변경된 값이 페이지에 적용된다.
7. php의 url 파라미터
php에는 url 파라미터라는 것이 있다. 특정 요소의 값을 url에서 지정하는 것으로,
$_GET['(요소 이름)']; 과 같은 양식을 이용한다.
직접 한 번 보자.
위 스크린샷에서는 사람의 이름을 변수 $name을 선언해서 받지 않고,
url에서 지정해 주는 파라미터 값을 받아와 출력했다. 물론 php이기 때문에 검사 도구를 이용해서 보면
단순히 html로 된 문장처럼 보인다.
url 파라미터를 이용할 때는 아래와 같은 양식을 따른다.
(링크 주소) ? (파라미터 이름) = 파라미터 값
복수의 파라미터를 이용하고자 할 때는 & 기호로 접합해주면 된다.
(링크 주소) ? (파라미터 이름) = 파라미터 값 & (파라미터2 이름) = (파라미터2 값)
아래는 이미 html로 한 번 구축했던 페이지에 파라미터를 적용한 예시이다.
다른 부분은 html 수업에서 다뤘던 예제와 동일하나, (사이트명).html이 아닌
(사이트명).php?(파라미터명)=(파라미터값) 형식의 링크를 지니고 있다.
또한 a 태그에 들어간 링크가 php로 생산되는 페이지로 바뀌어 있고
h2 태그의 내용이 파라미터값에 따라 바뀌도록 되어 있다.
이처럼 파라미터는 php의 기능인 '양식에 따라 내용이 바뀌어 생산되는 페이지'를 만드는 데 매우 요긴한 기능이므로
잘 숙지해둘 필요가 있다.
8. 함수의 사용
php에서도 여타 프로그래밍 언어에서와 마찬가지로 함수를 쓸 수 있다. 아래는 그 예이다.
(특정 예시 문장을 $str 변수로 지정해놓은 상태)
- strlen($str) = 예시 문장의 길이를 출력한다.
- nl2br($str) = 예시 문장의 개행을 html의 <br> 태그로 바꾼다. (html은 문장에 단순히 개행을 한다고 해서 페이지에도 개행으로 나타나는 것은 아니기 때문에 이 함수는 요긴하다.)
적용 사례를 보자.
파라미터를 적용해 놓은 페이지에 함수를 도입한 모습이다.
h2 태그의 내용뿐만 아니라 밑에 있는 스트링까지도 id 파라미터에 따라 다르게 나타나도록 만들기 위해서
프로젝트 폴더에 'data'라는 이름의 디렉토리를 만들었고,
그 디렉토리에 id가 가질 수 있는 값들(html, css, javascript)을 각각 파일명으로 하여 스트링 데이터를 넣어두었다.
여기서 data/(id값)을 인수로 갖는 file_get_contents 함수를 사용하면
인수인 디렉토리 경로에 있는 파일의 내용을 가져올 수 있다. 출력은 마찬가지로 echo로 수행한다.
11. Boolean과 비교 연산자
php에도 마찬가지로 불리언과 비교 연산자가 있다.
(&는 '&' 기호를 나타내는 표현법이다.)
(var_dump()는 입력값을 출력해 주되, 그 자료형까지 함께 출력해 주는 함수이다.)
JS나 여타 프로그램 언어에서와 마찬가지로 php에서도 참/거짓을 나타내는 불리언이 존재하고
비교연산자가 포함된 표현식은 그 불리언을 값으로 갖는다.
12. 조건문의 형식
php에도 if와 같은 조건문이 존재한다. 쓰는 방식은 여타 프로그래밍 언어에서의 if와 다르지 않다.
하단은 코드, 상단은 결과이다. 조건식인 true에 따라 앞쪽의 코드인 2-1이 출력되고 있다.
적용 예시를 보자.
'id' 파라미터의 값이 설정되어 있다면 그 값에 따른 내용을, 설정되어 있지 않다면 별도의 메시지를 출력하고 싶으므로
특정 값이 설정되어 있는지 여부를 불리언으로 리턴하는 isset() 함수를 사용했다.
위의 경우는 url 파라미터에 값이 들어가 있는 경우이며, 따라서 h2 태그와 하단 스트링에 id값에 따른 내용을 출력한다.
파라미터 값이 들어가지 않은 경우이다. else문이 작동하여 별도 메시지가 출력된다.
15. 반복문의 형식 ~ 16. 배열의 형식
반복문과 배열 또한 마찬가지로 php에 존재한다.
반복문 형식은 동일하게 while을 사용하면 된다. 1~3까지의 수를 출력하며 2를 3번 반복하여 출력하도록 설정한 모습이다.
echo에는 자동 개행 기능이 없으므로 출력할 스트링에 br 태그를 별도로 넣어줘야 한다는 점에 유념한다.
- php의 배열도 js에서의 배열과 마찬가지로 선언 시 좌항에 별도의 조치가 필요하지 않다.
- 변수를 선언할 때 우항에 array라는 키워드와 함께 소괄호()를 사용하고, 소괄호 안에 자료들을 나열해 주면 된다.
- 배열의 원소에 접근할 때는 마찬가지로 대괄호[]와 인덱스를 사용한다. 인덱스는 0부터 시작한다.
- count() 함수를 사용하면 배열 원소의 개수를 리턴받을 수 있다.
- 배열에 원소를 추가하는 것이 가능하다. array_push() 함수를 사용한다.
- var_dump 함수로 배열을 출력하면 인덱스 => 자료형(자료내용) 의 양식으로 모든 원소의 정보가 출력된다.
17. 반복문과 조건문의 활용 (.1~.3)
디렉토리 data에 몇 개의 데이터들이 더 추가되었다고 가정하자. 이것들은 앞으로 더 늘어날 수도 있다.
이렇게 되면 아까까지 하던 방법으로는 품이 너무 많이 들어갈 것이다.
우리는 '디렉토리에 있는 파일들의 이름을 모두 가져오는' 함수가 필요하다.
이와 같은 경우 scandir와 같은 함수가 좋은 해법이 될 수 있다.
인수로 넣는 디렉토리 경로는 디렉토리명의 규칙(.은 현재 디렉토리, ..는 부모 디렉토리)을 따른다.
scandir 함수로 가져온 값을 list 변수에 넣어 출력해보니 위와 같은 형태의 배열이 출력되었다.
scandir 함수의 리턴값은 배열이다. 이 사실을 잘 활용해 보자.
while 반복문을 통해 list의 값을 0부터 6까지 순서대로 출력하게 만들었다.
인덱스 0은 현재 디렉토리, 1은 부모 디렉토리이고 그 다음부터 디렉토리 내의 파일명을 나열하기 때문에
조건식을 약간 수정할 필요가 있겠다. 더불어 출력할 li 태그 안에 원래처럼 a 태그도 함께 출력하도록 해 보자.
배열의 원소 수를 세어주는 count 변수를 조건식에 넣었다.
이제 배열의 원소 수가 바뀌어도 바로바로 페이지에 반영될 것이다.
a 태그에 넣는 링크도 list 배열의 인덱스에서 파라미터 값을 가져오도록 설정해 주었다.
이제 위에 표시되는 . 과 ..만 표시되지 않게 해 주면 될 것이다.
다시 수정을 가미한 모습이다. 이번에는 조건문을 사용했다.
시험해본 결과 php의 if문에서는 ||나 && 등 조건을 결합해 주는 기호들이 작동하지 않는 듯 하므로
부득이하게 강의 영상과 같이 이중 if문을 사용해 조건곱을 나타내 주었다.
인덱스를 통해 가져온 배열의 원소가 .나 ..일 때는 표시하지 않게 하여
깔끔한 목차를 구현해낼 수 있었다.