PHP 언어 공부해봅시다 -1) (리눅스 환경 설정~배열)
Web/OpenTutorials

PHP 언어 공부해봅시다 -1) (리눅스 환경 설정~배열)

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 는 "~", '~' 사이를 문자열로 인식한다. =>이를 사용하지 않으면 오류 발생

   :" "를 이용해 자료형을 정해줄 수 있다. 같은 숫자도 따옴표 안에 들어감으로써 문자열로 바뀔 수가 있다.

var_dump 함수를 통해 확인 가능.

 

: 문자열과 문자열을 결합하기 위해 사용하는 연산자는 "."이다. (다른 연어에서는 주로 + 사용)

<?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 는 괄호 안의 값이 어떤 형태의 자료형인지 출력해주는 연산자이다.

boolean 연산자로 출력이 된다.

  또한 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/>";
   }
   ?>

 

key, value를 확인 가능하다.

 

'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