'프로그래밍/PHP'에 해당되는 글 23건

제목 날짜
  • PHP 방명록 기능 소스 2021.11.18
  • PHP 로그인 샘플 소스(HTTP 인증 로그인, Cookie 로그인, Session 로그인) 2021.06.14
  • PHP GET POST 방식 한 페이지에서 처리하기 2021.06.07
  • PHP 폼 태그 checkbox 데이터를 가져와 쿼리문 만들기 샘플 소스 코드 2021.06.05
  • PHP MY-SQL 데이타베이스 연결 소스 코드 예제 및 데이타베이스 연결 에러 로그 정리 2021.06.04
  • PHP 클라이언트와 서버 영역 유효성 검사 간단 샘플 소스 2021.06.03
  • PHP 배열 JSON 데이터를 Ajax로 가져오는 샘플 소스(2) 2020.09.01
  • PHP 파일 업로드 다운로드 샘플 소스 정리(5) 2020.06.27
  • PHP for 문 100개씩 나눠서 서버 전송이나 기타 작업이 필요할 때 활용하기 위한 소스 2019.11.10
  • PHP mb_str_split 함수가 없는 것 같아 만들어 봤습니다.(PHP 한글 물음표, 깨짐) 2019.10.26

PHP 방명록 기능 소스

PHP 방명록 기능 소스

최근에 우분투 서버에 MariaDB와 아파치 서버를 구성하여 PHP를 설치하였습니다. 이왕 설치한 거 간단히 방명록 기능을 구현해 보았는데 필요할 때 개인적으로 참고할 목적과 필요하신 분들과 정보 공유를 위해 정리해 봤습니다.

 

웹 프로그래밍 방명록 구현을 위해 구성된 서버 버전은 다음과 같습니다.

우분투 - 20.04

MariaDB 버전 - 10.3.31

Apache 서버 버전 - 2.4.41

PHP 버전 - 7.4.3

 

방명록 글쓰기, 방명록 글 수정, 방명록 글 삭제, 방명록 검색, 페이징 기능을 간단히 구현하였으며 예외처리나 기타 보안 사항까지 모두 처리 하지 않았기에 현업에서 사용 시 필요한 구문만 참고 후 추가 수정이 필요합니다.

 

먼저 MariaDB에서 간단히 방명록 저장용 테이블을 하나 생성해 줍니다.

CREATE TABLE board(
	no INT NOT NULL AUTO_INCREMENT,
	name VARCHAR(20),
	email VARCHAR(40),
	pass VARCHAR(30),
	content TEXT,
	date DATETIME,
	PRIMARY KEY(NO)
);

 

당장 필요한 건 아니지만, 나중에 페이징 테스트를 하기 위해 데이터도 임시로 넣을 수 있도록 프로시져를 하나 만들어 줬습니다.

DELIMITER ;;
CREATE PROCEDURE auto_insert(IN count INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE (i <= count) DO
		  INSERT INTO board (name, email, pass, content, date)VALUES(CONCAT('에스파' ,i) , CONCAT('auto', i, '@mail.com'), '12345', CONCAT('자동 생성 데이타 에요', i), NOW());
        SET i = i + 1;
    END WHILE;
END;;
DELIMITER ;

CALL auto_insert(231);/*데이터 넣기*/

DROP PROCEDURE auto_insert;/*여러 종류 데이터 넣으려면 지우고 내용만 조금 변경*/

 

방명록 첫 페이지

간단히 방명록 첫 페이지를 HTML과 CSS를 활용해 작성했습니다.


 

home.html(메인 페이지)

기능이 따로 있는 페이지가 아니어서 html 페이지로 만들었으며 basic.css 스타일 시트 파일만 가져오는 간단한 HTML 소스입니다.

<!doctype html>
<html>
<head>
	<meta charset="utf-8">
	<title>방명록</title>
	<link rel="stylesheet" href="basic.css">
</head>
<body>
  <h1 class="my_title">방 명 록</h1>
  <hr id="title">

  <a href="/board/list.php" class="my_link"><h2 class="my_subtitle">방명록 목록</h2></a>
  <a href="/board/write.html" class="my_link"><h2 class="my_subtitle">방명록 작성</h2></a>
</body>
</html>

 

basic.css(방명록 전체 디자인)

방명록 페이지 전체에서 사용하는 CSS 코드를 한군데에 모두 모았습니다. 기본 HTML 구문과 겹치지 않도록 대부분 클래스 선택자를 활용했습니다.

#title{/*제목 밑줄*/
  width: 38%;
}
.my_title{/*제목 글자 정렬 색*/
  text-align: center;
  color: #4d5756;
}
.my_subtitle{/* 부제목 크기*/
  width: 250px;
}
.my_link{/*링크 밑줄 없애기*/
  text-decoration: none;
}
.btn{/*버튼 크기 조정*/
  width: 200px;
}
.my_subtitle{/*main.html 서브 제목*/
  border-bottom: solid 1.5px lightgrey;
}
.my_ul{/*리스트 페이지 디자인*/
  list-style-type: circle;
}
.my_text{/*링크 글자 조정*/
  font-size: 20px;
  font-weight: bold;
}
.my_div{/*글 목록 리스트 디자인*/
  border: 1px solid #d1d1d1;
  margin-bottom: 10px;
  border-radius: 30px;
}
.my_p{/*P태그 사용하게 되면 가운데 정렬*/
  text-align: center;
}
.my_textarea{/*글 작성 디자인*/
  width: 98.70%;
  border-radius: 7px;
  border: 1px outset #d1d1d1;
}
.my_input{/*input text 디자인*/
  height: 28px;
}
.my_hr{/*메뉴 밑줄 디자인*/
  width: 15%;
  border: 1px solid #lightgrey;
}

 

방명록 글 목록 페이지

방명록 홈에서 방명록 목록을 선택하게 되면 방명록 전체 글 목록을 확인할 수 있는 페이지입니다.


 

list.php(방명록 목록 기능)

include 파일은 basic.css(페이지 디자인), dblink.php(DB 접속),  listpage.php(방명록 상세 페이지), page.php(페이징 처리 및 검색) 파일을 다른 페이지에서도 사용해 파일을 나누어서 만들어 include 구문을 사용해 나눠 놓은 파일을 가져와 소스를 작성했습니다.

<?php
  include "dblink.php";

  $query = "SELECT * FROM board ORDER BY no";
  $result = mysqli_query($conn,$query);

  $rows = mysqli_num_rows($result);//DB 조회 결과 갯수를 result 변수에 넣어줘야 include 페이지 오류 나지 않음.
  if(!$rows) {
    echo "현재 등록되어있는 글이 없습니다.";
    exit;
  }
?>
<title>방명록 목록</title>
<link rel="stylesheet" href="basic.css">
<h1 class="my_title">방명록 목록</h1>
<hr id="title">

<a href="/board/home.html" class="my_link"><span class="my_text">【방명록 홈】</span></a>
<a href="/board/write.html" class="my_link"><span class="my_text">【방명록 작성】</span></a>
<hr class="my_hr" align="left">
<?php
  include "page.php";

  $sql="SELECT * FROM board ORDER BY no DESC LIMIT $skip_record,$page_max";
  $result = mysqli_query($conn,$sql);

  include "listpage.php";
  include "paging.php";

  mysqli_close($conn);
?>

 

dblink.php(데이타베이스 접속)

데이터베이스 접속을 처리하는 파일입니다.

<?php
  $conn=mysqli_connect("localhost","root","12345","homework");
  if(!$conn) {
      die("db 접속 에러 : " . mysqli_error());
  }
?>

 

listpage.php(방명록 개별 목록 기능)

SELECT 쿼리 결과가 같아야 활용할 수 있는데 개인적으로는 검색 이후 나오는 페이지가 방명록 상세 페이지와 다른 부분이 거의 없어 해당 구문만 따로 뺐습니다.

<?php
while($row = mysqli_fetch_array($result)) {
  $no = $row['no'];
  $name = $row['name'];
  $email = $row['email'];
  $content = $row['content'];
  $date = $row['date'];

  echo("
  <div class='my_div'>
  <ul class='my_ul'>
    <li>글번호 : $no</li>
    <li>작성자 : $name</li>
    <li>내용 : $content</li>
    <li>등록일 : $date</li>
    <li><a href='/board/update.php?no=$no'>【수정】</a><a href='/board/delete.php?no=$no'>【삭제】</a></li>
  </ul>
  </div>
  ");
}
?>

 

방명록 페이지, 페이징 계산 및 검색 페이지

방명록 하단에 페이지, 페이징 처리 및 검색 결과에 표시되는 페이지 및 검색 태그를 다른 곳에서도 사용해 따로 파일을 뺐습니다.


 

page.php(페이지 계산 기능)

page를 계산하기 위해 필요한 내용을 따로 파일을 만들어 정리했습니다. 이 페이지를 include 하기 전 SELECT 쿼리의 총 개수를 담는 변수 이름을 $rows 이름의 변수로 담아야 다른 페이지에서 활용할 때 에러가 나지 않으니 참고하시면 좋을 것 같습니다.

<?php
$page_max = 10;//페이지에 표시될 페이징 갯수
$total = $rows;//DB SELECT 전체 행
$page_check = $total/$page_max;
$page_total = (int)($page_check);//전체 페이지 계산
$page_num = isset($_GET['page_num']) == '' ? 1 : $_GET['page_num'];//get 페이지 번호가 없는 경우 페이지 번호를 1로 지정.

$pg_cal = (int)(($page_num-1) / $page_max) * $page_max;//페이징 시작 위치 계산
$pg_start =  $pg_cal+1;//다음 시작 페이지 계산
$pg_end = $pg_start + $page_max;//다음 마지막 페이지 계산
$prev = $pg_start-$page_max; //이전 페이징 시작 위치 계산

if($page_total < $page_check)//기본 페이지 1로 셋팅
    $page_total += 1;

if($page_num == 1)//DB LIMT 갯수 계산
       $skip_record=0;
else
       $skip_record=($page_num-1)*$page_max;
?>

 

paging.php(방명록 다음 페이지, 이전 페이지, 처음, 끝 표시 기능)

하단에 들어갈 페이지 숫자와 같이 이전, 다음, 처음, 마지막 페이지 이동 시 필요한 소스입니다. 어려운 내용이 있는 구문은 아니지만 다른 페이지에서도 반복적으로 사용하기에 따로 파일을 뺐습니다.

 

반복문과 제어문을 활용해 하단 페이지 숫자 및 다음, 이전, 처음, 끝 페이 구분이 가능하며 표시됩니다.

<p class="my_p">
<?php
if($page_num != '1'){//처음 페이지
  echo("<a href='$_SERVER[PHP_SELF]?page_num=1'>[처음]</a> ");
};

if($page_num >= 11)//이전 페이지
  echo("<a href='$_SERVER[PHP_SELF]?page_num=$prev'>[이전]</a> ");

for($page=$pg_start; $page < $pg_end; $page++) {//현재 페이지 링크 표시되지 않도록.
  if($page <= $page_total){
    if($page_num == $page){
  		echo "[$page] ";
  	}else{
      echo "<a href=$_SERVER[PHP_SELF]?page_num=$page>[$page]</a> ";
  	}
  }
}

if($page_num < $page_total)//다음 페이징
  echo("<a href='$_SERVER[PHP_SELF]?page_num=$pg_end'>[다음]</a> ");

if($page_num != $page_total)//끝 마지막 페이지
  echo("<a href='$_SERVER[PHP_SELF]?page_num=$page_total'>[끝]</a> ");
?>
</p>

<form action="/board/search.php" method="post"><!-- 검색 페이지 -->
<p class="my_p">
  <select name="search_list" id="search_list">
      <option value="name">이름</option>
      <option value="content">내용</option>
  </select>
    <input type="text" id="search" name="search">
    <input type="submit" value="검색">
</p>
</form>

 

방명록 글 수정 페이지

방명록 목록에서 글마다 달린 수정 버튼을 눌렀을 때 표시되는 페이지 입니다.


 

update.php(방명록 글 수정 기능)

업데이트 페이지는 SELECT 결과를 보여주는 화면이 아니어서 include 파일은 dblink.php 파일만 가져왔습니다. 한 페이지에서 update 처리와 글수정 정보를 보여주기 위해 POST 전송 여부를 확인했습니다.

<?php
include "dblink.php";

if ($_SERVER['REQUEST_METHOD'] === 'POST'){//post 전송
  $pw = $_POST['check'];
  $no = $_POST['no'];
  $content = $_POST['content'];

  $query = "SELECT no FROM board WHERE no='$no' AND pass = '$pw'";//비밀번호 확인 쿼리
  $result = mysqli_query($conn,$query);
  $row = mysqli_fetch_array($result);

  if($row){//비밀번호 맞을때 UPDATE 실행
    $sql = "UPDATE board SET content = '$content' WHERE no = '$no';";

    mysqli_query($conn, $sql);//UPDATE 실행

    $result = mysqli_affected_rows($conn);//update 몇개 되었는지

    if($result > "0"){
      echo "<script>alert('글이 수정되었습니다.');</script>";
      echo "<script>location.href='/board/list.php';</script>";
    }
  }else{
    echo "<script>alert('비밀번호 입력이 안되었거나 잘못된 비밀번호 입니다.');</script>";
    echo "<script>window.history.back();</script>";
  }

}
?>
<title>방명록 글 수정</title>
<link rel="stylesheet" href="basic.css">
<h1 class="my_title">방명록 글 수정</h1>
<hr id="title">

<a href="/board/list.php" class="my_link"><span class="my_text">【방명록 목록】</span></a>
<a href="/board/write.html" class="my_link"><span class="my_text">【방명록 작성】</span></a>
<hr class="my_hr" align="left">

<?php
if(($_SERVER['REQUEST_METHOD'] === 'GET')){//한페이지에서 수정 기능을 같이 처리하기 위해 글 목록에서 넘어온 경우에만 보여주기.
  $no = $_GET['no'];
  $query = "SELECT * FROM board WHERE no = $no";
  $result = mysqli_query($conn,$query);

  if($row = mysqli_fetch_array($result)) {
    $no = $row['no'];
    $name = $row['name'];
    $email = $row['email'];
    $content = $row['content'];
    $date = $row['date'];

    echo("
    <div class='my_div'>
    <form action='$_SERVER[PHP_SELF]' method='post'>
      <ul class='my_ul'>
        <li>글번호 : $no</li>
        <li>작성자 : $name</li>
        <li>내용<textarea id='content' name='content' rows='10' cols='50' class='my_textarea'>$content</textarea></li>
        <li>등록일 : $date</li>
      </ul>
      <p style='text-align:center;'>
        <input type='password' id='check' name='check' placeholder='비밀번호 확인' style='height: 28px;' >&nbsp;<input type='submit' value='글 수정' >
      </p>
      <input type='hidden' id='no' name='no' value='$no'>
    </form>
    </div>
    ");
  }
}

mysqli_close($conn);
?>

 

방명록 글 작성 페이지

방명록 작성 링크를 선택했을 때 표시되는 페이지입니다. 기능이 들어가지 않은 단순 페이지라 html로 만들었으며 방명록 등록 버튼은 submit 전송으로 add.php에서 처리됩니다. html 파일에서 PHP 파일로 이동해 처리되는 방식도 참고하시면 좋을 것 같습니다.


 

write.html(방명록 글 작성 기능)

글 작성 페이지에서만 JavaScript를 활용해 데이터 입력을 했는지 체크하였으며 서버 측 기능이 없어 html 페이지로 작성하였습니다.

<!doctype html>
<html>
<head>
	<meta charset="utf-8">
	<title>방명록 글 작성</title>
	<link rel="stylesheet" href="basic.css">
	<script>
	function check(){
		if(document.getElementById("text").value.length == 0) {//text area 체크
			alert("글을 작성해 주세요.");
			document.getElementById("text").focus();
			return false;
		}

		if(document.getElementById("name").value.length == 0) {//이름 체크
			alert("이름을 작성해 주세요.");
			document.getElementById("name").focus();
			return false;
		}

		if(document.getElementById("email").value.length == 0) {//이메일 체크
			alert("이메일을 작성해 주세요.");
			document.getElementById("email").focus();
			return false;
		}

		if(document.getElementById("pw").value.length == 0) {//비밀번호 체크
			alert("비밀번호를 작성해 주세요.");
			document.getElementById("pw").focus();
			return false;
		}
	}
	</script>
</head>
<body>
	<h1 class="my_title">방명록 글 작성</h1>
	<hr id="title">

	<a href="/board/home.html" class="my_link"><span class="my_text">【방명록 홈】</span></a>
	<a href="/board/list.php" class="my_link"><span class="my_text">【방명록 목록】</span></a>
	<hr class="my_hr" align="left">

	<form action="/board/add.php" method="post" onsubmit="return check()">
	  <textarea placeholder="댓글을 작성해 주세요." id="text" name="text" rows="7" cols="50" class="my_textarea"></textarea>
		<br>
		<p class="my_p">
		  <input type="text" id="name" name="name" class="my_input" placeholder="이름 입력" >
			<input type="text" id="email" name="email" class="my_input" placeholder="이메일 입력" >
		  <input type="password" id="pw" name="pw" class="my_input" placeholder="비번 입력" >
		  <input type="submit" id="btn" value="방명록 등록">
		</p>
	</form>
</body>
</html>

 

 


 

add.php(글 등록 기능)

update.php와 다르게 다른 페이지에서 쿼리를 처리하니 확실히 소스가 간결해져서 보기 좋은 것 같습니다. 간단히 db 연결 파일만 가져와 INSERT 쿼리를 날리는 코드입니다.

<?php
  include "dblink.php";

  if ($_SERVER['REQUEST_METHOD'] === 'POST'){
    $name = $_POST['name'];
    $email = $_POST['email'];
    $pass = $_POST['pw'];
    $content = $_POST['text'];

    $sql = "INSERT INTO board (name, email, pass, content, date) VALUES('$name', '$email', '$pass', '$content', NOW())";

    $result = mysqli_query($conn, $sql);
  }

  if($result=="1"){
    echo "<script>alert('글이 등록되었습니다.');</script>";
    echo "<script>location.href='/board/list.php';</script>";
  }

  echo($result);
  mysqli_close($conn);
?>

 

방명록 글 삭제 페이지

방명록 목록 중 삭제를 선택하면 볼 수 있는 페이지입니다. 글 삭제 버튼을 누르게 되면 delete.php 파일로 입력한 비밀번호와 함께 페이지가 전환 됩니다.


 

delete.php(방명록 글 삭제 기능)

한 페이지에서 보여주고 삭제까지 처리되어 POST 전송 여부를 확인하였으며 비밀번호 확인 후 삭제 쿼리를 보내게 됩니다. mysqli_affected_rows를 활용해 delete가 정상적으로 되었는지 확인했습니다.

<?php
include "dblink.php";

if ($_SERVER['REQUEST_METHOD'] === 'POST') {//삭제 버튼 눌렀을 때.
  $pw = $_POST['check'];
  $no = $_POST['no'];

  $query = "SELECT no FROM board WHERE no='$no' AND pass = '$pw'";//글 삭제 비밀번호 확인
  $result = mysqli_query($conn,$query);
  $row = mysqli_fetch_array($result);

  if($row){//비밀번호 맞을때 DELETE 쿼리 실행
    $sql = "DELETE FROM board WHERE no = '$no' AND pass = '$pw'";

    mysqli_query($conn, $sql);//DELETE 실행

    $result = mysqli_affected_rows($conn);//delete 몇개 삭제 되었는지

    if($result > 0){//1개 이상 변화 있었으면 글 삭제 OK.
      echo "<script>alert('글이 삭제되었습니다.');</script>";
      echo "<script>location.href='/board/list.php';</script>";
    }
  }else{
    echo "<script>alert('비밀번호 입력이 안되었거나 잘못된 비밀번호 입니다.');</script>";
    echo "<script>window.history.back();</script>";
  }
}else{//글 목록에서 넘어왔을때
  $no = $_GET['no'];
}
?>
<title>방명록 글 삭제</title>
<link rel="stylesheet" href="basic.css">
<h1 class="my_title">방명록 글 삭제</h1>
<hr id="title">

<a href="/board/list.php" class="my_link"><span class="my_text">【방명록 목록】</span></a>
<a href="/board/write.html" class="my_link"><span class="my_text">【방명록 작성】</span></a>
<hr class="my_hr" align="left">
<?php
$no = $_GET['no'];
$query = "SELECT * FROM board WHERE no = $no";
$result = mysqli_query($conn,$query);

if($row = mysqli_fetch_array($result)) {
  $no = $row['no'];
  $name = $row['name'];
  $email = $row['email'];
  $content = $row['content'];
  $date = $row['date'];

  echo("
  <div class='my_div'>
  <form action='$_SERVER[PHP_SELF]' method='post' onsubmit='alert('ddd')'>
    <ul class='my_ul'>
      <li>글번호 : $no</li>
      <li>작성자 : $name</li>
      <li>내용$content</li>
      <li>등록일 : $date</li>
    </ul>
    <p style='text-align:center;'>
      <input type='password' id='check' name='check' placeholder='비밀번호 확인' style='height: 28px;' >&nbsp;<input type='submit' value='글 삭제' >
      <input type='hidden' id='no' name='no' value='$no'>
    </p>
    <input type='hidden' id='no' name='no' value='$no'>
  </form>
  </div>
  ");
}
  mysqli_close($conn);
?>

 

방명록 검색 결과 페이지

방명록 목록 하단에 페이지 번호 밑에 있는 이름이나 내용으로 검색했을 때 나오게 되는 페이지이며 검색 결과가 많게 되면 페이징 처리도 됩니다.


 

search.php(방명록 검색 기능)

내용, 이름 검색을 확인 후 쿼리문을 보내기 위해서 분기문이 조금 있습니다. 검색 결과가 많을 경우 페이징 처리를 하기 위해 검색 데이터는 세션에 저장하여 유지하였습니다. 방명록 목록 기능과 보여주는 화면이 같아 page.php, listpage.php, paging.php를 그대로 가져와 사용했습니다.

<?php
/**
s_type - 이름, 내용 검색인지 구분하기 위해
search - 검색어
search_type - 검색 타입에 따라 쿼리문 글자 변경용 변수
**/
include "dblink.php";
session_start();//검색 데이타 유지하기 위해서 사용

  $s_type = "";
  $search = "";
  $search_type = "";

  if($_SERVER['REQUEST_METHOD'] === 'POST'){//검색 결과 필요한 데이터 유지를 위해 세션에 데이터 저장
    $s_type = $_POST['search_list'];
    $search = $_POST['search'];

    $_SESSION["s_type"]= $s_type;//검색된 결과에서 페이지 전환시 데이터 유지하기 위해 사용
    $_SESSION["search"]= $search;//검색된 결과에서 페이지 전환시 데이터 유지하기 위해 사용
  }else{//검색된 결과 이후 페이징 될때마다 검색 데이터 유지
    $s_type = $_SESSION["s_type"];
    $search = $_SESSION["search"];
  }

  if($s_type=="name"){//검색 선택에 따라 쿼리문 다르게 조회
    $search_type = "name";
  }else if($s_type=="content"){
    $search_type = "content";
  }

  $query = "SELECT * FROM board WHERE $search_type LIKE '%$search%'  ORDER BY NO;";

  $result = mysqli_query($conn,$query);
  include "error.php";

  $rows = mysqli_num_rows($result);//DB 조회 결과 갯수를 result 변수에 넣어줘야 include 페이지 오류 나지 않음.

  if(!$rows) {
          echo "검색 결과가 없습니다.";
          exit;
  }
?>
<title>방명록 검색 결과</title>
<link rel="stylesheet" href="basic.css">
<h1 class="my_title">방명록 검색 결과 목록</h1>
<hr id="title">

<a href="/board/list.php" class="my_link"><span class="my_text">【방명록 목록】</span></a>
<a href="/board/write.html" class="my_link"><span class="my_text">【방명록 작성】</span></a>
<hr class="my_hr" align="left">
<?php
  include "page.php";

  $sql="SELECT * FROM board WHERE $search_type LIKE '%$search%' ORDER BY no DESC LIMIT $skip_record,$page_max ";
  $result = mysqli_query($conn,$sql);

  include "listpage.php";
  include "paging.php";

  mysqli_close($conn);
?>

 

마지막으로 코드 작성 시 사용했던 툴은 Atom을 사용하였으며 폴더 구조는 아래 이미지와 같습니다.


 

PHP 언어를 활용해 방명록 기능이나 게시판 기능은 인터넷에 많이 있지만, 개인적으로 보기 깔끔하지 않아 정리해 봤습니다.


현업에서 사용하려면 많은 부분을 손봐야 하겠지만 교육용이나 연습용으로 필요하신 분들이 있을 수도 있다는 생각에 해당 파일을 압축해서 파일도 올려 놓을 테니 소스가 필요하신 분들은 참고하시면 좋을 것 같습니다.

 

파일을 받아 사용하시려면 board 폴더를 하나 만드시고 DB 연결 정보를 변경하시면 될 것 같습니다.

php_board.zip
0.01MB

저작자표시비영리변경금지

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

PHP 로그인 샘플 소스(HTTP 인증 로그인, Cookie 로그인, Session 로그인)

PHP 로그인 샘플 소스(HTTP 인증 로그인, Cookie 로그인, Session 로그인)

PHP 웹 프로그래밍 언어를 사용해 HTTP 인증, Cookie, Session, Session+Cookie를 사용해 로그인 샘플 소스 코드를 정리해 보았습니다.

 

 

PHP HTTP 인증 로그인

장점 : 복잡한 과정을 거치지 않고 간단히 구현 가능

단점 : 로그아웃 기능이 없어 브라우저를 종료해야 로그아웃이 진행됨

요약 : 내부 인트라넷 용도나 간단히 구현하기 위해 인증 과정이 필요한 경우 사용하면 좋을 듯.

 

소스 server.php

$_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] 전역 변수 코드를 이용해 사용자가 입력한 데이터를 가져와 header 전송을 사용해 인증 로그인 팝업을 띄우는 코드입니다.

<?php
header('Content-Type: text/html; charset=UTF-8');    
    $username = 'zzarungna';
    $password = '1234abcd';

    /**
     * 브라우저를 모두 종료하기 전까지 로그인이 유지된다.
     * $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] 전역변수를 이용해 헤더 인증정보 데이터를 가져온다.
     */
    if(!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
        $_SERVER['PHP_AUTH_USER'] != $username || $_SERVER['PHP_AUTH_PW'] != $password ){
            header('HTTP/1.1 401 Unauthorized');
            header('WWW-Authenticate:Basic realm="zzarungna_login"');
            exit('죄송합니다. 로그인 이후 페이지 사용이 가능 합니다. 아이디와 비밀번호를 확인해 주세요.');
    }else{
        echo('로그인 성공!');    
    }
?>

 

결과 화면 server.php

로그인이 되어 있지 않은 상태라면 HTTP 인증 팝업 노출.


 

소스 etc_page.php

다른 페이지에서 HTTP 인증 여부를 확인하려면 server.php 소스를 거쳐 로그인 여부를 확인해 처리.

<?php
header('Content-Type: text/html; charset=UTF-8');
    require_once 'server.php';//다른 페이지에서 헤더 인증정보를 통해 로그인 사용자만 사용 가능하게 하고 싶다면 페이지를 인증정보 페이지를 항상 참조해야 한다.
?>

<h1><?php echo($_SERVER['PHP_AUTH_USER']); ?>님 방갑습니다. 저희 홈페이지를 이용해 주셔서 감사합니다.</h1>

 

결과 화면 etc_page.php

HTTP 인증이 통과되었다면 페이지 내용 출력


 

 

PHP Cookie 로그인

장점 : 로그아웃 구현 가능

단점 : 쿠키 만기 시점을 지정하지 않는 경우 브라우저 종료 시 로그아웃, 저장데이터 용량 한계, 쿠키를 지원하지 않는 브라우저가 있는 경우 사용 불가, 쿠키 삭제를 하지 않는 경우 사용자 PC에 데이터가 저장되어 보안상 좋지 않다.

요약 : 쿠키는 보조수단으로 세션과 함께 사용하면 좋음.

 

기존에 로그인 HTML 페이지를 하나의 페이지에서 구현하려고 했으나 쿠키가 생성되는 시간에 쿠키 생성 체크가 안 되는 현상이 있어 페이지를 3개로 나누어 작성

 

소스 cookie_login.php

form 전송여부 체크 후 아이디와 비밀번호가 맞는 경우 setcookie('id', $_POST['id]); 코드를 사용해 쿠키 생성.

<?php
    header('Content-Type: text/html; charset=UTF-8');
    $main_page = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/client.php';
    $server_id = 'hey';
    $server_pw = 'nice';

    if(isset($_POST['submit'])){ //form이 전송되었다면
        if(!empty($_POST['id']) && !empty($_POST['pw']) && $server_id == $_POST['id'] && $server_pw == $_POST['pw']){//id pw 입력 여부 체크, 지정한 아이디와 비번이 동일한지 체크
            setcookie('id', $_POST['id'], time() + 2400);//쿠키 생성 2400초(40분) 동안 유지
            header("Location: $main_page");//로그인 인증 후 쿠키 생성 후 리다이렉트
        }
    }
?>
<style>
div{
    border: 1px solid black;
    width: 270px;
    height: 89px;
    text-align: right;
}
</style>
<div>
	<?php
	if(empty($_COOKIE['id'])){
    ?>
	<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
		<label>아이디 : </label><input type="text" id="id" name="id" ><br>
		<label>비밀번호 : </label><input type="password" id="pw" name="pw" ><br>
		<input type="submit" id="submit" name="submit" value="로그인">
	</form>
	<?php 
	}else{
	    header("Location: $main_page");
	}
	?>
</div>

 

결과 화면 cookie_login.php


 

소스 client.php(로그인 이후 메인 페이지)

empty($_COOKIE['id']); 코드를 사용해 쿠키가 생성되었는지 확인 후 로그인 여부를 체크한다.

<!doctype html>
<html>
<head>
	<meta charset="utf-8">
	<title>쿠키!</title>
	<style>
    div{
        border: 1px solid black;
        width: 270px;
        height: 89px;
        text-align: right;
    }
    </style>
</head>
<body>
    <div>
    	<?php
    	if(empty($_COOKIE['id'])){
    	    $login_page = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/cookie_login.php';
        ?>
			<h3>로그인이 필요합니다.</h3>
			<a href="<?php echo($login_page); ?>">로그인 페이지로</a>
    	<?php 
    	}else{
    	?>
    		<h3><?php echo($_COOKIE['id'] . '님을 환영 합니다.'); ?></h3>
    		<form action="cookie_logout.php" method="post">
    			<input type="submit" value="로그아웃" id="submit" name="submit" >
    		</form>
    	<?php 
    	}
    	?>
    </div>
</body>
</html>

 

결과 화면 client.php


 

소스 cookie_logout.php

생성했던 쿠키 이름으로 기존에 생성된 쿠키가 있는지 확인 후 생성했던 쿠키 삭제.

<?php
header('Content-Type: text/html; charset=UTF-8');
    $login_page = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/cookie_login.php';
    if(isset($_COOKIE['id'])){
        if(isset($_POST['submit'])){
            setcookie('id', '', time() - 2400);            
            
            echo('<h3>로그아웃 성공</h3>');
            echo('<a href='.$login_page.'>로그인 페이지로</a>');
        }else{
            echo('<h3>로그아웃 실패</h3>');
        }
    }
?>

 

결과 화면 cookie_logout.php


 

 

Session 로그인

장점 : 세션용 쿠키 정보가 웹서버가 저장되어 보안성이 높아진다.

단점 : 서버 부하

요약 : 세션을 생성해도 서버 부하가 생길 만큼 파일 용량이 크지 않음으로 로그인은 세션을 사용해 구현하는 게 좋다.

 

소스 session_login.php
PHP에서는 Session을 사용하려면 session_start(); 을 가장 먼저 작성 해주어야 한다. 소스의 흐름은 세션이 있는지 폼이 전송되었는지 아이디와 비밀번호를 입력하였는지 지정한 아이디와 패스워드와 일치하는지를 확인하는 소스 코드입니다. 쿠키와는 다르게 한 페이지에서 로그인 여부를 바로 확인할 수 있어 2페이지로 작성하였습니다.

<?php
    header('Content-Type: text/html; charset=UTF-8');    
    session_start();//session을 하기 위해서 선언해 줘야 한다.
        
    $server_id = 'hi';
    $server_pw = 'imsession';
    
    if(!isset($_SESSION['id'])){
        if(isset($_POST['submit'])){
            if(!empty($_POST['id']) && !empty($_POST['pw'])){
                if($_POST['id'] == $server_id && $_POST['pw'] == $server_pw){
                    $_SESSION['id'] = $_POST['id'];
                    echo('로그인성공!!');                    
                }else{
                    echo('아이디 또는 비번이 맞지 않습니다.');
                }
            }else{
                echo('아이디  비밀번호를 모두 입력해 주세요.');
            }
        }
    }
?>
<style>
div{
    border: 1px solid black;
    width: 270px;
    height: 89px;
    text-align: right;
}
</style>
<?php
    if(!isset($_SESSION['id'])){
?>
<div>
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    	<label>아이디 : </label><input type="text" id="id" name="id" ><br>
    	<label>비밀번호 : </label><input type="password" id="pw" name="pw" ><br>
    	<input type="submit" id="submit" name="submit" value="로그인">
    </form>
</div>
<?php 
}else{
?>
<div>
	<h3><?php echo($_SESSION['id'] . '님 환영 합니다.'); ?></h3>
	<form action="session_logout.php" method="post">
		<input type="submit" value="로그아웃" id="submit" name="submit" >
	</form>
</div>
<?php 
}
?>

 

결과화면 session_login.php


 

소스 session_logout.php

마찬가지로 세션을 사용하기 위해서 session_start(); 사용하며 세션 변수 초기화 후 웹서버에 생성된 세션용 쿠키까지 삭제하는 내용 입니다.

<?php 
    header('Content-Type: text/html; charset=UTF-8');
    session_start();//세션 사용 시작
    
    $home_url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/loginpage.php';
    
    if(isset($_SESSION['id'])){
        $_SESSION = array();//세션 초기화
        
        if(isset($_COOKIE[session_name()])){//웹 서버에 저장된 세션으로 사용했던 쿠키 삭제
            setcookie(session_name(), '', time() - 3600);
        }
        
        session_destroy();//세션 종료
        
        echo('<h3>로그아웃 성공</h3>');
        echo('<a href='.$home_url.'>로그인 페이지로</a>');
        
    }else{
        echo('이미 로그아웃 되었습니다.');
    }    
?>    

 

결과화면 session_logout.php


 

 

PHP Session + Cookie 사용

장점 : 브라우저를 종료해도 로그인 유지 가능, 쇼핑몰에 로그인을 하지 않아도 쿠키를 이용해 사용자가 봤었던 관심 상품을 보여줄 수 있다.

단점 : 세션이 유지되는 시간은 제한되어 있음.

요약 : 세션으로 불가능한 영역을 쿠키로 대체하여 활용할 수 있다.

 

소스 loginpage.php

로그인하지 않았다면 로그인 할 수 있는 화면을 제공한다.

<?php
    session_start();
    if(!isset($_SESSION['id'])){//로그아웃하지 않은 상태라면 쿠키에 저장된 값을 가져와 로그인을 유지한다.
        if(isset($_COOKIE['id'])){//쿠키에 있는 정보를 가져와 세션에 넣어주어 다시 로그인을 하지 않아도 되니 사용자 입장에서 편하다.
            $_SESSION['id'] = $_COOKIE['id'];            
        }
    }

?>
<!doctype html>
<html>
<head>
	<meta charset="utf-8">
	<title>로그인</title>
	<style>
	   div{
	       border: 1px solid black;
	       width: 270px;
	       height: 89px;
	       text-align: right;
	   }
	</style>
</head>
<body>
	<div>
		<?php
		if(!isset($_SESSION['id'])){
        ?>
        <form action="session_cookie_login.php" method="post">
    		<label>아이디 : </label><input type="text" id="id" name="id" ><br>
    		<label>패스워드 : </label><input type="password" id="pw" name="pw" >
    		<input type="submit" id="submit" name="submit" value="로그인">
		</form>
		<?php 
		}else{
		?>
			<h3><?php echo($_SESSION['id'] . '님을 환영 합니다.'); ?></h3>
			<form action="session_cookie_logout.php" method="post">
				<input type="submit" value="로그아웃" id="submit" name="submit" >
			</form>
		<?php 
		}
		?>
		
	</div>
</body>
</html>

 

결과화면 loginpage.php


 

소스 session_cookie_login.php

아이디와 비밀번호 체크, 세션 생성, 쿠키 생성

<?php
    header('Content-Type: text/html; charset=UTF-8');
    session_start();
    
    $home_url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/loginpage.php';    
    $server_id = 'session';
    $server_pw = 'cookie';

    $login_page = '<a href='.$home_url.'>로그인 페이지로</a>';
    
    if(!isset($_SESSION['id'])){
        if(isset($_POST['submit'])){
            if(!empty($_POST['id']) && !empty($_POST['pw'])){
                if($_POST['id'] == $server_id && $_POST['pw'] == $server_pw){
                    $_SESSION['id'] = $_POST['id'];//세션 생성
                    
                    setcookie('id', $_POST['id'], time() + 172800);//쿠키 생성 만기 2일후까지
                    
                    echo('로그인성공!!');
                    echo($login_page);
                }else{
                    echo('아이디 또는 비번이 맞지 않습니다.');
                    echo($login_page);
                }
            }else{
                echo('아이디와 비밀번호를 모두 입력해 주세요.');
                echo($login_page);
            }
        }
    }else{
        //로그인 페이지로 리다이렉트 이미 로그인되어 있는 상태라면
        header("Location: $home_url");
    }
?>

 

결과화면 session_cookie_login.php


 

소스 session_cookie_logout.php

세션 초기화, 세션 삭제, 웹서버 세션용 쿠키 삭제, 쿠키 삭제

<?php 
    header('Content-Type: text/html; charset=UTF-8');
    session_start();
    
    $home_url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/loginpage.php';
    
    if(isset($_SESSION['id'])){
        $_SESSION = array();//세션 초기화
        
        if(isset($_COOKIE[session_name()])){//웹서버 세션 쿠키 삭제
            setcookie(session_name(), '', time() - 2400);
        }
        
        session_destroy();//세션을 삭제 합니다.
        
        setcookie('id', '', time() - 172800);//쿠키 삭제
        
        echo('<h3>로그아웃 성공</h3>');
        echo('<a href='.$home_url.'>로그인 페이지로</a>');
        
    }else{
        echo('이미 로그아웃 되었습니다.');
    }    
?>    

 

결과화면 session_cookie_logout.php


 

로그아웃 버튼을 누르지 않은 상태에서 브라우저를 종료한 후 loginpage.php에 다시 접근하게 되면 기존에 클라이언트  쿠키 정보를 활용해 세션에 값을 다시 부여하여 다시 로그인 과정을 거치지 않아도 로그인 처리 가능.

 

주의점 : 각각의 브라우저별로 로그인 이후 로그아웃 버튼을 누르지 않고 이틀이 지나지 않은 상태에서 정상적으로 작동. 브라우저간 공유는 되지 않음.


 

로그인 환경을 구성할 때 HTTP, Cookie, Session을 활용하면 좋을 듯하며 HTTP, Session, Cookie를 활용해 로그인 기능뿐만 아니라 필요에 따라 자유롭게 활용하면 좋을 것 같습니다. 개인적으로 참고할 목적으로 정리하였으며  필요한 분들께 도움이 되는 정보였길 바랍니다.

저작자표시비영리변경금지

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

PHP GET POST 방식 한 페이지에서 처리하기

PHP GET POST 방식 한 페이지에서 처리하기

웹사이트에 방문한 사용자들에게서 데이터를 입력받아 전송받은 데이터를 GET, POST 방식을 하나의 PHP 파일에서 구분해 데이터를 처리할 수 있습니다.

 

예전에 전송받은 데이터를 GET으로 보낼지 POST로 보낼지 고민하며 한가지 방식으로만 처리하려고 했던 기억이 있는데 지금 생각해보니 생각이 짧았던 것 같기도 합니다. 하나의 페이지에서 폼전송이나 URL 전송 방식에 데이터를 구분해서 처리할 수 있으니 필요하신 분들은 참고하시면 좋을 것 같습니다.

 

이전에 작성당시엔 문제가 없었는데 POST 방식으로 전송 되었는지 여부를 확인하실때 제대로 작동이 안되신다면 $_SERVER['REQUEST_METHOD'] === 'POST' 구문을 이용해서 확인해 보시면 좋을 것 같습니다.

 

소스 client.php

단순 HTML 태그로 이루어져 있으며 URL 전송과 FORM 전송 버튼을 표시하는 소스코드입니다.

<!doctype html>
<html>
<head>
	<meta charset="utf-8">
	<title>GET방식 POST 방식 한페이지에서 처리하기</title>
</head>
<body>
    <a href="server.php?name=아이유&age=30&gender=여자&birth=1993/05/16">GET 방식 전송</a>
    <form action="server.php" method="post">
    	<input type="submit" value="POST 방식 전송" id="submit" name="submit" >
    	<input type="hidden" id="name" name="name" value="아이유">
    	<input type="hidden" id="age" name="age" value="30">
    	<input type="hidden" id="gender" name="gender" value="여자">
    	<input type="hidden" id="birth" name="birth" value="1993/05/16">
    </form>
</body>
</html>

 

소스 server.php

소스 상 폼 이름에 따라 전송되었는지 여부만 if로 걸러내 처리하는 간단한 코드입니다.

<?php 
    header('Content-Type: text/html; charset=UTF-8');
    
    /*
    isset($_POST['submit']) 작동 안되는 경우가 있더군요.
    대신에 $_SERVER['REQUEST_METHOD'] === 'POST'로 체크해 보셔도 됩니다.
    */
    if(isset($_POST['submit'])){//작동이 안되면 $_SERVER['REQUEST_METHOD'] === 'POST' 변경해 보시길..
        $name = $_POST['name'];
        $age = $_POST['age'];
        $gender = $_POST['gender'];
        $birth = $_POST['birth'];
        
        echo '<h2>POST 방식을 이용해 데이타가 웹서버로 넘어왔네요 </h2>';
        echo '<p>이름 : '. $name . '<br>나이 : '. $age . '<br>성별 :  ' . $gender. '<br>생일 : ' . $birth . '</p>';
    }else{//get
            $name = $_GET['name'];
            $age = $_GET['age'];
            $gender = $_GET['gender'];
            $birth = $_GET['birth'];
            
            echo '<h2>GET 방식을 이용해 데이타가 웹서버로 넘어왔네요 </h2>';
            echo '<p>이름 : '. $name . '<br>나이 : '. $age . '<br>성별 :  ' . $gender. '<br>생일 : ' . $birth . '</p>';
    }
?>

 

결과 화면 (GET 방식)


 

결과 화면(POST 방식)


 

다양한 데이터 처리가 필요한 경우 GET, POST 방식을 같이 사용해 처리해 소스 파일을 나누지 않아도 되니 파일 관리도 좀 더 간편해 지는 것 같습니다.

저작자표시비영리변경금지

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

PHP 폼 태그 checkbox 데이터를 가져와 쿼리문 만들기 샘플 소스 코드

PHP 폼 태그 checkbox 데이터를 가져와 쿼리문 만들기 샘플 소스 코드

form 데이터 전송 시 checkbox 태그 데이터를 가져와 PHP 코드에서 데이타베이스 쿼리문을 만들어 내는 간단한 샘플 소스 코드입니다. checkbox 태그를 사용하게 되는 경우 개인적으로 바로 갖다 쓰려고 하는 용도로 글을 작성하였습니다.

 

소스

소스 구문상 어려운 내용은 없으며 $str 변수에 싱글쿼테이션과 콤마 문자를 추가하는 간단한 소스 코드입니다.  매번 갖다 복사해서 쓰느라 그냥 지나쳤는데 checkbox 태그에 name 이름이 배열 표시가 돼 있었네요? 굳이 [](배열) 붙이지 않았던 기억이 나기도 하는데 테스트해 보니 [] 배열 문자를 빼면 checkbox 데이터가 한 개 이상은 가져오지 않으니 참고하시면 좋을 것 같습니다.

<?php
header('Content-Type: text/html; charset=UTF-8');
if(isset($_POST['submit'])){//폼데이터가 전송되었다면
    if(!empty($_POST['list'])){
        $form_data = $_POST['list'];
        
        for($i=0; $i < count($form_data); $i++){
            $str .= "'" . $form_data[$i] . "'" . ',';
        }        
        $str = substr($str, 0, -1);//쿼리문 오류 방지를 위해 문자열 중 마지막 문자 콤마 제거
        
        $query = "SELECT * FROM 테이블이름 WHERE name IN($str)";
        
        echo("<h3>폼전송 이후 쿼리문 - $query </h3>");
    }else{
        echo('<h3>확인 : 체크박스가 선택되지 않았습니다.</h3>');
    }
    
}
?>

<form method="post" action="<?php $_SERVER['PHP_SELF']?>">
	<p><h1>PHP checkbox 데이터를 가져와서 DB에 넣어보자.</h1></p>
	
	<input type="checkbox" name="list[]" value="1" /><label>아이유</label><br>
	<input type="checkbox" name="list[]" value="2" /><label>토마토</label><br>
	<input type="checkbox" name="list[]" value="3" /><label>바나나</label><br>
	<input type="checkbox" name="list[]" value="4" /><label>수박</label><br>
	<input type="checkbox" name="list[]" value="5" /><label>호박</label><br>
	<input type="checkbox" name="list[]" value="6" /><label>참외</label><br>	
	<input type="submit" name="submit" value="전송~" />
</form>

 

결과 화면


 

폼 태그 안 checkbox 데이터를 가져와 쿼리문을 만드는 샘플 소스 코드를 간단히 작성해 보았으니 필요하신 분들은 참고하시면 좋을 것 같습니다.

저작자표시비영리변경금지

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

PHP MY-SQL 데이타베이스 연결 소스 코드 예제 및 데이타베이스 연결 에러 로그 정리

PHP MY-SQL 데이타베이스 연결 소스 코드 예제 및 데이타베이스 연결 에러 로그 정리

PHP와 MY SQL에 접속하고 쿼리를 실행하기 위해 필요한 PHP 소스 코드와 데이터베이스 연결 시 발생할 수 있는 에러 로그에 대한 내용에 대해서 간단히 정리해 보려고 합니다.

 

소스(PHP, MY-SQL 연결, 쿼리실행, 쿼리결과 확인 소스 코드)

 

소스 코드의 내용의 대부분은 기본적으로 검색하면 쉽게 찾아볼 수 있는 코드들입니다. PHP와 MY-SQL 버전에 따라 사용 방법에 대한 조금의 차이점과 INSERT, UPDATE, DELETE 그리고 SELECT 쿼리 실행 결과를 확인할 때 구분하기 위한 소스로 활용하면 좋을 것 같습니다.

<?php
/*  PHP / DB 연결 관련 내용 정리 PHP 5.0 MySQL 4.1.3 이상
 *  PHP 5.0 MySQL 4.1.3 이하 버전은 mysqli에서 i를 빼고 사용
 *  mysql_connect
 *  mysqli_query($connect, $query)의 경우는 쿼리와 DB코넥트 정보가 바뀌어 있으니 이부분은 참고하자.
 *  mysql_fetch_array
 */

    $connect = mysqli_connect("호스트", "데이타베이스 계정", "데이타베이스 비밀번호", "데이타베이스 이름"); //DB 연결
    
    //DB 연결시 문제가 생겼다면 에러로그 확인해 보기.
    if(!$connect){
        die("DB 연결 실패 로그를 확인해 보세요 : " . mysqli_connect_error());
    }else{
        echo('DB 연결 성공!<br>');
    }
    
    $webdata = '아이유홍길동';
    $change_query = "INSERT INTO test (data) VALUES('$webdata')"; //db쿼리문 작성    
    
    /* DB INSERT, UPDATE, DELETE 쿼리문.
     * $query = "INSERT INTO test (data) VALUES('$webdata')"; 
     * $query = "UPDATE test SET data = 449949494 WHERE data = 0"; 
     * $query = "DELETE FROM test WHERE data = 2021";
     */
    $change_result = mysqli_query($connect, $change_query);//DB UPDATE, INSERT, DELETE 쿼리 실행시 mysqli_query를 이용해 DB 연결 후 쿼리 실행
        
    //result1 변수에는 쿼리 실행 결과 정상적으로 쿼리가 실행되었다면 숫자1이 반환되며 쿼리문 작성이 잘못되었거나 문제가 있는 경우 에러를 내거나 반환값이 아예 없는 경우도 있으니 참고.
    if($change_result == 1){
        echo('쿼리 실행 성공');
    }else{
        echo('쿼리 실행 실패');
    }
    
    /*
     *DB SELECT 데이타베이스에 있는 내용을 가져올땐 mysqli_fetch_array 사용 데이터 로우가 한개이상인 경우는 while로 하나인 경우는 if로 DATA를 가져오면 좋다. 
     */ 
    
    //쿼리 결과가 데이터가 1개일때
    $one_query = "SELECT * FROM test WHERE data = 34";
    $one_result = mysqli_query($connect, $one_query);
    if($data = mysqli_fetch_array($one_result)){
        $outdata = $data['data'];
        echo($outdata);
    }
    
    //쿼리 결과가 없거나 1개만 존재하더라도 while을 사용해도 에러는 발생하지 않지만 소스 코드의 사용목적과 코드의 가독성을 높이는 목적을 위해서라도 결과가 1개인 경우는 if와 while을 구분하여 코드를 작성 하면 좋을 것 같다.
    $all_query = "SELECT * FROM test";
    $all_result = mysqli_query($connect, $all_query);
    while($data = mysqli_fetch_array($all_result)){
        $outdata = $data['data'];
        echo($outdata);
    }
    
    //UPDATE, INSERT, DELETE와 다르게 SELECT 쿼리 결과를 확인하려면 쿼리 실행결과 레코드 수를 카운트 하는 mysqli_num_rows를 활용해 DB SELECT 결과를 확인 하도록 한다.  
    if(mysqli_num_rows($all_result) >= 1 ){
        while($data = mysqli_fetch_array($all_result)){
            $outdata = $data['data'];
            echo("$outdata<br>");
        }
    }else{
        echo("SELECT 조회 결과가 없거나 쿼리문 오류 및 기타 문제가 생긴 경우.");
    }
    
    //DB 연결 종료 구문을 빠뜨리는 경우가 있는데 DB 연결에는 한계가 있기에 DB 연결이후에는 연결을 항상 해제해 주도록 하는 게 좋다.
    mysqli_close($conn);
?>

 

DB연결 실패 로그 - mysqli_connect() HY000/1044 Access denied for user to database

$connect = mysqli_connect("호스트", "데이타베이스 계정", "데이타베이스 비밀번호", "데이타베이스 이름");

작성했던 소스상 데이타베이스 이름이 잘못 기재된 경우 아래와 같이 에러 발생되니 데이타베이스 이름이 잘못 기재 되었는지 확인 하시면 좋을 것 같습니다.


 

DB연결 실패 로그 - mysqli_connect() HY000/1045 Access denied for user to using password: YES

$connect = mysqli_connect("호스트", "데이타베이스 계정", "데이타베이스 비밀번호", "데이타베이스 이름");

DB 연결시 데이타베이스 계정 또는 데이타베이스 비밀번호 입력이 잘못된 경우에 발생하는 에러로그이며 아이디가 틀렸는지 비밀번호가 틀렸는지 정확히 표시되지는 않습니다.

 

로그상 Access denied for user 다음에 아래 이미지와 같이 틀린 문자열 'zzarungna1'과 같이 아이디 또는 비밀번호로 입력했던 문자열이 표시되니 해당 문자열을 통해 ID가 틀렸는지 비밀번호가 틀렸는지 유추해 볼 수 있습니다.


 

DB연결 실패 로그 - php_network_getaddresses: getaddrinfo failed: Name or service not known

$connect = mysqli_connect("호스트", "데이타베이스 계정", "데이타베이스 비밀번호", "데이타베이스 이름");

소스 구문상 호스트가 정보가 맞지 않는 경우 아래와 같이 에러 로그가 표시 되니 DB를 접속하려는 호스트 정보를 확인후 수정 하시면 좋을 듯 합니다.


 

Catchable fatal error Object of class mysqli_result could not be converted to string

아래 이미지와 같이 발생하는 에러 로그는 여러 가지 상황에서 에러가 발생할 수 있습니다. 하지만 소스 구문 중 SELECT 쿼리 실행 결과를 확인하기 위해 mysqli_num_rows를 사용하지 않고 echo를 사용해 쿼리 실행 결과를 바로 출력하려고 했을 때 발생하기도 합니다.

 

 

만약 SELECT 쿼리에 대한 실행 결과를 확인 하실 때는 mysqli_num_rows 코드를 활용하시면 좋을 것 같습니다.

    $query = "SELECT * FROM test";
    $result = mysqli_query($connect, $query);
    
    echo(mysqli_num_rows($result));
    
    if(mysqli_num_rows($result) >= 1 ){
        while($data = mysqli_fetch_array($result)){
            $outdata = $data['data'];
            echo("$outdata<br>");
        }
    }

 

최근에 책을 읽으며 본 내용이 있는데 DB를 설계할 때 특정 데이터를 구분하기 위해 DB에 저장되는 데이터를 특정 알파벳이나 문자로 지정하면 좀 더 알아보기 편하겠다고 생각한 적이 있습니다. 책의 내용은 이랬습니다. 데이터베이스 저장 용량을 절약하게 되면 비용을 아낄 수 있다. 물론 규모가 크지 않다면 문제 될 게 없겠지만 데이터가 얼마나 늘어날지 비용이 얼마나 늘어날지 예측할 수 없으니 이 부분을 고려해 데이터를 구분하기 위한 데이터 저장의 경우는 숫자로 하는 것이 좋다는 얘기가 있었습니다.

 

다른 사람들이 개발해 놓은 사이트를 운영하다 보면 특정 데이터의 종류를 구분하기 위해 DB 데이터를 숫자로 저장해 프로그램 소스 코드 설계 문서에 관련 내용도 없는 경우가 많아 사이트를 일일이 확인하며 종류를 구분하는 데이터를 확인한 경우가 있었는데 데이터베이스 설계 시 종류를 구분하는 데이터는 사람이 알아볼 수 있는 숫자가 아닌 데이터로 저장하면 좋지 않을까? 라고 생각한 적이 있었는데 제 생각이 짧았던 것 같습니다.

 

PHP와 MY-SQL을 사용하시면서 발생할 수 있는 에러 로그와 PHP 소스 코드를 이용해 DB 접속 및 쿼리 실행 및 결과를 확인하는 내용에 대해 간단히 정리해 보았으니 필요하신 분들은 참고하시면 좋을 것 같습니다.

저작자표시비영리변경금지

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

PHP 클라이언트와 서버 영역 유효성 검사 간단 샘플 소스

PHP 클라이언트와 서버 영역 유효성 검사 간단 샘플 소스

개인적으로 활용할 목적도 있지만, 이왕 작성한 소스를 간단히 정리하여 샘플 소스를 간단히 작성하였습니다. 클라이언트는 순수 자바스크립트를 이용해서 검사하였으며 나름 여러 방법을 이용해 검사하도록 작성했습니다. 간단한 웹페이지의 경우는 굳이 jQuery를 사용하지 않아도 되니 바로 사용하셔도 좋을 듯합니다. 서버 영역 언어는 PHP입니다.


TEXT BOX, RADIO BUTTON, TEXT AREA 내용입력과 라디오 버튼을 선택했는지만 검사하였으며 필요한 추가 HTML 영역이 있다면 샘플 소스를 참고해 추가해서 활용하시면 좋을 것 같습니다.


소스 HTML AND JavaScript
예전엔 head 태그 안에 script 구문을 넣는 게 익숙했는데 웹페이지가 처리되는 방식에 따라 html 이후에 script가 처리되니 처리되는 순서에 따라 소스 코드를 작성하는 게 좋은 것 같습니다.


jQuery를 이용해 html road 전 이벤트를 발생시키는 상황이 있는 경우는 순서에 따라 HTML 코드의 head 영역 안에 script 코드를 넣기도 합니다.

<!doctype html>
<html>
<head>
	<meta charset="utf-8">
	<title>php 가즈아</title>
</head>
<body>
	<h1>클라이언트</h1>
	<form method="post" action="practice.php" onsubmit="return Check()" name="my_form">
		<label for="text">1. TEXT BOX</label><br>
		<input type="text" id="text" name="text" /><br><br>
		<label for="radio_btn">2. RADIO BUTTON</label><br>
		YES! : <input type="radio" id="radio" name="radio" value="yes" /> 
		NO! : <input type="radio" id="radio" name="radio" value="no" /><br><br>
		<label for="text_box">3. TEXTAREA</label><br>
		<textarea id="text_box" name="text_box"></textarea><br><br>
		<input type="submit" value="전송" name="submit" />
	</form>
</body>
<script type="text/javascript">
	function Check(){
		//input box text 내용 입력 했는지 확인. form안에서 찾는 방법으로 해보자.
		if(my_form.text.value == ""){
			my_form.text.focus();
			alert("1번 내용을 입력해 주세요.");
			return false;
		}		

		//radio 버튼 선택 하도록 이번엔 javascript html id, name 선택자를 이용해서 체크하자.
		var radio = document.getElementsByName("radio");
		var check = null;
		
		//무언가 선택한다는 내용 자체는 1개 이상이므로 루프를 돌면서 모든 radio 버튼을 체크한다.
		for(var i = 0; i< radio.length; i++){
			if(radio[i].checked==true){
				check = radio[i].value;
			}
		}
		
		if(check==null){//라디오 버튼중 선택된게 있으면 라디오 버튼을 선택 하도록 안내.
			document.getElementById("radio").focus();
			alert("2번 라디오 버튼을 선택해 주세요.");
			return false;
		}
		
		//textarea 글자 입력했는지 체크해보자. 이번엔 아이디 선택자를 이용해서 
		var text_box = document.getElementById("text_box");
		if(text_box.value == ""){
			text_box.focus();
			alert("3번 텍스트에어리어에 내용을 입력해 주세요.");
			return false;
		}
		
	}
	
</script>
</html>

 

결과 화면 HTML, JavaScript


 

소스 PHP

 

PHP 폼 전송 여부를 구분하여 유효성 검사를 하지 않는 경우가 꽤 있었는데 앞으로 유효성 검사 시엔 폼 전송 여부에 따라 사용자가 좀 더 편하게 페이지를 사용할 수 있도록 소스 코드를 작성하면 좋을 것 같습니다.

<?php 
    header('Content-Type: text/html; charset=UTF-8');
    
    if(isset($_POST['submit'])){//폼이 전송되었다면
        $text = $_POST['text'];
        $text_box = $_POST['text_box'];
        $radio = $_POST['radio'];        
        $reinput = false;
        
        if(empty($text)){
            echo('1번 텍스트 입력이 안되었습니다.<br>');
            $reinput = true;
        }
        
        if(empty($radio)){
            echo('2번 라디오 버튼이 선택 되지 않았습니다.<br>');
            $reinput = true;
        }
        
        if(empty($text_box)){
            echo('3번 텍스트에어리어에 글자 입력이 안되었습니다.<br>');
            $reinput = true;
        }
        
        if(!empty($text) && !empty($text_box) && !empty($radio)){
            echo("모든 내용이 입력 되었네요!! ^^");
            //DB 데이터 넣고 필요한 값 가져와서 데이터 수정 및 체크하여 다시 보내 주기~
        }        
    }else{
        $reinput = true;
        echo("<h1>서버! 입력되지 않은 내용이 있는데 페이지에 접근하셨네요!</h1>");
    }
    
    if($reinput){
?>
	<form method="post" action="<?php $_SERVER['PHP_SELF'] ?>" >
		<label for="text">1. TEXT BOX</label><br>
		<input type="text" id="text" name="text" value="<?php echo($text); ?>" /><br><br>
		<label for="radio_btn">2. RADIO BUTTON</label><br>
		YES! : <input type="radio" id="radio" name="radio" value="yes" <?php if($radio=='yes'){ echo('checked'); }?> /> 
		NO! : <input type="radio" id="radio" name="radio" value="no" <?php if($radio=='no'){ echo('checked'); }?> /><br><br>
		<label for="text_box">3. TEXTAREA</label><br>
		<textarea id="text_box" name="text_box"><?php echo($text_box); ?></textarea><br><br>
		<input type="submit" value="전송" name="submit" />
	</form>
<?php
    }
?>

    

 

결과 화면 PHP


 

최종 결과 화면


 

클라이언트, 서버 영역에서 각각의 유효성 검사를 하는 소스 코드를 작성할 때마다 필요한 부분만 그때그때 검색하여 소스 코드를 복사해 사용했지만 제 성향에 맞는 소스 샘플 코드를 활용한다면 작업할 때도 좀 더 편하고 빠르며 안정성 있게 소스 코드를 작성할 수 있을 것 같습니다.

저작자표시비영리변경금지

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

PHP 배열 JSON 데이터를 Ajax로 가져오는 샘플 소스

PHP 배열 JSON 데이터를 Ajax로 가져오는 샘플 소스

jQuery와 Ajax PHP를 이용해 서버에 생성된 JSON 데이터를 가지고 오는 소스를 간단히 작성하였습니다. 먼저 화면에 보이는 페이지를 만들기 위해 아래와 같이 소스 코드를 작성하였으며 화면에 보이는 역활을 하는 소스이기에 HTML 파일로 저장하였습니다.

<html>
<head>
<title>Ajax 배열로 전달 받은 값 가져오기</title>
<!-- Ajax를 사용하기 위해 jquery 첨부 -->
<script  src="http://code.jquery.com/jquery-latest.min.js"></script>

<!-- jquery 사용 시작 -->
<script type="text/javascript">
$( document ).ready(function() {
	//no1 버튼을 클릭 했을떄 이벤트
	$('#no1').click(function(){
	    $.ajax({
			url: "AjaxData.php",
    	  	type: "post",		
   			data: $("form").serialize(),
   			dataType:"json",
		}).done(function(data){
			//json을 통해 가져온 데이타를 input_data tag에 넣어준다.
			var html = "";
				html += "<tr>";
				html += "<td>"+ data.profile.name +"</td>";
				html += "<td>"+ data.profile.age +"</td>";
				html += "<td>"+ data.contact.address +"</td>";
				html += "<td>"+ data.contact.tel +"</td>";
				html += "<td>"+ data.career.job +"</td>";
				html += "<td>"+ data.career.rank +"</td>";
				html += "</tr>";

			$("#input_data").html(html);

 		}); 
          
	});

	//tbody 안에 있는 내용 지우기
	$('#no2').click(function(){
	    $("#input_data").empty();
	});
	
});
</script>
</head>
<body>
<table border="1">
    <thead>
        <tr>
          <th>이름</th>
          <th>나이</th>
          <th>주소</th>
          <th>핸드폰 번호</th>
          <th>직업</th>
          <th>직급</th>
		</tr>
    </thead>
    
    <!-- Ajax를 이용해 PHP 서버 에서 정보를 보여주기 위한 HTML. -->
    <tbody id="input_data">
    </tbody>    
</table>
<hr>
<button id="no1">Ajax Data 가져오기</button>
<button id="no2">Data 지우기</button>
</body>
</html>

 

위 소스를 작성 후 HTML 페이지를 브라우저에서 열어보면 아래 이미지와 같은 형태로 나오게 됩니다. 간단히 Ajax Data 가져오기 버튼을 누르면 테이블 태그에 데이터 내용을 채워 주는 형태입니다.

작성한 소스의 URL은 여기서 직접 테스트해 보실 수 있습니다만 시간이 오래 지나면 사라질 가능성도 있습니다.

- http://enjoyrank.com/blog/AjaxView.html


 

이번엔 실제 JSON 데이터를 생성하는 부분으로 PHP 언어의 배열을 사용하여 기본 데이터를 몇 가지 넣어주었고 JSON 형태로 데이터가 출력되도록 작성하였습니다.

<?php
header("Content-Type: application/json");//json을 사용하기 위해 필요한 구문

//한글의 경우 PHP json에서 표시가 되지 않는 문제점으로 인해 한글 사용시 iconv로 변환하여 넣어주었음.
$profile = array("name" => iconv("EUC-KR","UTF-8", "홍길동"), "age" => "37"); //이름, 나이 정보가 있는 배열
$contact = array("address" => iconv("EUC-KR","UTF-8", "광화문 서울특별시 종로구 세종로 사직로 161"), "tel" => "010-1234-5555");//주소와 전화번호가 정보가 있는 배열
$career = array("job" => iconv("EUC-KR","UTF-8", "무사"), "rank" => iconv("EUC-KR","UTF-8", "팀장"));//직업과 직급의 정보가 있는 배열

//각각의 정보를 하나의 배열 변수에 넣어준다.
$data = array(
	"profile"=> $profile,
	"contact"=> $contact,
	"career"=> $career
);

//json 출력
echo(json_encode($data, JSON_UNESCAPED_UNICODE));
?>

 

정상적으로 JSON 형태의 데이터가 작성되었다면 아래 이미지와 같은 형태로 웹페이지가 표시되게 됩니다.

마찬가지로 실제 실행 화면은 아래 링크된 곳에서 확인할 수 있으시며 시간이 지나 호스팅 유지를 못하는 경우 사이트가 사라질 가능성이 있습니다.

- http://enjoyrank.com/blog/AjaxData.php


 

실제 화면을 볼 수 있는 화면을 구성하는 HTML과 실제 데이터를 보내주는 역활을 하게 되는 PHP 소스 코드 작성이 완료된 후 Ajax Data 가져오기 버튼을 누르게 되면 실시간으로 데이터가 웹페이지에 채워지는 것을 확인하실 수 있습니다.


 

이전에도 Ajax, PHP와 관련한 내용으로 작성한 글이 있습니다만 이전엔 배열 데이터에 한 개의 데이터만 저장해 보내주지만 하나의 배열데이터에 여러 종류의 데이터가 있는 경우 어떻게 코드를 작성하면 되는 샘플 소스 코드를 작성해 보았습니다. 혹시라도 필요한 분들에게 도움이 되는 소스가 되었기를 바랍니다.

 

예전에 작성한 Ajax, PHP, JSON 사용하는 소스코드 경로는 아래에 링크해 놓았으니 필요하신 분들은 참고 하시기 바랍니다.

- https://zzarungna.com/1358

저작자표시비영리변경금지
  • 강서기
    2021.09.14 17:26

    설명이 쉽고 예제가 좋아서 이해가 잘되었네요.감사합니다

    • Favicon of https://zzarungna.com BlogIcon zzarungna
      2021.09.16 13:15 신고

      도움이 되었다니 다행입니다. 댓글 남겨 주셔서 감사합니다. :)

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

PHP 파일 업로드 다운로드 샘플 소스 정리

PHP 파일 업로드 다운로드 샘플 소스 정리

PHP 소스를 통해 간단히 파일 업로드 하는 방법과 파일을 다운로드할 수 있는 소스를 간략히 정리해 보려고 합니다.

 

시작하기 전에 웹을 통해 파일 업로드, 다운로드 하기 위해 필요한 것들을 정리해 봤습니다.

1. 파일 업로드 할 수 있는 첫 시작 페이지(파일 업로드 form 태그 및 HTML UI를 통해 파일 전송) file.php 생성

2. 파일 업로드가 진행 되는 PHP 소스(PHP 소스를 사용해 업로드된 파일 처리) fileUpload.php 생성

3. 파일 다운로드가 진행 되는 PHP 소스(업로드된 파일을 다운로드 할 수 있도록 PHP 소스 작성) fileDownload.php 생성

 

PHP를 사용해 인터넷에 있는 정보들을 모아 간단히 만든 소스이며 최소 필요한 것들만 참고하여 소스를 작성하였기에 예외처리나 필요한 것들은 그때그때 추가하거나 수정하면 될 것 같습니다.

 

1번 먼저 파일을 업로드 할 수 있는 HTML UI와 간단히 파일 여부만 점검하는 소스입니다. 주요 부분만 이야기하자면 파일 전송을 하기 위해 FORM 전송 태그의 enctype 속성을 Multipart/form-data를 사용해야 하며 FORM 태그의 on submit을 활용해 파일이 업로드되어있지 않은 상태에선 데이터가 전송되지 않도록 처리하였습니다.

<html>
<head>
	<!-- 한글 깨짐 발생시 인코딩 euc-kr 또는 utf-8로 설정 -->
	<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
</head>
<title>파일업로드/파일다운로드 페이지</title>
<body>
	<!-- 파일 첨부후 전송전 파일 첨부되었는지 확인하기 위해 fileCheck 스크립트 사용  -->
	<form action="fileUpload.php" method="post" enctype="multipart/form-data" onsubmit="return fileCheck();">
		<input type="file" name="test_file" id="test_file">
		<input type="submit" value="파일 업로드">
	</form>
</body>
</html>

<!-- 파일이 선택되었는지 확인후 첨부되었으면 파일 전송-->
<script type="text/javascript">
	function fileCheck(){
		//html 태그중 file 태그에 값을 확인하여 파일이 있는지 없는지 확인하여 서버 전송 할지 하지 않을지 판단.
		var fileCheck = document.getElementById("test_file").value;
		if(!fileCheck){
			alert("파일을 첨부해 주세요");
		return false;
		}else {
			return true;
		}
	}
</script>

 

위 소스를 적용한 UI 화면이며 파일 첨부를 하지 않고 파일 업로드 버튼을 눌렀을 때 아래 이미지와 같이 파일 전송이 되지 않습니다.


 

파일을 전송할 수 있도록 준비를 하였으니 2번째 PHP 구문을 활용해 실제 업로드된 파일을 처리하는 소스 입니다. 저도 처음 보는 함수들이 많지만, PHP에서 지원하는 file 처리 관련 함수를 활용하면 됩니다.

HTML form action URL에 지정된 페이지이며 최소로 필요한 것들만 작성하였습니다. 아래 소스와 같이 $_FILES 함수 사용법만 활용하면 어려운 내용은 없습니다.

각각의 size, type, name 함수를 활용해 분기 문을 활용해 파일 사이즈 제한 그리고 어떠한 형식의 파일만 업로드되게 할지 파일 이름을 어떻게 지정할지 원하는 대로 수정할 수 있습니다.

한 가지 특이한 점은 임시 공간에 저장된 파일은 스크립트 종료 시 파일이 삭제되기에 업로드된 파일을 보존하기 위해선 move_uploaded_file 함수를 활용해 파일을 옮겨줘야 합니다.

<?php
header("Content-type: text/html; charset=euc-kr");
$myfile_save_dir = "upload/";

//PHP 함수의 $_FILES 함수에서 지원하는 name, type, size, tmp_name, error 활용해 원하는 형태로 코딩 가능.
if (isset($_FILES)) {
    $name = $_FILES["test_file"]["name"];
    $type = $_FILES["test_file"]["type"];
    $size = $_FILES["test_file"]["size"];
	$tmp_name = $_FILES["test_file"]["tmp_name"];
	$error = $_FILES["test_file"]["error"];

	//서버에 임시로 저장된 파일은 스크립트가 종료되면 사라지므로 파일을 이동해야함.
	$upload_result = move_uploaded_file($tmp_name, $myfile_save_dir . $name);

	if($upload_result){
		$result = "파일 업로드 성공 경로 - " . $myfile_save_dir;
	}

}else{
	echo("첨부된 파일이 없습니다. 다시 시도해 주세요.");
}

echo("파일 이름 - " . $name . "<br>");
echo("파일 타입 - " . $type . "<br>");
echo("파일 크기 - " . $size . "<br>");
echo("파일이 임시로 저장된 위치 - " . $tmp_name . "<br>");
echo("현재 파일의 에러 코드 - " . $error . "<br>"); //에러코드 0인 경우 문제 없음으로 판단.
echo($result."<br>");
?>

<html>
<head></head>
<body>
	<p><a href="http://enjoyrank.com/fileDownload.php?filepath=<?= $myfile_save_dir . $name ?>">업로드한 파일 다운로드 하기</a></p>
	<p><a href="http://enjoyrank.com/file.php">파일 업로드 페이지로 돌아가기</a></p>
</body>
</html>

 

위 소스를 활용해 첫 번째 페이지에서 파일 첨부 후 파일 업로드 버튼을 눌렀을 때 처리 되는 화면입니다.


 

3번째 업로드된 파일을 실제로 다운로드받을 수 있게 할 수 있는 PHP 소스 구문입니다. $filepath 변수 부분에 실제 upload 된 폴더를 직접 지정 후 나머지 소스는 그대로 복사하셔서 사용하셔도 됩니다.

파일 경로만 소스로 직접 작성해 확인할 수 있지만 2번 페이지에서 GET 방식의 쿼리스트링으로 넘겨받은 파일의 경로와 파일의 이름만 받아와서 파일 다운로드를 가능하도록 만들었습니다.

HTTP 파일 전송 방식에 대해선 잘 모르지만 파일 경로와 이름만 잘 지정되어 있다면 파일 다운로드가 진행됩니다.

<?php
	$getpath = $_GET["filepath"];
	$filepath = $_SERVER['DOCUMENT_ROOT'] . "/" . $getpath;
	
	$filesize = filesize($filepath);
	$path_parts = pathinfo($filepath);
	$filename = $path_parts['basename'];
	$extension = $path_parts['extension'];

	header("Pragma: public");
	header("Expires: 0");
	header("Content-Type: application/octet-stream");
	header("Content-Disposition: attachment; filename=$filename");
	header("Content-Transfer-Encoding: binary");
	header("Content-Length: $filesize");

	ob_clean();
	flush();
	readfile($filepath);
?>

 

마지막 파일 다운로드 기능은 2번째 파일 업로드 페이지에서 파일 다운로드 링크만 누르면 3번째 파일 다운로드 페이지를 거쳐서 파일이 다운로드되도록 적용해 봤습니다.

 

html a태그를 사용해 웹서버에 위치한 파일의 경로와 이름만 GET 방식의 쿼리스트링으로 fileDownload.php 위치에 넘겨주면 방금 올렸던 파일을 다운로드 할 수 있습니다.


 

제가 작성한 소스는 링크된 URL을 통해 테스트해 보실 수 있습니다만 시간이 지나 경로가 변경되거나 소스가 사라질 가능성이 있으니 참고 하세요. http://enjoyrank.com/file.php

 

PHP를 활용해 파일을 업로드하고 다운로드하는 기본적인 기능과 소스를 정리해 보았습니다. 실제로 사이트에 적용하기 위해서는 예외처리와 제한 그리고 중복 파일 처리 등 추가하고 수정해야 될 부분이 꽤 있지만 PHP 파일 업로드 및 다운로드를 하기위해 필요한 기본적인 샘플 소스라고 생각하시면 좋을 것 같습니다.

 

개인적으로 필요하여 정리하기도 하였지만 필요했던 분들에게 도움이 되는 글이 되었기를 바랍니다.

저작자표시비영리변경금지
  • 익명
    2021.08.09 18:39

    비밀댓글입니다

    • Favicon of https://zzarungna.com BlogIcon zzarungna
      2021.08.13 00:50 신고

      파일 형식에 따라 한글이 깨지는 경우가 있습니다.

      header("Content-type: text/html; charset=utf-8" ); 헤더에서 인코딩 형식을 utf-8로 한번 변경해 보시면 좋을 것 같습니다.

      추가로 pdf 파일 한글 파일 모두 업로드 되는 소스 입니다.

      파일형식에 따라 업로드가 되지 않도록 코드를 작성 하지는 않았습니다. :)

  • 질문자
    2022.02.16 10:15

    이미지 파일을 업로드한 후 다운로드 해봤는데 이미지파일을 지원하지 않는 형식이라고 뜨는데 이 문제 해결할 수 있는 방법 없을까요?

    • Favicon of https://zzarungna.com BlogIcon zzarungna
      2022.02.18 12:55 신고

      음 영문이나 일반 한글 파일을 올린 경우는 문제없이 잘 업로드되고 다운로드를 받을 수 있는데 특수한 문자나 한문이나 공백 특수한 문자가 들어간 경우 파일 이름이 한글이 깨지는 경우가 간혹 있는 것 같습니다.

      제가 이 소스를 작성 했을땐 이미지 파일만 올릴 수 있도록 하지 않았는데 이미지 파일을 지원하지 않는 형식이라고 나오는 게 이해가 좀 안되네요.

      업로드 당시 파일 이름이 종종 깨지는 경우가 있는 것 같습니다.

      이런 경우에는 업로드 되기전에 파일 이름을 랜덤하게 숫자로 변경하거나 공백 제거 및 한글이나 영어가 아닌 경우에는 파일이 업로드 되지 않도록 해야할 것 같습니다. :)

  • 2caa
    2022.05.06 10:28

    ㅎㅎ아

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

PHP for 문 100개씩 나눠서 서버 전송이나 기타 작업이 필요할 때 활용하기 위한 소스

PHP for 문 100개씩 나눠서 서버 전송이나 기타 작업이 필요할 때 활용하기 위한 소스

개인적으로 코드 작업을 하면서 PHP 반복문 FOR 루프에서 반복되는 구문이 있었는데 for 루프가 배열 끝까지 반복되지 않고 100개씩만 루프가 돌면서 특정 서버에 데이터를 전송하는 코드가 필요했습니다.

직접 작성한 코드는 사이트에 이미 적용하였는데 혹시라도 필요한 분들이 있을 수도 있다는 생각에 샘플 코드를 간단히 작성했습니다.

코드의 흐름은 빈 배열 변수에 랜덤 숫자 437개를 넣고 while 반복문에서 100개를 나눈 개수만큼 루프가 돌며 while 문 내부에서 추가로 for 반복문이 반복되는 형태입니다.

개수 테스트가 필요하신 분들은 랜덤 숫자를 배열에 넣는 for 구문에서 437 숫자만 변경하셔서 테스트해 보시면 됩니다.

<?php
header('Content-Type: text/html; charset=UTF-8');//이건 인코딩 설정에 따라 한글 깨지면 EUC-KR로 바꺼서 사용하거나 아예 빼셔도 될것 같네요.
$randomarr = array(); //랜덤 숫자를 저장할 배열선언

for($i=0; $i<437; $i++){ //포문을 돌면서 1000부터 9999까지 랜덤 숫자를 randomarr 배열에 437개 넣음
    $randomNum = mt_rand(1000, 9999);
    array_push($randomarr, $randomNum);
}

$temp_count = count($randomarr) / 100; //몇번 while 문이 돌아야 하는지 확인 하기 위해 randomarr 총카운트에서 100을 나눔 
$count = floor($temp_count); //정수만 추출해서 총 몇바퀴 돌아야할지 계산

if($count!=$temp_count){//100을 나눈뒤 정수로 정확히 안떨어지면 한바퀴 더돌아야 함.
    $count++;
}

$roop_count=0;//전체 루프 변수 및 start end 값 초기화
$start = 0;
$end = 100;

while ( $roop_count < $count ) {//총몇번돌아야 하는지 확인후 while 내부 for문은 100개씩
    if($roop_count==($count-1)){//루프를 돌면서 마지막 루프인 경우 100바퀴씩이 아닌 총 갯수만큼
        $end = count($randomarr);
    }

    $for_count = 1;
    for($number=$start; $number<$end; $number++){
        
        echo(" [출력] - " . $randomarr[$number]);//루프를 돌면서 랜덤 배열에 있는 숫자를 100개씩 꺼냄
        
        if($for_count%5==0){//5개씩 짤라서 보기좋게 하기 위해
            echo("<br>");    
        }
        $for_count++;
    }
    
    echo("<br><br>");//100개가 끝나는 지점이니 이곳에서 서버 전송이나 기타 필요한 코드를 넣으면 될 것 같습니다. 

    $roop_count++;//루프 증가 및 start end 값 100씩 증가
    $start+=100;
    $end+=100;    
}
?>

 

출력 결과는 아래 이미지와 같이 출력되게 작성하였으며 예제 용도로 작성하다 보니 랜덤 숫자와 태그로 구분을 지어놓은 것 빼고는 제가 필요한 부분에서 코드를 적용하여 잘 사용하고 있습니다.


 

샘플 코드를 만든다고 만들었는데 개인적으로 단순하게 코드를 만들다 보니 좀 더 코드를 심플하게 만들 수 있을 거라는 생각도 들고 비슷한 구문이 다시 필요할 때 새롭게 코드를 만드는 것보다 빨리 코드를 적용해 필요한 부분에 활용하기 위해 정리한 것이기도 합니다.

저작자표시비영리변경금지

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

PHP mb_str_split 함수가 없는 것 같아 만들어 봤습니다.(PHP 한글 물음표, 깨짐)

PHP mb_str_split 함수가 없는 것 같아 만들어 봤습니다. (PHP 한글 물음표, 깨짐)

관리하는 사이트의 웹 언어가 PHP로 되어 있었는데 해당 사이트의 인코딩은 UTF-8 형태로 되어 있었고 특정 시스템에 문자열을 보내기 위해서는 잘라낸 문자를 EUC-KR 형태로 변환해 보내야 하는 경우가 생겼습니다.

한글의 경우는 UTF-8, EUC-KR 형태에 따라 한 글자당 2바이트 또는 3바이트를 차지하기 때문에 문자를 잘라내고자 할 때 sub str 함수로 잘라내면 한글 문자가 깨집니다. 그렇기 때문에 mb_sub str 함수를 이용해 모든 글자를 한글자씩 체크해 문자를 잘라야 합니다. 그리고 저에게 필요한건 그렇게 잘라낸 문자들을 배열로 반환해주는 함수가 필요했습니다.

문자를 잘라내기 좋은 mb_sub str 함수가 있었기에 당연히 mb_sub str_split이라는 함수가 존재하지 않을까 생각했었는데 검색 능력이 안 좋아서 그런지 그런 함수를 찾을 수 없었습니다.

그래서 시간을 투자해서 mb_str_split이라는 개인적으로 만들었는데 혹시라도 필요한 분들이 있다면 참고하시면 좋을 것 같습니다.

공백이 있으면 공백을 포함하다 보니 글자 수가 부족하게 나와 보일 수 있습니다. 필요하다면 함수에 공백을 체크하는 구문도 넣어주면 좋을 것 같습니다.

만약 문자열의 형태가 UTF-8이 아니라면 함수 코드 내에 UTF-8 부분만 EUC-KR로 변경해서 사용하셔도 됩니다.

$sample_text = "한글은위대하다우리나라에세종대왕님께서는위대한문자를발명하셨다";

$result = mb_str_split($sample_text,2);

foreach($result as $key){    
    echo $key."</br>";    
}

//원하는 글자 갯수만큼 문자를 하나씩 잘라 배열에 글자들을 담아 리턴 
function mb_str_split($text, $size){    
    $count = 0;
    $order = 1;
    $text_cut = "";
    $text_array = array();    
    $text_size = ($size-1);
    
    for($i = 0; $i < mb_strlen($text, "UTF-8"); $i++){        
        if($count <= $text_size){
            $text_cut .= mb_substr($text, $i, 1, "UTF-8");            
        }
        
        if($i == $text_size || (mb_strlen($text, "UTF-8")-1) == $i){
            $order++;
            array_push($text_array, $text_cut);
            $text_cut = "";
            $text_size = ($size*$order);
            $count = ($text_size-$size);            
        }
        
        $count++;
        
    }
    return $text_array;
}

 

보이는 결과 화면은 단순히 문자열을 잘라낸 것처럼 보이지만 2글자씩 글자를 잘라 배열 형태로 반환 받은 형태입니다.


 

개인적으론 기존 PHP에서 제공하는 기존 함수들을 활용해 새로운 함수를 만들어 보게 되어 좋았던 것 같습니다. 프로그래밍 관련 머리가 좋은 편은 아니라서 하나씩 테스트하면서 만든 함수이다 보니 조금 지저분한 것 같기도 합니다.

저작자표시비영리변경금지

트랙백

※ 스팸 트랙백 차단중 ...{ ? }
이전페이지 다음페이지
방명록 : 관리자 : 글쓰기
zzarungna's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라

HOME

프로그래밍 코드를 좋아하고 생활속에 필요한

유용한 IT 정보를 작성 하려고 노력 하고 있습니다.

  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • 소스 (1521)
    • 프로그래밍 (409)
      • HTML (22)
      • CSS (30)
      • XML (14)
      • Javascript (27)
      • Jquery (13)
      • Ajax (10)
      • ASP (12)
      • PHP (23)
      • Java (36)
      • JSP (8)
      • 안드로이드 (9)
      • C# (52)
      • Winform (32)
      • WPF (13)
      • ADO.NET (8)
      • ASP.NET(4.0) (24)
      • LINQ (2)
      • ORACLE (9)
      • MS - SQL (24)
      • SERVER (10)
      • Programming Exam (6)
      • MySQL (3)
      • EditPlus (6)
      • 재미삼아만든 프로그램 (3)
    • IT 정보 (385)
    • 스마트폰 정보 (216)
      • 안드로이드 (117)
      • 아이폰 (72)
      • 애플리케이션 (21)
    • 게임 (106)
      • PC (50)
      • PS4 (36)
      • 핸드폰 (17)
    • 윈도우 (60)
    • Sony PlayStation (54)
      • PS4 (35)
      • PS5 (10)
      • PS VITA (3)
      • PlayStation Network (6)
    • SNS (61)
      • 카카오톡 (39)
    • 금융 (50)
    • 개인방송 (33)
    • 유튜브 (35)
    • 만화 (19)
    • 스포츠 (12)
    • IT 용어 (5)
    • 다운로드 (3)
    • 노래 (12)
    • 엑셀 (5)
    • 일상 (50)

카테고리

PC화면 보기