12 분 소요

PHP


PHP란 C언어를 기반으로 만들어진 서버 측에서 실행된 ServerSideScript입니다.


기본 설정

php 설치

mariaDB 설치

vsftpd 설치하고 root 접근 가능하도록 허용


mariaDB 설치

yum -y install을 사용해서 mariaDB를 설치 해주시면 됩니다.


root 접근 가능하도록 허용

2022-08-29-01환경설정

2022-08-29-03환경설정

2022-08-29-04환경설정

위의 2개 파일에 들어가서 root만 주석처리 해주시면 됩니다.


알 드라이브 사용하여 접속

2022-08-29-02환경설정

알 드라이브를 설치 하시고 root 사용자로 접속 해주시면 됩니다.


PHP 설치

2022-08-29-05php설치

httpd도 같이 설치 해주도록 하겠습니다.


PHP 기본 설정

2022-08-29-06php설정

2022-08-29-07php설정

PHP로 해석해라 라는 부분 입니다.

2022-08-29-08php설정

Error 메시지 출력과 관련된 부분 입니다.

2022-08-29-09php설정

undefined index 관련 부분 입니다.


PHP 파일 만들기

2022-08-29-10php파일만들기


PHP 파일 옮기기

2022-08-29-11php파일옮기기

알 드라이브를 이용하여 PHP 파일을 /var/www/html에 옮겨 줍니다.


host pc로 확인

2022-08-29-12확인


PHP 자료형

PHP 변수

2022-08-29-13php변수


host pc에서 확인

2022-08-29-14php변수 확인




PHP 자료형 : 정수

2022-08-29-16정수


확인

2022-08-29-15정수확인

INT3은 최대값을 넘어서 실수로 표현됨.




PHP 자료형 : 실수

2022-08-29-17실수


확인

2022-08-29-18실수




PHP 자료형 : 문자열

2022-08-29-19문자


확인

2022-08-29-20문자확인




PHP 자료형 : 상수

2022-08-29-21상수


확인

2022-08-29-22상수확인




PHP 자료형 : NULL

2022-08-29-23널


확인

2022-08-29-24널

마지막 echo “$x”는 출력되지 않음이 확인 가능 합니다.




PHP 와 DB

PHP를 이용한 MariaDB 연결

패키지 설치

2022-08-29-30설치


DB파일 만들기

2022-08-29-25db


DB파일 불러오기

2022-08-29-26db파일


DB 내용 확인

2022-08-29-28보드테이블

2022-08-29-29멤버


연결 해보기

2022-08-29-31연결성공

2022-08-29-33연결성공

2022-08-29-34연결실패

2022-08-29-32연결실패

연결실패 code는 password에서 마지막에 d를 빼서 일부러 틀리게 해놨습니다.

위의 예시들은 구버전용 입니다. 현재 centos7는 다른 방식이 있습니다. 지금부터 최신버전으로 예시를 다시 해 보겠습니다.


DB연결 성공

2022-08-29-37db연결성공

2022-08-29-38db연결성공


DB연결 실패

2022-08-29-39db연결실패

2022-08-29-40db연결실패

DB연결이 성공하면 con 변수안에 들어있는 DB정보들이 출력 되지만 연결에 실패하면 아무것도 안나오고 DB 선택 실패가 출력되는 모습 입니다.




PHP 를 이용한 MariaDB 에 SQL 문 전송 I - create

2022-08-29-41SQL

2022-08-29-42SQL

성공하면 이렇게 TRUE가 출력이 되고 실패할시 FALSE가 출력 됩니다.




PHP 를 이용한 MariaDB 에 SQL 문 전송 II - insert

2022-08-29-43인서트


확인

2022-08-29-44인서트

2022-08-29-45인서트




PHP 를 이용한 MariaDB 에 SQL 문 전송 II - select
2022-08-29-46셀렉트


확인

2022-08-29-47셀렉트

여태까지 해왔던 방식대로 select를 해보려 했으나 오류가 뜨는 모습 입니다. select는 다른 방식으로 출력을 해야 합니다.


select 출력 code

2022-08-29-48셀렉트

만약 여기서 while문을 사용하지 않는다면 1개만 출력되고 끝나는 상황이 발생하기에 while문을 사용 했습니다.


확인

2022-08-29-49셀렉트


추가

2022-08-29-50셀렉트


확인

2022-08-29-51셀렉트

만약 while문을 쓰지 않았다면 첫번째 행만 출력되고 새로 삽입한 2번째 행은 출력되지 않았을 것입니다. 이러한 이유로 while문을 사용 했습니다.




WebTest 웹사이트 구조

2022-08-29-59사이트구조

이렇게 구조를 만들어 보겠습니다.


일단 기본적인 파일들을 만들어 두겠습니다.

index.php

2022-08-29-105index

dbcon.php

2022-08-29-60dcorn


head.php

2022-08-29-61head

2022-08-29-62head


style_contents.css

2022-08-29-64style

2022-08-29-65style


style_head.css

2022-08-29-63style

이렇게 기본적인 파일들을 먼저 구성해 두고 시작 하겠습니다.




member


로그인/로그아웃 과정


http 분석

2022-08-29-56로그인정보

2022-08-29-58멤버파일

2022-08-29-66로그인

로그인을 하게 되면 위의 member_login 파일이 정보를 전송 해 주는 방식 입니다. 첫번째 사진은 그 모습을 Wireshark로 잡은 모습 입니다.


회원정보 테이블 추가

2022-08-29-54사용자추가

2022-08-29-55사용자조회

이렇게 가상의 회원을 1명 추가해 보고 로그인 성공 실패를 분석 해 보겠습니다.


member_login_check.php

2022-08-29-67멤버체크

이렇게 파일을 만들고 실행을 해 보겠습니다.


파일 실행

2022-08-29-68실패

로그인 실패라고 출력이 됩니다.

SQL준비 부분에서 u_pass 부분이 틀렸기 때문 입니다.

이번엔 로그인 성공이 출력 되도록 실패한 부분을 주석처리 하고 실행 해보시면 됩니다.

2022-08-29-69성공

로그인 성공이 출력 됩니다.


member_login_check.php

2022-08-29-70멤버체크

2022-08-29-71멤버체크

이렇게 파일을 완성 하였습니다. 사용자를 추가하여 로그인을 해 보겠습니다.


사용자 추가

2022-08-29-72사용자추가


로그인 시도

2022-08-29-73로그인

2022-08-29-74로그인성공

로그인에 성공 하였습니다.


로그인 성공, 실패시 팝업창이 출력 되도록 JAVAscript를 이용하여 만들어 보겠습니다.


member_login_check.php

2022-08-29-75스크립트

script를 조금 추가해 주었습니다.

alert가 팝업창을 생성해주는 명령어 입니다.


팝업창 확인

2022-08-29-76스크립트

2022-08-29-77스크립트

팝업창이 생성 되었습니다.


history.back();

로그인이 실패하든 성공하든 저희가 보던 사이트는 원래 페이지로 돌아가는 기능이 있습니다.

지금 추가할 history.back(); 명령어가 그러한 기능을 해줍니다.

2022-08-29-78스크립트


확인

2022-08-29-79확인

로그인 전 입니다.

2022-08-29-80확인

확인을 누르고 확인 해보시면

2022-08-29-81확인

이렇게 전에 있던 페이지로 돌아가게 됩니다.

전에 있던 페이지로 돌아는 가지만 로그인 성공했던 기록을 가지고 돌아가는 것이 아닙니다. 이제부터는 그 기록을 가지고 페이지로 돌아가도록 해 보겠습니다.


location.replace();

2022-08-29-85로그인

location.replace(); 명령어를 사용해 주시면 됩니다.

history.back은 전에 실행됫던 페이지로 가지만 정보를 가지고 가지 않았습니다.

location.replace는 설정한 페이지로 이동이 가능 합니다.


확인

2022-08-29-82로그인

2022-08-29-83로그인

여기서 확인을 눌러 주시면

2022-08-29-84로그인

index.php로 넘어가는 모습 입니다.


이제 환영합니다 앞에 이름이 들어가도록 설정 해보겠습니다.

2022-08-29-86세션

session_start(); 명령어로 시작 합니다.

로그인에 성공하면 이정보를 가지고 index.php로 가는 것입니다.

2022-08-29-87인덱스

index.php에도 이미 session 명령어가 있습니다.


로그인 성공시

2022-08-29-88확인

로그인에 성공하면 이렇게 환영합니다 앞에 nickname이 붙어서 출력되게 됩니다.


로그아웃 기능을 만들어 보겠습니다.

member_logout.php

2022-08-29-89로그아웃

logout 기능이 담긴 파일을 먼저 만들어 주시고 member디렉터리에 넣어 주시면 됩니다.


확인

2022-08-29-90로그아웃

2022-08-29-91로그아웃

로그아웃이 되고 파일에서 설정한 대로 member_login.php 파일로 돌아가는 모습을 볼 수 있습니다.


아무것도 넣지않고 로그인 할 경우

2022-08-29-92안했을때

아무것도 입력하지 않고 로그인 할 경우 알림창과 전 페이지로 돌아가는 기능을 넣었습니다.(member_login_check.php)


확인

2022-08-29-93안했을때


데이터베이스 연결 파일 지정

dbcon.php

2022-08-29-94dbcon

한줄 빼고 모두 주석처리 해주시면 됩니다.


member_login_check.php

2022-08-29-95dbcon

여기서도 기존 연결은 주석처리 해주시고 다시 써주시면 됩니다.

기존에 있던거 그대로 사용하면 사용자의 비밀번호나 다른 정보들이 바뀌었을 때 페이지 하나하나 들어가서 수정해야 되는 불편함이 있지만 위처럼 require 명령어를 사용해 주시면 dbcon.php만 수정해 주면 다른곳들은 자동으로 수정이 되기 때문에 훨씬 편리해 집니다.




닉네임 수정

이번에는 닉네임 수정하는 기능을 추가하려고 합니다.

2022-08-29-96닉네임

닉네임 수정을 눌렀을 때 닉네임 수정이 가능하도록 해 보겠습니다.


member_nick.php

2022-08-29-97닉네임

2022-08-29-98닉네임

이렇게 만들어 주시면 됩니다.


확인

2022-08-29-99닉네임

2022-08-29-100닉네임

닉네임 수정을 누르면 페이지는 나오나 아직 수정이 되지 않습니다.

member_nick_change.php 파일이 아직 없기 때문입니다.


member_nick_change.php

2022-08-29-101닉네임

2022-08-29-102닉네임


확인

2022-08-29-103닉네임

2022-08-29-104닉네임

닉네임이 변경 되었습니다.


이제 회원가입 부분을 시작해 보겠습니다.

member_register.php
<!doctype html>
<html>
	<!-- head 부분 -->
	<head> 
		<!-- 상단 title -->
		<title>회원 가입</title>	
		<!-- CSS Style 지정 -->
		<link rel="stylesheet" href="../style_contents.css" type="text/css">
		<script>
			function ck(){				
				if(document.mform.user_id.value == "" || document.mform.user_id.value.length < 4 || document.mform.user_id.value.length > 12){
					alert("아이디를 다시 입력하세요.");
					mform.user_id.focus();
					return false;
				}
				if(document.mform.user_id.value=="admin" || document.mform.user_id.value=="master" || document.mform.user_id.value=="root"){
					alert("사용할 수 없는 계정입니다.");
					mform.user_id.focus();
					return false;
				}
				if(document.mform.name.value == ""){
					alert("이름 다시 입력하세요.");
					mform.name.focus();
					return false;
				}
				if(document.mform.user_pw1.value == "" || document.mform.user_pw1.value.length < 6 || document.mform.user_pw1.value.length > 20){
					alert("비밀번호를 다시 입력하세요.");
					mform.user_pw1.focus();
					return false;
				}
				if(document.mform.user_pw1.value != document.mform.user_pw2.value){
					alert("비밀번호가 일치하지 않습니다.");
					mform.user_pw2.focus();
					return false;
				}
				document.mform.submit();
			}
		</script>
	</head>
	<body>
		<!-- 화면 상단 header 부분 -->
			<iframe src="../head.php" id="bodyFrame" name="body" width="100%" frameborder="0"></iframe>

		<!-- 화면 하단 body 부분 -->
		<div id="register_contents"  class="contents">			
		<form name="mform" method="post" action="member_register_ok.php">
			<table width="550" cellpadding="3" class="grayColor">
				<tr>
				<th colspan="2" style="background-color: #323232" >
					<font style="color: white; font-size: 150%;" >회 원 등 록</font>
				</th>
				</tr>
				<tr>
					<th width="120px"><font>*ID</font></th>
					<td>
						<input type="text" name="user_id" size="15" maxlength="12">
						&nbsp;&nbsp;&nbsp;<font style="color:red;">4~12(영문/숫자)</font>
					</td>
				</tr>
				<tr>
					<th><font>*이   름</font></th>
					<td><input type="text" name="name" size="15" maxlength="10"></td>
				</tr>
				<tr>
					<th><font>*비밀번호</font></th>
					<td>
						<input type="password" name="user_pw1" size="20" maxlength="20">
						&nbsp;<font style="color:red;">6~20(영문/숫자/특수문자)</font>
					</td>
				</tr>

				<tr>
					<th><font>*비밀번호 확인</font></th>
					<td><input type="password" name="user_pw2" size="20" maxlength="20"></td>
				</tr>
				<tr>
					<th><font>나이</font></th>
					<td><input type="number" name="age" size="30" min="0" max="150"></td>
				</tr>
				<tr>
					<th><font>닉네임</font></th>
					<td><input type="text" name="nick" size="30" maxlength="30"></td>
				</tr>				
				<tr>
					<th><font>EMAIL</font></th>
					<td><input type="text" name="email" size="30" maxlength="30"></td>
				</tr>
			</table>
			<p>
				<font size=2>* 는 필수 입력 항목입니다.</font><br/><br/>
				<input type="button" value="등록" onclick="ck();" class="btn_default btn_gray" >
				<input type="reset" value="삭제" class="btn_default btn_gray" >
			</p>
		</form>
		</div>
	
	</body>
</html>


member_register_ok.php
<?php
    error_reporting(E_ALL);
	ini_set("display_errors", 1);
    
    // $_SESSION 변수 사용 선언
    session_start();

    // DB연결 페이지 
    require("../dbcon.php");

    //member_register.php 에서 POST method로 전달한 값을 변수에 입력할때 
    $id = $_REQUEST['user_id'];     
    $name = $_POST['name'];    
    $pw1  = $_POST['user_pw1']; 
    $pw2  = $_POST['user_pw2'];     
    $age  = $_POST['age'];    
    $nick  = $_POST['nick'];     
    $email  = $_POST['email'];
    
  // nickname,age 가 입력이 안되서 들어온 경우 
  if(!$nick) $nick=$name;
  if(!$age) $age=0;

  // 중복 ID 회원이 가입 되는것을 확인 
  //$strSQL = "select u_id from member where u_id='$id'";
  $strSQL = "select u_id from member where u_id='".$id."'";
  $rs = mysqli_query($conn,$strSQL);
  $rs_arr = mysqli_fetch_array($rs);

  //SELECT 결과가 있다 : 참 , 없다 : 거짓 
  if($rs_arr)
  {
      echo "<script>
                  alert('중복 회원 ID 회원 가입 실패!');
                  history.back();
                  </script>";
  }
}else{
    $strSQL = "insert into member set u_id='$id', u_pass='$pw1', u_name='$name', nickname='$nick', age=$age, email='$email', reg_date=now()";
    #mysql_query($strSQL,$conn);
    mysqli_query($conn,$strSQL);
//$rs_arr = mysql_fetch_array($rs);
$rs_arr = mysqli_fetch_array($rs);
    echo "<script>
        alert('회원 가입을 축하드립니다!!');
        location.replace('../index.php');
    </script>";
}

   //echo "$id";
   //echo "&nbsp";
   //echo "$name";
   //echo "<br>\n";
   //echo "$pw1";
   //echo "&nbsp";
   //echo "$pw2";
   //echo "<br>\n";
   //echo "$age";
   //echo "&nbsp";
   //echo "$nick";
   //echo "&nbsp";
   //echo "$email";

    // SQL문 작성
   $strSQL = "insert into member set u_id='$id' , u_pass='$pw1' , u_name='$name' , nickname='$nick', age='$age', email='$email', reg_date=now()";
    
   // SQL문 실행
    mysqli_query($conn,$strSQL);

    // DB연결 종료
    mysqli_close($conn);
?>


회원가입 확인

2022-08-29-106회원가입

2022-08-29-107회원가입

2022-08-29-108회원가입


회원정보 수정 부분 입니다.

member_info.php
<!doctype html>
<html>
	<!-- head 부분 -->
	<head> 
		<!-- 상단 title -->
		<title>회원 정보</title>
		<!-- CSS Style 지정 -->
		<link rel="stylesheet" href="../style_contents.css" type="text/css">
		<script>
			function ck(){	
				if(!document.mform.user_pw1.value == "" && document.mform.user_pw1.value.length < 6 || document.mform.user_pw1.value.length > 20){
					alert("비밀번호를 다시 입력하세요.");
					mform.user_pw1.focus();
					return false;
				}
				if(document.mform.user_pw1.value != document.mform.user_pw2.value){
					alert("비밀번호가 일치하지 않습니다.");
					mform.user_pw2.focus();
					return false;
				}
				document.mform.submit();
			}
		</script>	
	</head>
	<body>
		<!-- 화면 상단 header 부분 -->
			<iframe src="../head.php" id="bodyFrame" name="body" width="100%" frameborder="0"></iframe>
		<!-- 화면 하단 body 부분 -->
		<div id="info_contents" class="contents">	
		<?php 
			session_start(); 
			if(!$_SESSION[user_id]){
				echo "<script>
					alert('로그인 후 이용하세요!');
					location.replace('member_login.php')</script>";
				exit;
			}
			
			require "../dbcon.php";
			$strSQL="select * from member where u_id='$_SESSION[user_id]'";
			$rs = mysqli_query($conn, $strSQL);
			$rs_arr = mysqli_fetch_array($rs);

			if($_GET[ch]==1)
				echo "<h5>성공적으로 변경되었습니다.</h5>";
			else if($_GET[ch]==2)
				echo "<h5>회원정보를 변경하지 못하였습니다.</h5>";
		?>
			<form name="mform" method="post" action="member_info_change.php">
			<table width="500" cellpadding="3" class="grayColor">
				<tr>
				<th colspan="2" style="background-color: #323232" >
					<font style="color: white; font-size: 150%;" >회 원 정 보</font>
				</th>
				</tr>
				<tr>
					<th width="120px"><font>*ID</font></th>
					<td><?=$rs_arr[u_id]?></td>
				</tr>
				<tr>
					<th><font>*이   름</font></th>
					<td><?=$rs_arr[u_name]?></td>
				</tr>
				<tr>
					<th><font>*비밀번호</font></th>
					<td>
						<input type="password" name="user_pw1" size="20" maxlength="20">
						&nbsp;<font style="color:red;">6~20(영문/숫자/특수문자)</font>
					</td>
				</tr>

				<tr>
					<th><font>*비밀번호 확인</font></th>
					<td><input type="password" name="user_pw2" size="20" maxlength="20"></td>
				</tr>
				<tr>
					<th><font>나이</font></th>
					<td><input type="number" name="age" size="30" min="0" max="150" value=<?=$rs_arr[age]?>></td>
				</tr>
				<tr>
					<th><font>닉네임</font></th>
					<td><input type="text" name="nick" size="30" maxlength="30" value=<?=$rs_arr[nickname]?>></td>
				</tr>				
				<tr>
					<th><font>EMAIL</font></th>
					<td><input type="text" name="email" size="30" maxlength="30" value=<?=$rs_arr[email]?>></td>
				</tr>
			</table>
			<p>
				<font size=2>* 는 필수 입력 항목입니다.</font><br/><br/>
				<input type="button" value="수정" onclick="ck();" class="btn_default btn_gray" >
				<input type="reset" value="삭제" class="btn_default btn_gray" >
			</p>
		</form>
		</div>
	</body>
</html>


member_info_change.php
<?php
		session_start();
		require "../dbcon.php";

		$pw1=$_POST["user_pw1"];
		$pw2=$_POST["user_pw2"];
		$age=$_POST["age"];
		$nick=$_POST["nick"];
		$email=$_POST["email"];
		if(!$nick) $nick=$_SESSION[nickname];

		$strSQL = "update member set nickname='$nick' ";

		if($pw1) $strSQL .= ", u_pass='$pw1'";
		if($age) $strSQL .= ", age=$age";
		if($email) $strSQL .= ", email='$email'"; 

		$strSQL .= " where u_id='$_SESSION[user_id]'";
		$rs = mysqli_query($conn, $strSQL);
		if($rs){
			$_SESSION[nickname]=$nick;
			header("Location: member_info.php?ch=1");
		}else{
			header("Location: member_info.php?ch=2");
		}

?>


수정 확인

2022-08-29-109수정




Board
게시판 만들기

upload용 디렉터리 생성

2022-08-29-110업로드


DB에서 Board 테이블 확인

2022-08-29-111보드확인


board_list.php
<!doctype html>
<html>
	<!-- head 부분 -->
	<head>
		<!-- 상단 title -->
		<title>게시판</title>
		<!-- CSS Style 지정 -->
		<link rel="stylesheet" href="../style_contents.css" type="text/css">
	</head>
	<body>
		<!-- 화면 상단 header 부분 -->
		<iframe src="../head.php" id="bodyFrame" name="body" width="100%" frameborder="0"></iframe>
		<!-- 화면 하단 body 부분 -->
		<div id="board_contents" class="contents">
			<table width="600" border="1">
			<!-- 제목 -->
			<tr>
			<th colspan="5" style="background-color: #323232" >
				<font style="color: white; font-size: 150%;" >게 시 판</font>
			</th>
			</tr>
			<tr bgcolor="#c8c8c8">
				<th width="7%"><font>번호</font></th>
				<th width="41%"><font>제목</font></th>
				<th width="15%"><font>작성자</font></th>
				<th width="30%"><font>등록일</font></th>
				<th width="7%"><font>조회</font></th>
			</tr>
		<?php
			require "../dbcon.php";
			$strSQL = "";
			// 키워드 조회
			if($_GET[keyword]){
				$key = $_GET[keyword];
				$k_s = $_GET[k_s];
				switch($k_s){
					case '1':
						$strSQL="select * from board where strSubject like '%$key%' order by strNumber desc"; break;
					case '2':
						$strSQL="select * from board where strContent like '%$key%' order by strNumber desc"; break;
					case '3':
						$strSQL="select * from board where strName like '%$key%' order by strNumber desc"; break;
					default:
						$strSQL = "select * from board order by strNumber desc";
				}
			}else{
				// 키워드 없으면 전체 조회
				$strSQL = "select * from board order by strNumber desc";
			}
			//$rs = mysql_query($strSQL);
			$rs = mysqli_query($conn, $strSQL);
			
			//레코드 셋의 갯수 반환 
			$rs_num = mysqli_num_rows($rs);
			
			// 연결 객체 해제 
			mysqli_close($conn);

			// 조회된 결과 없을 경우
			if($rs_num == 0): ?>
				<tr>
					<td colspan="5" class="center"><font><b>등록된 게시물이 없습니다.</b></font></td>
				</tr>

		<?php	else:
			// 조회된 결과 있을 경우
				while($rs_arr = mysqli_fetch_array($rs)){
					$b_num = $rs_arr["strNumber"];
					$b_name = $rs_arr["strName"];
					$b_email = $rs_arr["strEmail"];
					$b_sub = $rs_arr["strSubject"];
					$b_no = $rs_arr["viewCount"];
					$b_date = $rs_arr["writeDate"];
		?>
					<tr>
						<td width="7%"><font size="2"><?=$b_num;?></font></td>
						<td width="41%"><font size="3"><a href="board_view.php?num=<?=$b_num;?>"><?=$b_sub;?></a></font></td>
						<td width="15%"><font size="3"><?=$b_name;?></font></td>
						<td width="30%"><font size="1"><?=$b_date;?></font></td>
						<td width="7%"><font size="2"><?=$b_no;?></font></td>
					</tr>
		<?php	}
			endif; ?>
			</table>
			<br/>
			<p align="center">
			<!-- 글쓰기 버튼 -->
			<input type="button" value="글쓰기" class="btn_default btn_gray" onclick='location.replace("board_write.php")'>
			<br/>
			<br/>
			<!-- 검색 -->
		<?php
				if($key)
					echo "<font size=2>[$key] 검색 결과입니다.</font>";
				else
					echo "<font size=2>전체 글 검색 결과입니다.</font>";
			?>
			<form action="board_list.php">
				<select name="k_s">
					<option value="1">글제목</option>
					<option value="2">글내용</option>
					<option value="3">작성자</option>
				</select>
				<input type="text" name="keyword">
				<input type="submit" class="btn_default btn_gray" value="검색">
			</form>
			</p>
		</div>
	</body>
</html>


WebTest.board 레코드를 1줄 입력

2022-08-29-114게시판추가


게시판 확인

2022-08-29-112게시판


board_write.php
<!doctype html>
<html>
	<!-- head 부분 -->
	<head>
		<!-- 상단 title -->
		<title>게시판</title>
		<!-- CSS Style 지정 -->
		<link rel="stylesheet" href="../style_contents.css" type="text/css">
		<script>
			function ck(){
				if(document.wform.name.value == ""){
					alert("이름을 입력해 주세요.");
					document.wform.name.focus();
					return false;
				}
				if(document.wform.pw.value == ""){
					alert("비밀번호를 입력해 주세요.");
					document.wform.pw.focus();
					return false;
				}
				if(document.wform.sub.value == ""){
					alert("제목을 입력해 주세요.");
					document.wform.sub.focus();
					return false;
				}
				if(document.wform.cont.value == ""){
					alert("내용을 입력해 주세요.");
					document.wform.cont.focus();
					return false;
				}
				document.wform.submit();
			}
		</script>
	</head>
	<body>
		<!-- 화면 상단 header 부분 -->
		<iframe src="../head.php" id="bodyFrame" name="body" width="100%" frameborder="0"></iframe>
		<!-- 화면 하단 body 부분 -->
		<div id="board_contents" class="contents">
			<?php
				session_start();
				if($_SESSION[user_id]){
					require "../dbcon.php";
					$strSQL="select u_name,email from member where u_id='$_SESSION[user_id]'";
					$rs = mysqli_query($conn, $strSQL);
					$rs_arr = mysqli_fetch_array($rs);
					$name = $rs_arr[u_name];
					$email = $rs_arr[email];
				}
			?>
			<form name="wform" method="post" action="board_write_ok.php" enctype="multipart/form-data">
				<table width="600" class="grayColor">
					<tr>
						<th colspan="5" style="background-color: #323232" >
							<font style="color: white; font-size: 150%;" >게 시 글 작 성</font>
						</th>
					</tr>
					<tr>
						<th width="100"><font>이  름</font></th>
						<td><input type="text" name="name" size="11" value="<?=$name;?>"></td>
					</tr>
					<tr>
						<th><font>비밀번호</font></th>
						<td><input type="password" name="pw" size="12"></td>
					</tr>
					<tr>
						<th><font>이메일</font></th>
						<td colspan="3"><input type="text" name="email" size="40" value="<?=$email;?>"></td>
					</tr>

					<tr>
						<th><font>제  목</font></th>
						<td colspan="3"><input type="text" name="sub" size="40"></td>
					</tr>
					<tr>
						<th><font>HTML적용</font></th>
						<td colspan="3">
							<input type="radio" name="tag" value="T" checked><font size="3">적용</font>
							<input type="radio" name="tag" value="F"><font size="3">비적용</font>
						</td>
					</tr>
					<tr>
						<th><font>내  용</font></th>
						<td colspan="3" align="center"><textarea name="cont" cols="60" rows="10" style="border: 0px;"></textarea></td>
					</tr>
					<tr>
						<th><font>파일첨부</font></th>
						<td colspan="3"><input type="file" name="att_file"><font size="2">&nbsp;&nbsp;(최대 4MB)</font></td>
					</tr>
				</table>
			</form>

			<p align="center">
				<input type="button" value="등록" class="btn_default btn_gray" onclick='ck();'>
				<input type="reset" value="다시작성" class="btn_default btn_gray" >
				<input type="button" value="목록" class="btn_default btn_gray" onclick="location.replace('board_list.php');">
			</p>
		</div>
	</body>
</html>


게시판 작성 확인

2022-08-29-113게시판


board_write_ok.php
<?php

	$b_name=$_POST["name"];
	$b_pw=$_POST["pw"];
	$b_email=$_POST["email"];
	$b_sub=$_POST["sub"];
	$b_cont=$_POST["cont"];
	$b_tag=$_POST["tag"];

	// html 사용안하는 게시글은 html encoding 처리
	if($b_tag == "F"){
		$b_cont = htmlspecialchars($b_cont);
	}

	// file 정보 받기
	// $_FILES : form 에서 file type으로 넘어오면 여러가지 정보가 넘어오는데 이런 정보를 받아주는 슈퍼글로벌 변수
	$f_error=$_FILES["att_file"]["error"];
	if($f_error==0){
		$f_name=$_FILES["att_file"]["name"];
		$f_path="upload/".$f_name;
		$f_tmp=$_FILES["att_file"]["tmp_name"];
		$f_size=$_FILES["att_file"]["size"];

		// 같은 이름의 파일이 있을 경우 이름 뒤에 숫자 붙이기
		$f_name_only=substr($f_name,0,strrpos($f_name,'.'));	// 파일이름 중 확장자를 제외한 이름
		$f_name_ext=substr($f_name,strrpos($f_name,'.'));	// 파일이름 중 확장자

		for($i=1; is_file($f_path); $i++){	// 같은 이름의 파일이 있으면 i 값을 1씩 증가시키며 반복
			$f_name_only=$f_name_only."(".$i.")";	// 파일이름 뒤에 (번호) 추가
			$f_path="./upload/".$f_name_only.$f_name_ext;	// 파일 경로 재설정
		}
		$f_rename = $f_name_only.$f_name_ext;	//파일이름과 확장자 다시 합치기

	}else if($f_error!=4){
		echo "<script>alert('파일 업로드 실패($f_error)');
			history.back();</script>";
			exit;
	}
	/*
	 echo "file error:".$_FILES['attachFile']['error'];
	************ 오류 코드 ***************************
	 0 : 성공
	 1 : php.ini 의 upload_max_filesize 보다 큽니다.
	 2 : html 폼에서 지정한  max file size 보다 큽니다.
	 3 : 파일이 일부분만 전송되었습니다.
	 4 : 파일이 전송되지 않았습니다.
	 6 : 임시 폴더가 없습니다.
	 7 : 디스크에 파일 쓰기를 실패하였습니다.
	 8 : 확장에 의해 파일 업로드가 중지되었습니다.
	*************************************************
	*/

	require "../dbcon.php";

	$strSQL="insert into board set strName='$b_name', strPassword='$b_pw', strEmail='$b_email', ";
	$strSQL.="strSubject='$b_sub', strContent='$b_cont', htmlTag='$b_tag',writeDate=now() ";
	if($f_error==0)
	{
		$strSQL.=", filename='$f_rename', filesize='$f_size'";
		$f_rs = move_uploaded_file($f_tmp, $f_path);
	}

	//$rs = mysql_query($strSQL);
	$rs = mysqli_query($conn,$strSQL);
	if($rs){
		echo "<script>alert('글이 성공적으로 등록 되었습니다.');
			location.replace('board_list.php');</script>";
	}else{
		echo "<script>alert('글을 등록하는데 실패하였습니다.');
			history.back();</script>";
	}

?>


게시글 올려보기

2022-08-29-115글작성

2022-08-29-116글작성


board_view.php
<!doctype html>
<html>
	<!-- head 부분 -->
	<head>
		<!-- 상단 title -->
		<title>게시판</title>
		<!-- CSS Style 지정 -->
		<link rel="stylesheet" href="../style_contents.css" type="text/css">
		<script>
			function ck(){
				if(document.dform.b_pass.value==""){
					alert("비밀번호를 입력해주세요.");
					document.dform.b_pass.focus();
					return false;
				}
				document.dform.submit();
			}
		</script>
	</head>
	<body>
		<!-- 화면 상단 header 부분 -->
		<iframe src="../head.php" id="bodyFrame" name="body" width="100%" frameborder="0"></iframe>
		<!-- 화면 하단 body 부분 -->
		<div id="board_contents" class="contents">
		<?php
			session_start();
			require("../dbcon.php");

			// 글 조회 수 증가 시키기
			$r_num = $_GET["num"];
			$strSQL = "update board set viewCount=viewCount+1 where strNumber=".$r_num.";";
			//mysql_query($strSQL);
			mysqli_query($conn,$strSQL);

			// 글 내용 조회 해오기
			$strSQL = "select * from board where strNumber=".$r_num.";";
			//$rs = mysql_query($strSQL);
			$rs = mysqli_query($conn,$strSQL);
			//$rs_arr = mysql_fetch_array($rs);
			$rs_arr = mysqli_fetch_array($rs);

			$b_num = $rs_arr["strNumber"];
			$b_name = $rs_arr["strName"];
			$b_email = $rs_arr["strEmail"];
			$b_sub = $rs_arr["strSubject"];
			$b_cont = $rs_arr["strContent"];
			$b_tag = $rs_arr["htmlTag"];
			$b_no = $rs_arr["viewCount"];
			$b_date = $rs_arr["writeDate"];
			$b_fname = $rs_arr["filename"];
			$b_fsize = $rs_arr["filesize"];

			// html 사용안하는 게시글은 html encoding 처리
			if($b_tag == "F"){
				$b_cont = htmlspecialchars($b_cont);
			}
		?>

		<!--게시글 표시 테이블 -->
		<table width="600" border="1" cellpadding="2" class="grayColor">
			<tr>
				<th colspan="5" style="background-color: #323232" >
					<font style="color: white; font-size: 150%;" >내용 보기</font>
				</th>
			</tr>
			<tr>
				<th width="15%"><font>이름</font></th>
				<td width="35%"><font><?=$b_name;?></font></td>
				<th width="15%"><font>등록일</font></th>
				<td width="35%"><font><?=$b_date;?></font></td>
			</tr>
			<tr>
				<th width="15%"><font>이메일</font></th>
				<td width="35%"><font><a href="mailto:<?=$b_email;?>"><?=$b_email;?></a></font></td>
				<th width="15%"><font>조회</font></th>
				<td width="35%"><font><?=$b_no;?></font></td>
			</tr>
			<tr>
				<th width="15%"><font>제목</font></th>
				<td colspan="3"><font><?=$b_sub;?></font></td>
			</tr>
			<tr>
				<th width="15%"><font>내용</font></th>
				<td colspan="4" style="padding:15px 0;"><font><?=$b_cont;?></font></td>
			</tr>
			<tr>
				<th width="15%"><font><b>첨부 파일</b></font></th>
				<td colspan="3"><font>
		<?php
			// 첨부 파일 다운로드
			if($b_fname != ""){ ?>
					<a href="board_file_download.php?filename=<?php echo urlencode($b_fname);?>"><?=$b_fname;?>&nbsp;&nbsp;(<?=$b_fsize;?>바이트)</a>
		<?php	} ?>
				</font></td>
			</tr>
		</table>
		<br/>
		<p align="center">
			<form name="dform" method="post" action="board_delete_ok.php?num=<?=$r_num;?>">
				<font>비밀번호</font>
				<input type="password" name="b_pass" size="20">
				<input type="button" value="삭제" class="btn_default btn_gray" onclick="ck();">
				&nbsp;&nbsp;&nbsp;&nbsp;
				<input type="button" value="목록" class="btn_default btn_gray" onclick="history.back();">
		</p>
		</div>
	</body>
</html>


board_delete_ok.php
<?php

	$r_num = $_GET[num];
	$r_pass = $_POST[b_pass];

	require("../dbconn.php");
	
	$strSQL="select strNumber,strPassword,filename from board where strNumber=$r_num and strPassword='$r_pass'";

	$rs = mysqli_query($conn, $strSQL);
	$rs_arr = mysqli_fetch_array($rs);

	if($rs_arr){
		if(is_file("upload/$rs_arr[filename]")){		
			unlink("upload/$rs_arr[filename]");
		}
		$strSQL="delete from board where strNumber=$r_num";
		$rs = mysqli_query($conn, $strSQL);


		
		if($rs){
			echo "<script>alert('게시물이 삭제 되었습니다.');
			location.replace('board_list.php');</script>";
		}
	}else{
		echo "<script>alert('게시물을 삭제 할 수 없습니다.');
			history.back();</script>";
	}
?>


게시글 삭제

2022-08-29-118삭제

2022-08-29-119삭제




업데이트:

댓글남기기