webhacking.kr 를 풀어보면서 php언어를 공부해볼 필요성을 느껴서 스터디 하는김에 강좌를 들어보려고 한다.
1. PHP 언어의 기본 개요
- php/apache/mysql이 주로 함께 설치된다. (리눅스 내에서 운용되므로 LAMP이라고 한다)
- 서버가 인터넷 상에 존재하는 위치인 도메인에게 클라이언트가 정보를 요청할 수 있다.
=> 이 때 php 에게 클라이언트의 요청인 phpinfo.php 등의 파일의 처리를 위임하고,
php가 정보를 처리해서 서버에 전달하게 된다.
- 사용자의 정보(댓글, 코멘트)등을 저장해야 한다면 php가 데이터베이스(MySQL)을 호출하여 그 내용을
웹서버에게 전달하게 된다.
-Ubuntu에 apache2 와 php 가(bitnami로 한번에 설치 가능) 깔려있다는 전제 하에 시작하였다.
-reload/restart의 차이
: reload- 설정만 변경, restart- 엔진 자체를 아예 재시작
2. 첫번째 php application 만들어보기
- 운영체제를 기반으로 해서 apache(웹 서버)가 설치되어있고 , 그 위에 php (요청 해석/엔진/ interpreter)가 존재한다.
=> 여기서 우리가 개발할 부분은 php 가 해석하는 php application을 만들어주는 것이다.
- 확장자 명인 .php 를 만들어 주는 부분이다.
<php 편집기 sublime Text3 설치 과정>
=> 편집기를 사용하면 훨씬 편리하게 이용가능하다.
sudo add-apt-repository ppa:webupd8team/sublime-text-3
sudo apt-get update
sudo apt-get install sublime-text-installer
1. 가장 간단한 hello world
tip) localhost가 위치한 파일에 php파일을 저장해야 웹 서버로 불러오는게 가능하다.
=> 나의 경우에는 var/www/html/ 밑에 php파일을 저장했다.
cd /var/www/html
sudo touch helloworld.php
sudo gedit helloworld.php
=> 관리자 권한을 이용하지 않으면 read-only 상태를 해제할 수 없다. read-write status로 바꿔주어야 한다.
=> 간단한 php 명령문을 실행시켜보자.
<?php
echo "hello world"
?>
3. 왜 server-side script를 사용하는가?
- 예전에는 서버쪽에서 실행되는 언어가 별로 없었다.
: HTML 문서를 웹브라우저가 요청하는 대로 해석하여 클라이언트로 보내기만 하는 역할을 했기 때문이다.
- HTML문서를 서버와 클라이언트가 주고받기 위한 통신 규약: HTTP
: URL을 입력하면 서버가 이에 해당하는 html 문서를 처리하게 된다.
: html, http, url 이 인터넷의 3요소라고 할수 있다.
- CGI : 웹 서버 상에서 사용자 프로그램을 동작시키기 위한 조합이다. (클라이언트와 직접 연결될 수는 없다)
ex) java, php, perl, python, c++... 등의 환경 변수나 표준입출력을 다룰 수 있는 프로그램 언어라면 언어의 구별을 묻지 않고 확장하여 사용할 수 있다.
- DB: 데이터를 저장하는 것에 특화되어 있다.
-URL에 따라서 접근하는 주소가 달라질 수가 있다.
4. 자료형- Data type (숫자/문자)
1) 숫자
: 숫자의 기본 특성은 '계산' 할수 있다는 것이다. 그리고 php에서 대부분의 연산자를 그대로 사용할 수 있다.
<?php
echo 1*4+6;
?>
: 이게 문자열이 아니라 숫자인지 확인 할수 있다.
var_dump(6)
2) 문자열
:php 는 "~", '~' 사이를 문자열로 인식한다. =>이를 사용하지 않으면 오류 발생
:" "를 이용해 자료형을 정해줄 수 있다. 같은 숫자도 따옴표 안에 들어감으로써 문자열로 바뀔 수가 있다.
: 문자열과 문자열을 결합하기 위해 사용하는 연산자는 "."이다. (다른 연어에서는 주로 + 사용)
<?php
echo "hello"."world"
?>
: 인용 부호를 쓰고 싶을 경우에는 작은따옴표와 \(역슬래시: 문자열 escape)를 사용한다.
echo '그는 "안녕하세요"라고 말했다' //1번방법
echo "그는 \"안녕\"이라고 말했다" //2번방법
5. 변수
: 문자나 숫자 같은 값을 담는 컨테이너로, 자연어에서 대명사와 비슷한 역할을 한다.
: PHP 에서는 반드시 $표시가 변수 앞에 붙어야 한다.
: # ,/* */ => 주석
<html>
<body>
<?php
$a=1;
echo $a+1;
echo "<br />";
$a=2;
print $a+1;
?>
</body>
</html>
<html>
<body>
<?php
$first="coding";
echo $first."everyday";
?>
</body>
</html>
: 변수를 이용하면 불필요한 중복을 줄일 수 있다.
<html>
<body>
<?php
$a=100;
$a=$a+10;
print $a.'<br/>';
$a=$a/10;
print $a.'<br/>';
?>
</body>
</html>
+) print <br/> 은 줄바꿈해주는 역할을 한다.
6. 상수
: 상수는 변하지 않는 값이다. 필요에 따라서 사용자가 직접 상수를 정의할 수가 있다
=> define( '변수명', '변수의 값');
<html>
<body>
<?php
define('Title', 'PHP Tutorial');
echo Title;
define('Title2','JAVA Tutorial');
echo Title2;
?>
</body>
</html>
: 변수와는 다르게 한번만 정의할 수 있고, 변경이 불가능한 특성을 갖고 있다.
7. 자료형 검사하고 변경하기
1. 검사: echo gettype($a); <=> var_dump 는 검사와 출력까지 강제로 하기 때문에 활용도가 떨어진다.
2. 자료형 변경: settype( 변수, '자료형');
<html>
<body>
<?php
$a=100;
echo gettype($a);
settype($a,'double');
echo '<br/>';
echo gettype($a);
?>
</body>
</html>
8. 가변 변수
: 변수의 내용을 변수의 이름으로 또 변경할 수 있는 기능이다. (php 만 갖고 있는 특성)
: $$ title= $ subject 와 동일하다.
<html>
<body>
<?php
$title = 'subject';
$$title = 'php tutorial';
echo $subject;
?>
</body>
</html>
9. 비교
- 비교 연산자
- == , != , > , < .. 등에서 true/false 로 boolean값을 출력할 수 있는 것을 확인할 수 있다.
<html>
<body>
<?php
echo "1==2";
var_dump(1==2);
echo "<br/>";
echo "one==two";
var_dump("one"=="two");
echo'<br/>';
echo "one==one ";
var_dump("one"=="one");
?>
</body>
</html>
=> var_dump 는 괄호 안의 값이 어떤 형태의 자료형인지 출력해주는 연산자이다.
또한 var_dump(1!=2) 를 실행하면 bool(true) 가 나오는 것 또한 확인할 수 있다.
+) 특이한 연산자 ===
좌항 과 우항이 자료형까지 완전히 동일해야 한다.
10. 입출력 / 폼/ HTTP
1) 입출력
각 프로그램은 입력값을 가질 수 있고, 입력 값에 따라 동작 방법이 달라지거나 데이터를 저장/삭제/ 출력이 가능하다.
: 어떻게 입력값이 웹브라우저에서 출력되는지 과정을 알아볼 필요가 있다.
<?php
echo $_GET['id'];
?>
=> $_GET[] : 배열을 나타낸다, GET 안의 내용은 유기적으로 바꿀 수가 있다. ex) name
=> URL 뒤에 ? 표시의 의미는 php app 안으로 입력되는 값을 전달해주는 부분이다.
이때, URL 뒤에 ?id= coke이라고 입력해주면 웹브라우저에 아이디를 출력할 수가 있다.
이것을 통해 코드 상의 $_GET['id] 는 URL의 내용 중에서 ?id= 뒤에 따라오는 데이터로 치환된다는 것을 추정할 수 있다.
<?php
echo 'Welcome, '.$_GET['id'];
?>
=> 우리는 이 과정을 통해 php 어플리케이션은 URL을 통해서 데이터를 입력 받을 수 있다는 것이다.
또한, 입력 받은 값에 따라서 다른 결과를 출력할수 있는 프로그램을 만들어 볼 수 있다.
<?php
echo $_GET['id'].','.$_GET['password'];
?>
두가지 변수값을 입력받을 수도 있다는 것을 확인 할 수 있다.
=> SQL INJECTION에서 무작정 id, pw등을 입력만 해보았던 내용을 '왜' 그렇게 작동하는지 알수 있었다!
2) HTML form
URL 에 직접 정보를 입력하는 것은 불편하므로, 웹브라우저의 textfield, checkbox 등을 통해서 사용자가
직접 정보를 입력해줄수 있다. 이것을 "입력 컨트롤"이라고 한다. 그리고 이를 만드는 방법을 HTML form 이라고 한다.
=> form 은 html 양식이다.
=> submit 버튼을 통해 데이터를 서버 쪽에 전송해줄 수 있다.
<html>
<body>
<form method="post" action="21.php"> //명령을 input 했을 때 어떤 action을 취할 것인가?
id: <input type="text" name="id" />
password: <input type="text" name="password" />
<input type="submit" /> // 명령을 input 해주는 방법
</form>
</body>
</html>
=> 사용자가 직접 id/pw 를 입력할수 있는 창을 만들어 줄수 있다.
=> action 명령어에 적힌 php 파일로 이동하여 id, pw를 화면상에 출력하게 된다.
- client의 요청이 url 을 통해 웹 서버에 전달되고, 요청한 html 문서를 다시 클라이언트 컴퓨터에 출력해준다.
-또 출력된 폼에 따라서 정보를 입력해주면, 웹 서버로 다시 전달이 되고, html 문서에서의 action대로 데이터베이스를 저장하던지, 다시 php 엔진에게 넘겨서 웹서버가 지시한 대로 정보를 화면에 출력해주던지 하는 행동을 취하게 된다.
3) GET vs POST 방식
- GET 방식
: 어떠한 정보를 전송할때 URL에 데이터를 첨부하여 전송하는 방식이다.
- POST 방식
: HTTP(클라이언트와 서버가 소통할 때 사용하는 프로토콜) 메시지에서 본문에 데이터를 포함하여 전송한다. (URL에 적지 않아도 됨)
*POST 방식 실습
<html>
<body>
<form method="post" action="4.php">
id : <input type="text" name="id"/>
password : <input type ="text" name="password"/>
<input type="submit"/>
</form>
</body>
</html>
=> post 방식으로 id, password를 전달받을 수 있다. 또한 url에 노출되지 않으므로 get 방식보다 보안성이 훨씬 좋다.
<?php
echo $_POST('id').','.$_POST('password');
?>
=> ID, PASSWORD를 넘겨도 URL 을 통해 전송하지 않아도 되는 것을 확인 할 수 있다.
* html에는 get방식으로 데이터를 넘기고, php 파일에선 post 방식으로 데이터를 받아온다면?
=> 화면에는 오류가 생기지만, url에는 사용자의 id와 pw가 그대로 노출되는 사고가 생길 수 있다.
=> 사용자가 입력한 정보(데이터베이스에 저장되는 정보) 는 post 방식을 사용해야 한다.
=> 사이트를 공유할 때 post 방식을 사용하면 url 뒤에 따라붙는 내용이 없어지므로, 정보에 대한 식별자 주소가 필요하게 된다. : 따라서 정보 링크를 사용할 때는 get 방식으로 url에 다른 사람들이 도달할 수 있도록 해야 한다.
ex) naver.com/board.php/?wr_id=9561
=> 따라서 ? 뒤의 내용이 없으면 상대방에게 링크를 전송해줘도 게시물을 확인할 수가 없게 된다.
11. 조건문
: 주어진 조건에 따라서 애플리케이션을 다르게 동작하도록 하는 것이다. (컴퓨터를 좀더 똑똑하게 사용!)
1. if ~else 문
: 조건문의 키워드, if(조건) 으로 실행된다.
<?php
if(true)
{echo 1;
echo 2;
}
else{
echo 3;}
?>
: else if 또한 사용 할 수 있다. (더 다양한 케이스의 조건을 검사할 수 있다.)
if ~, else if ~, else if~ ,else ~ 이렇게 이루어진 블럭이 있다고 가정했을 때, 두 번째 else if가 true이면 그 뒤의 조건문들은 실행되지 않는다. 즉 조건문은 각각 한 블럭씩만 반응한다.
2. 조건문의 응용
=> php 어플리케이션에 조건문을 추가할 수 있다.
* id를 입력받아서 admin이 아니면 wrong, 맞으면 right를 출력해주는 app.
<10.html>
<html>
<body>
<form method="get" action="11.php">
<input type="text" name="id"/>
<input type="submit"/>
</form>
</body>
</html>
<11.php>
<? php
if($_GET['id']=='admin'){
echo 'right';
}
else{
echo 'wrong';
}
*id와 비밀번호를 모두 검증하는 app.
<12.html>
<html>
<body>
<form method="post" action="13.php">
id: <input type="text" name="id" />
password: <input type="text" name="password"/>
<input type="submit"/>
</form>
</body>
</html>
<13.php>
<?php
if($_POST['id']==='admin'){
if($_POST['password']==='1234'){
echo 'right';}
else{
echo 'password wrong';}
}
else{
echo 'id wrong';
}
?>
=> 드디어 웹 서버에서 id/password를 입력할 때 어떻게 동작하는지 알수 있게 되었다! 뿌듯.
3. 논리 연산자
1) and, or (각각 &&, || 으로 사용 가능하다.)
: 중첩된 if else문을 좀더 간결하게 만들어 줄수 있다.
<13.php의 개선> => and 연산자의 활용을 통해 훨씬 간결해진 것을 확인 할수 있다.
<?php
if($_POST['id']==='admin' && $_POST['password']==='1234){
echo 'right';
}
else
{ echo 'wrong';}
?>
<13.php의 변형> => and, or 연산자를 활용해 여러 아이디의 로그인을 허용하는 프로그램을 짜보자.
<?php
if(($_POST['id']==='admin' or $_POST['id']==='hello' or $_POST['id']==='yummy')
and $_POST['password']==='1234'){
echo 'right';
}
else{
echo 'wrong';
}
?>
2) ! => 부정의 의미로, boolean의 값을 역전시킨다. true->false, false->true로 만들어준다.
ex) if(! true)
12. 반복문
: 인간이 잘하지 못하는 반복적인 작업을 대행하기 위한 요소이다.
: 반복문을 사용하는게 훨씬 효율적이고, 코드도 간결해진다.
1) While문
=> while문은 조건이 참일 시에 중괄호 구간의 구문을 반복적으로 실행한다.
<?php
while(true){
echo 'coding everybody';
}
?>
// 명령문을 무한 반복하게 된다.
2) for
: 변수 i 가 10이 될때까지 명령을 반복하게 된다.
<html>
<body>
<? php
for($i=0;$i<10;$i++){
echo 'coding everybody'.$i."<br/>";
}
?>
3) 반복문의 흐름 제어
: break 문을 이용해 반복 작업을 중간에 중단시킬 수도 있다.
<html>
<body>
<?php
for($i = 0; $i < 10; $i++){
if($i === 5){
break;
}
echo "coding everybody{$i}<br />";
}
?>
</body>
</html>
0~4까지만 실행이 된것을 확인할 수 있다.
: 실행을 즉시 중단하면서 반복이 지속되게 하려면 ? => continue문
<html>
<body>
<?php
for($i = 0; $i < 10; $i++){
if($i === 5){
continue;
}
echo "coding everybody{$i}<br />";
}
?>
</body>
</html>
<결과>
숫자 5는 확인할 수가 없다. 그 이유는 i의 값이 5가 되었을때 실행이 중단되어 continue 밑의 구문이 실행되지 않았기 때문이다. 그렇지만 반복문은 중단되지 않았으므로 나머지 수는 모두 출력되게 된다.
13. 함수
: 하나의 로직을 재실행할 수 있도록 하는 것으로 코드의 재사용성을 높여준다.
<?php
function numbering(){
$i=0;
while($i <10){
echo $i;
$i+=1;
}
}
for($j=0;$j<10;$j++){
numbering();}
?>
=> 불필요하게 여러번의 코드 반복을 안 해도되는 것을 확인할 수 있다.
- 함수 입/ 출력
1) 출력 : return 사용
=> return 사용하면 return 뒤에 따라오는 값을 함수의 결과로 반환한다.
: return이 등장한 이후에는 함수 내의 어떠한 코드도 실행되지 않는 것을 확인할 수 있다.
<?
function get_member(){
return 'newyork';}
echo get_member();}
2) 인자: 함수로 유입되는 입력값으로, 어떤 값을 인자로 전달하느냐에 따라 함수가 반환하는 값이나 메소드의 동작 방법을 다르게 할 수 있다.
: 또한 여러개의 인자를 전달 받을 수도 있다.
<?php
fuction get_argument($arg){
return $arg;}
print get_argument(2);
print get_argument('hello');
?>
=> 인자의 기본값도 설정 할 수 있다.
<?php
function get_arguments($arg1=100){
return $arg1;
}
echo get_argument();
//인자를 딱히 전달하지 않아도 기본값이 설정되어 있는 것을 확인할수 있다.
?>
14. 배열
배열이란 연관된 데이터를 모아서 관리하기 위해서 사용되는 데이터 타입이다. 변수가 하나의 데이터를 임시로 저장하기 위한 것이라면, 배열은 여러개의 데이터를 저장하기 위한 것이라고 볼 수 있다.
: 배열을 만드는 기호는 [] - 대괄호이다. 대괄호 안에 데이터를 콤마로 구분해서 나열하면 배열이 된다.
<?php
$member= ['this','is','php'];
echo $member[0].'<br />';
echo $member[1].'<br />';
echo $member[2].'<br />';
?>
=> 함수가 리턴하는 값을 배열로 하여, 특정한 요소를 가져올 수도 있다.
<?php
function get_members(){
return ['this','is','php'];}
echo get_members()[1];
?>
: 배열은 반복문을 결합했을 때 더 편리하게 사용된다.
=> 반복문으로 배열에 담긴 정보를 하나씩 꺼내서 처리할수 있기 때문이다.
<?php
function get_members(){
return ['I','want','it','that','way'];}
$members=get_members();
for($i=0;$i<count($members);$i++){
echo $members[$i].'<br/>';}
?>
+) 이때, ucfirst($members[$i])를 사용하면, 각 문자열의 맨 앞글자만 대문자로 만들어줄수 있다.
- 배열의 조작
:배열은 복수의 데이터를 효율적으로 관리, 전달하기 위한 목적으로 고안된 데이터 타입이다. 따라서 데이터의 추가/수정/삭제와 같은 일을 편리하게 할수 있도록 돕는 기능을 가지고 있다.
1) 배열 크기
: count 함수를 이용하면 배열의 크기를 알수 있다.
<?php
$i=[1,2,3,4,5];
echo count($i);
?>
2) 추가
: 기본적으로는 배열의 뒤에 추가되지만, array_unshift 함수를 사용하면 앞에도 추가할 수 있다.
<?php
$arr=['1','2','3'];
array_push($arr,'4');//단수의 아이템 추가
$arr= array_merge($arr,['5','6'];);//복수의 아이템 추가
array_unshift($arr,'0');//앞에 아이템 추가
var_dump(arr);
?>
+) 배열 중간에 추가하고 싶을때
<?php
$li=['a','b','c'];
array_splice($li,2,0,'B');
var_dump($li);
?>
인자가 잘 추가되었을 뿐만아니라, 배열의 원소 수도 늘어나있는 것을 확인 할 수 있다.
=> array_splice(배열이름, 추가할 인덱스(2)//이 인덱스 뒤에 추가된다, 시작 인덱스(0), 추가할 값);
3) 원소 삭제
<?php
$li=['a','b','c','d','e'];
array_shift($li); //배열의 맨 앞에서 삭제
array_pop($li); //배열의 맨 뒤에서 삭제
var_dump($li);
?>
어느 위치에 추가/삭제 하는 지 잘 알아두도록 하자. pop/push는 일종의 스택과 동일하다고 생각하면 될듯.
4) 정렬
: 정렬할 땐 sort, 역순 정렬할 때는 rsort 사용.
<?php
$li=['c','a','d','z','h'];
sort($li);
//rsort($li); #역순 배열시 사용한다
var_dump($li);
?>
- 연관 정렬( associative array,hash, dictionary)
: key, value를 갖고 있고, 데이터가 추가되면 배열 전체에서 중복되지 않는 인덱스가 만들어져서 그 데이터에 대한 식별자가 된다. 따라서 key값의 중복은 불가하다.
<연관 배열 생성하는 방법>
<?php
$grades=array('apple'=>10, 'banana'=>20, 'cherrypie'=>30);
?>
<특정한 key의 value를 가져올 때>
<?php
$fruits=array('apple'=>10, 'banana'=>20, 'cherrypie'=>30);
echo($fruits['apple']);
?>
<배열의 데이터를 기준으로 반복작업을 할 때>
: foreach 문은 $fruits 위치의 배열에 담긴 요소의 숫자 만큼 반복문을 실행한다.
이 방법을 통해 배열 안에 담긴 모든 값을 가져올 수 있다.
<?php
$fruits= array('apple'=>10,'banana'=>30,'cherry'=>20);
foreach($fruits as $key=>$value){
echo "key: {$key} value:{$value} <br/>";
}
?>
'Web > OpenTutorials' 카테고리의 다른 글
JavaScript- (라이브러리~ 정규표현식) (0) | 2020.01.15 |
---|---|
Javascript - 함수~모듈 (0) | 2020.01.11 |
JavaScript 기본 문법 정리 (0) | 2020.01.10 |
HTML 주요 태그 정리 (0) | 2020.01.03 |
HTML로 간단한 웹페이지를 제작해보자 (0) | 2020.01.03 |