PHP & MySql

seongwon·2021년 10월 18일

알게된 사실

: 다른 php 태그 에서도 변수가 공유 된다.

gettype($test) : 변수 타입 확인

document root

사용자의 요청이 들어왔을때 사용자의 요청에 맞는 파일을 찾을 수 있는 최상위 디렉토리. default 값이 설정되어 있어서 경로를 수정할 수 있다.
아파치 서버에서 document root 를 설정한다.

출력 및 주석

echo 'hello world' //문자열 출력 함수
print 값을 그대로 출력
print_r 배열, 객체 모양을 그대로 출력
var_dump print_r 보다 상세하게 출력
#한줄 주석
/*
  여러줄
  주석
*/

변수와 concat, 큰/작은 따옴표 차이

'$name' 이렇게 사용하면 변수값이 아니라 문자열 그대로 출력된다.
"" 를 사용하면 값이 출력되지만 주로 ''를 많이 사용한다.
echo "{$name}"; 와 같은 형태로도 사용한다.

$name = "seongwon";
echo '반갑습니다'.$name;
echo "hello $name";
echo "{$name}";

조건문

조건문의 결과가 참이면 1을 리턴하고 거짓일 경우 아무것도 리턴하지 않는다.

$result = 1 < 3;
echo $result == true;
if($fname == 'delay'){
    echo '조건은 참이다';        
}else{
    echo '조건은 거짓이다.';
}
if($fname == 'delay' && $lname == 'kim')
if($fname == 'delay' and $lname == 'kim') //and/or 사용가능하다.
if($fname == 'delay' xor $lname == 'kim') //xor 서로 다르면 true 리턴

배열과 isset 함수

array() 함수로 빈배열을 생성한후 $fruit[0] = 'apple' 와 같이 값을 대입한다.
isset(변수이름) 함수는 변수가 존재하는지 알려주는 함수이다 있을경우 1을 리턴한다.

//$배열이름 = array();
$fruit = array(); //빈 배열이야
$fruit[0] = 'apple';
$fruit[1] = 'banana';
$fruit[2] = 'orange';    

if(isset($fruit[3])){
    echo $fruit[3];
}else{
    echo 'there is no third item';
}
print_r($fruit); // 배열의 인덱스와 값이 모두 출력됨

반복문, count() - 배열 크기 함수

for($i = 0; $i < count($fruits); $i++){
    echo $fruits[$i].'<br/>';
}

foreach($fruits as $item){
    echo $item.'<br/>';
}

연관 배열 Associative Array

숫자를 배열의 인덱스로 사용 하는 것이 아니라 문자열을 배열의 인덱스로 사용할 수 있다.
$prices = array();

$prices['apple'] = 1000; 또는 아래와 같이 생성가능 하다.

$prices = array('apple'=>1000,'banana'=>2000,'orange'=>1500);

$prices = array();
$prices['apple'] = 1000;
$prices['banana'] = 2000;
$prices['orange'] = 1500;

foreach($prices as $key => $price){
    echo $key." - ".$price.'<br/>';
}

함수, 배열 출력 내장 함수, 지역/전역 변수

함수 내에서 생성된 변수는 함수 내에서만 사용가능한 지역변수

function sum($x, $y){
    $result = $x + $y;
    return $result;
}
$result = sum(10, 20);
echo $result;

$fruits = [
    'apple',
    'mango', 
    'banana', 
    'orange'
];

function output($value){
    echo '<pre>';
    echo print_r($value);
    echo '</pre>';
}
output($fruits);

지역변수 vs 정적변수

"{$var2}" 이런 식으로 사용도 가능한가 보다

function func(){
    $var = 10;
    echo "{$var}";
}
func();  


$var2 = 20;
function func2(){
    global $var2;
    echo "{$var2}";
    echo "{$GLOBALS['var2']}";
}
func2();

정적변수

해당 함수 내부에서만 사용되는 지역변수 이지만 함수가 종료되도 값은 남아있다. 그래서
다시 호출해도 전에 호출했을 때 사용한 값을 연속하여 사용할 수 있다.

function increment(){
    static $count = 0;
    echo "{$count}<br/>";
    $count++;        
}    
increment();
increment();

다른 문서 불러오기 - include, require

include 는 PHP 파일을 불러온다. 그파일이 오류가 나도 오류를 출력하고 다른코드들은 그대로 실행된다. 하지만 require는 그 파일이 오류가 나면 오류를 출력하고 다른코드들도 실행이 안된다. 그러므로 중요한 함수같은 파일들은 require 로 불러오는 것이 좋다. 간단한 footer, header는 include 를 사용하면 좋다. 같은 파일을 여러번 include 하면 여러번 출력된다. 하지만 require는 같은 파일을 여러번 호출하면 오류를 낸다. 여러번 호출되어도 한번만 호출될 수있도록 include, require 모두 _once 를 붙여 주면 된다. e.g) include_once, require_once

<?php 
  include('inc/headers.php');
  require('inc/functions.php');
?>

<?php
  include('inc/footer.php');
?>

반복문

// while
$i = 0;
while($i < 5){
    echo ($i++).'<br/>';
}

echo '<hr/>';

//do-while
$i = 0;
do{
    echo ($i++).'<br/>';
}while($i < 5);

echo '<hr/>';

//for
$i = 0;
for($i = 0; $i < 5; $i++){            
    echo "{$i} <br/>";
}

echo '<hr/>';

//foreach 숫자 index
$arr = array(0,1,2,3,4);
foreach($arr as $item){   
    echo "변수 \$item 의 값은 {$item} 입니다. <br/>";
}

echo '<hr/>';

//foreach 문자열 index
$scores = array(
    '국어' => 80,
    '영어' => 90,
    '수학' => 100,
    '과학' => 95
);
foreach($scores as $key => $score){
    echo "배열 \$scores에서 과목명 {$key} 의 점수는 {$score} 입니다. <br/>";
}

super global GET 요청 받기

아래 와 같은 form 태그가 있을 때 input 태그의 name 속성을 인덱스로 사용해 php 에서 $GET['input_name문자열']로 가져올 수 있다.

<form action="request.php" method="get">
  <p>
    <label for="userName">Name</label>
    <input type="text" name="username" id="userName">    
  </p>
  <p>
    <label for="userEmail">Email</label>
    <input type="email" name="useremail" id="userEmail">
  </p>
  <p>
    <input type="submit" value="로그인">
  </p>
</form>

filter 를 이용한 사용자 입력값 유효성 검사

e.g. filter_input(INPUT_GET, 'limit', FILTER_VALIDATE_INT)
이런 코드가 있으면 사용자가 get 방식으로 입력한 limit 이라는 파라미터가 정수형인지 유효성 검사를 하고 싶다. 입력값이 정수이면 입력값이 린턴되고 아니면 0(false)를 리턴한다.

$product_id = filter_input(INPUT_GET, 'productid', FILTER_VALIDATE_INT);
$limit = filter_input(INPUT_GET, 'limit', FILTER_VALIDATE_INT);    

if($product_id == false or $limit == false){        
    die();
}       

슈퍼 글로번 변수

이 사이트 어디에서든 사용할 수 있는 변수이다.

$_GET[name]
$_POST[name]
$_COOKIE[$cookieName]
$_SESSION[name]

쿠키 생성

setcookie 는 쿠키 이름, 쿠키 값, 만기일, 경로를 입력 받는다. 경로는 기본적으로 '/'를 지정하지만 '/test/'로 지정하면 test폴더와 그 하위폴더에서만 작동된다.
또한 옵션으로 도메인도 입력이 가능한데 'www.test.com' 으로 지정하면 무조건 그 도메인 에서만 작동되지만, '.test.com'으로 지정하면 서브 도메인인 'test1.test.com', 'test2.test.com'등에서도 사용된다.

$cookieName = 'city';
$cookieValue = 'Seoul';
setcookie($cookieName, $cookieValue, time()+60, '/');

if(isset($_COOKIE[$cookieName])) echo '쿠키 생성됨';

쿠키 삭제

setcookie() 함수를 그대로 사용하여 지운다. time을 +에서 -로 바꾸거나 그냥 지금 시간 이전으로 만들면 만기시간이 지나서 없어진다.

setcookie($cookieName, $cookieValue, time()+60, '/');

setcookie($cookieName, $cookieValue, time()-60, '/');
setcookie($cookieName, $cookieValue, time()-1, '/');

세션 생성및 삭제

// 세션 생성
session_start(); 
$_SESSION['city'] = 'Seoul';
$_SESSION['gu'] = 'Jongro';  
print_r($_SESSION); //세션 확인
//세션 삭제
session_unset(); // 모든 세션 삭제 
session_destroy(); // 모든 세션 삭제

DB 연결

$conn = mysqli_connect($servername, $username, $password, $tbname);
if(!$conn){
  echo 'db에 연결하지 못했습니다.' . mysqli_connect_error();
} else{
  echo 'db에 접속했습니다.';
}

sql query 실행

$sql = "INSERT INTO msg_board (name, message) VALUES ('$user_name', '$user_msg')";
// 
$result = mysqli_query($conn, $sql);
if($result === false){
  echo '저장하지 못했습니다.';
  error_log(mysqli_error($conn)); //에러 로그 기록
} else{
  echo '저장 성공';
}

sql result set 배열로 불러오기

아래와 같있을때 $result 에 담겨있는 값은 Object 인데 mysqli_fetch_array() 는 $result 에서 레코드를 1개씩 배열로 리턴해주는 함수이다.

$sql = "SELECT * from msg_board"; 
$result = mysqli_query($conn, $sql);
while($row = mysqli_fetch_array($result)){}

게시판 조회 코드

아래 코드 에서 a 태그의 주소가 절대주소로 되어있지만 view.php 로 적어주어도 해당 폴더 안에서 veiw.php 를 찾아주나 보다.

while($row = mysqli_fetch_array($result)){
    $list = $list."<li>{$row['number']}: <a href=\"/board/view.php?number={$row['number']}\">{$row['name']}</a></li>";
}
echo "<ul>{$list}</ul>";

PHP가 JSP 와 비슷한 문법

<?php
    if($row = mysqli_fetch_array($result)) {
?>
<h3>글번호: <?= $row['number'] ?>/ 글쓴이: <?= $row['name'] ?></h3>
<div>
    <?= $row['message'] ?>
</div>
<?php } ?>

검색 코드

sql 에 문자열이라면 '' 작은 따옴표를 꼭 붙여주어야 한다.

$sql = "SELECT * from msg_board WHERE message LIKE '%$user_key%'";

삭제 코드

$user_delnum = $_POST['delnum'];
$sqlDel = "DELETE FROM  msg_board WHERE number = $user_delnum";
mysqli_query($conn, $sqlDel);

$_SERVER 글로벌 변수

아래와같은 코드 사용 가능
사용자 요청이 POST 라면

if($_SERVER['REQUEST_METHOD'] == 'POST')

$_POST 가 가지고 있는 값과 버튼 구분법

$_POST 를 pre태그 안에서 출력해보면 html name 속성을 키로 vlaue 가 들어있는 배열이 있다. 어떤 버튼이 클릭되었는지도 나타낼수 있는데 input 태그에도 name 속성을 주면된다. 그러면 $_POST 배열에 [longin'] => Login 이 추가된다.

<input type="submit" name="login" vlaue="Login"/>

Email 입력값 유효성 검사

아래 코드중 'email'은 input name 속성에서 받아온 값임

$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);

PHP redirect 함수

header('location: www.abc.com') 함수를 사용하면 된다.

function redirect($url){
    header("Location:$url");
}  

PHP 스크립트 종료 함수

종료 함수를 사용하는 이유는 redirect 함수같이 이동시키는 함수가 호출된 이후에도 뒤에있는 코드가 실행되는 것을 방지하기 위함 인 것 같다.

exit(); //종료. 에러 메시지 출력x
die(); //종료. 에러 메시지 출력o

세션 삭제

세션들은 배열형태로 저장이 되어 있다. 그래서 값을 비우거나 배열을 삭제하는 함수가 존재한다.

unset($_SESSION['name']);
$_SESSION['name'] = '';
session_unset(); //배열의 모든값 비우기 - not 삭제
session_destroy() //세션 배열까지 삭제

profile
공부 기록

0개의 댓글