Xampp와 php (2)

eg_kim·2024년 8월 28일

Xampp & php

목록 보기
2/2
post-thumbnail

Xampp와 php (2)

본격적으로 php를 사용하는 방법의 기초에 대해 알아보았다!

기초 적용하기

데이터를 전송하는 방법을 연습하기 위해 폼 html 양식을 간단하게 만들었다.

php 코드임을 선언해주는 표기! <?php ?>


input.php 를 생성해서 웹표준에는 완전히 맞지 않지만 간단한 양식만 만들었다.


post 방식으로 method를 선택했다면 insert.php에서 값을 가져오도록 해야 한다.
get방식도 같은 방법 사용!

$_(POST/GET)['(name값 전달)'] 이런식으로 작성한다.

변수를 선언하는 방법

javascript의 경우에는 var/let/const 를 사용하는데
php에서는 $ 가 변수 선언문이다.

php에서의 document.write

php 에서는 자바스크립트처럼 alert, document.write 등 화면에 출력해서 볼 수 있는 기능이 없다.
따라서 php에서 사용할 수 있는 값을 확인하는 방법은 echo 라는 방법이 있다.
또한 자바스크립트에서 document.write("점수"+score) 이라고 변수를 + 로 연결을 했다면, php 에서는 . 으로 연결한다.

post 방식으로 데이터 전송하기

<?php

//이전 페이지에서 값 가져오기
//$_POST[''] / $_GET['']
$u_name = $_POST['u_name'];
$u_id = $_POST['u_id'];
$pwd = $_POST['pwd'];

//$_POST['']

//값 확인
echo '<p> 이름:'.$u_name;
echo '<p> 아이디:'.$u_id;
echo '<p> 비밀번호:'.$pwd;
?>

(결과)

get 방식으로 데이터 전송하기

<?php

//이전 페이지에서 값 가져오기
//$_POST[''] / $_GET['']
$u_name = $_GET['u_name'];
$u_id = $_GET['u_id'];
$pwd = $_GET['pwd'];

//$_POST['']

//값 확인
echo '<p> 이름:'.$u_name;
echo '<p> 아이디:'.$u_id;
echo '<p> 비밀번호:'.$pwd;
?>


주소창에 사용자가 입력한 데이터가 함께 출력되는 모습을 볼 수 있다.
sexyjuju~~ (변의주 화이팅)


My-SQL 접속하기


1. bin 폴더로 이동하기


터미널을 열고 bin 폴더 경로로 이동한다.

2. mysql -h 호스트 -u 사용자 -p비밀번호

호스트가 localhostdlaus 생략이 가능하다.
사용자 이름은 windows 는 administrator/mac은 root이다.

따라서 mysql -u root 라고 작성한다.

3. Maria DB가 켜졌으면 show databases라고 입력한다.
show는 어떤 데이터가 들어있는지 확인하는 명령어이다.

데이터 베이스 생성/삭제/수정 명령어 이해하기! (DCL, DDL, DML)

DCL - grant, revoke
DDL - create, drop, alter
DML - insert, delete, update, select

table(데이터가 저장되는 곳)
insert(테이블 생성) == create
drop(테이블 삭제) == delete
update(데이터 수정) == update
select(검색)

데이터베이스 생성하기

Maria DB에서 데이터베이스 생성

create database (데이터베이스 이름);

ex) create database front;

데이터베이스 사용하기

use (데이터베이스 이름);

ex) use front;

테이블 내의 내용 확인하기

show tables;

그런데 아직 테이블 내의 내용이 아무것도 없기 때문에 새로운 내용을 생성해야 한다.

테이블 생성하기

create table (테이블명)(

create table members(
-> 회원 관리를 위한 데이터베이스 생성이므로 members라고 이름을 지었다.

실제로 사용자에게 보여지는 부분은 id, pwd, 이름 뿐이지만 데이터베이스에서 설계해야할 부분은 idx, 가입 날짜 등 사용자에게 보여지지 않는 부분들도 생각해야 한다.


DB: front

table: members

항목 | 컬럼명 | 데이터 타입(길이) | default | 키 |

===================================================================

idx | idx | int | auto_increment | pk |


이름 | u_name | varchar(20) | not null | - |


아이디 | u_id | varchar(20) | not null | - |


비밀번호 | pwd | varchar(20) | not null | - |


날짜 | reg_date | date | now date |


int -> 숫자
varchar(num) -> 문자열
text -> 긴 문자열

char vs varchar vs text

my sql 기준 char는 고정 길이 값을 사용하고 varchar는 가변 길이 값을 사용한다.

length가 필요하다!!

만약에 이름 text 칸이 char(10)로 되어있는데 실제 데이터는 3글자만 입력하게 되면 데이터 베이스는 여기에 10칸을 채우기 위해서 데이터 베이스가 자동으로 스페이스바를 7번을 더 눌러서 무조건 채워버린다. 따라서 char는 입력 받는 데이터의 길이가 항상 같은 경우에 쓰는 것이 좋다. ex) 성별/주민등록번호 등

반대로 글자의 수가 변화할 수 있는 곳에는 varchar를 사용하도록 한다.
ex) 게시판의 제목, 이름 등

더 긴 텍스트에는 text를 사용하면 된다.

제약

공통된 규칙을 제약이라고 하는데 이름, 아이디, 비밀번호의 경우 필수 입력 사항이기 때문에 not null 로 설정하면 비어있지 않도록 했다.

default

기본값을 말한다.
예를들어 쇼핑몰 앱을 운영한다고 가정했을 때, 회원가입을 하면 5000P를 지급한다고 하면 기본값은 5000으로 지정한다.

(정리) 테이블 입력하기

create table members(
idx int auto_increment primary key,
u_name varchar(20) not null,
u_id varchar(20) not null,
pwd varchar(20) not null,
reg_date date ,
);

생성한 테이블 내용 확인하기

desc (테이블명);

ex) desc members;

들어오는 데이터 확인하기

select (field명) || select * from (테이블명);

ex) select idx, u_name;
ex) select * from members;

데이터를 입력해주는건 페이지들이 해주기 때문에 데이터를 입력하는 쿼리문은 직접 입력해야 한다.

데이터 입력하기

insert into (테이블명) values();

ex) 만약 모든 필드에 값을 직접 입력하고 싶다면
insert into memers values(a,b,c,d,e);

그런데 위에서 생성한 데이터 테이블의 경우, idx는 자동생성이기 때문에 직접 입력할 필요가 없다.

이런 경우에는 당연히 값을 4개만 적어야 하는데 입력하는 칸은 5개고 입력받은 값이 4개밖에 없으면 데이터베이스가 어디에 데이터를 저장해야 하는지 이해하지 못한다.

따라서 전체 필드 값에 다 직접 값을 입력한다면 필드 개수만큼 입력하면 되지만 일부 필드에만 값을 입력하는 경우에는 table 이름 옆에 filed이름을 적고 values를 적어야한다.

ex) inset into members(fb,fc,fd,fe) values(b,c,d,e);

주의사항
1. 필드의 개수와 값의 개수는 항상 같아야 한다!
2. 값은 순차적으로 maping 된다!

(예시)

insert into members(u_name, u_id, pwd, reg_date) values('관리자', 'admin', '1234', '2024-08-28');

데이터베이스에서 문자열 처리를 할 땐 큰따옴표 말고 작은따옴표를 사용하는 것이 좋다.

enter 눌렀을 때 Quary OK 가 나오면 정상적으로 입력 된 것이다.

다시 확인하고 싶으면 select * from members; 해서 확인할 것!

데이터 삭제 - 조건절(where)

delete from (테이블명) where (필드명)=(순서);

ex) delete from members where idx=2;

조건절을 설정하지 않고 delete from members 라고 입력한다면 데이터베이스 안에 있는 내용들이 모두 사라지게 된다.
따라서 update, delete 할 때 where절을 사용해야 한다.

이때 2번을 지우고 새로운 데이터를 추가하게 되면 1번 다음 새로운 2번이 생성되는 것이 아니라 3번으로 입력된다.

또한 u_name에 ???<< 이라고 뜨는데 이를 보아 database 에도 charset개념이 존재함을 알 수 있다.

응용

select * from (테이블명) where (필드명)=(순서);

select * from members order by idx desc limit 1;

테이블 삭제

drop table (테이블명);

ex) drop table members;

이후 show members;를 하면 아무것도 보여지지 않는다.

drop database (데이터베이스명);

ex) drop database front;

마찬가지로 이후 show databases;를 하면 삭제된 모습을 볼 수 있다.

GUI 도구

phpMyAdmin

데이터베이스를 그래픽 방식으로 사용할 수 있도록 도와주는 도구, localhost/phpmyadmin

데이터베이스 생성하기

새 데이터베이스 만들기 > 데이터베이스 이름 입력 > UTF-8_general_ci 문자셋 선택 > 만들기

테이블 생성하기

table 이름 작성 후 입력

항목 | 컬럼명 | 데이터 타입(길이) | default | 키 |

========================================================

idx | idx | int | auto_increment | pk |


이름 | u_name | varchar(20) | not null | - |


아이디 | u_id | varchar(20) | not null | - |


비밀번호 | pwd | varchar(20) | not null | - |


날짜 | reg_date | date | now date |


sql 미리보기 > 현재 만드는 코드 자동으로 생성됨
새로 세팅을 해야하는데 myadmin은 접근할 수 없고 터미널만 사용할 수 있는 경우에 sql미리보기를 클릭해서 내용을 복사해두고 사용하는 것도 유용하다.

저장 > 테이블 생성

저장하고 나면 desc members와 같은 결과의 화면이 생성된다.

1, 컬럼추가 , ~다음에, 실행이 있는데 원하는 곳에서 컬럼을 추가할 수 있다.
-> alter table에서 할 수 있는 일! (예를 들어, 6칸짜리 테이블을 5칸짜리 테이블로 만들 때 사용할 수 있다.)

데이터베이스 연결하기

php 경우는 데이터베이스 연결하는 방법이 편리하게 되어있어서 쉽게 연결하여 사용할 수 있다.

//데이터베이스 연결
mysqli_connect('localhost','root','(테이블명)')

mysqli == 데이터베이스 연결 정보

실제 데이터베이스에 전달하는 역할은 mysqli_query가 한다!

데이터베이스에서 사용하는 언어는 sql이라고 한다.
s: string or structure(구조적인)
q: quary
l: language

따라서 sql에서 사용하는 명령어는 query 라고 한다!

DML
C(create) - insert
R(read) - select(결과값이 리턴된다.)
U(update) - update
D(delete) - delete

//쿼리 작성
$sql = ""
insert into TN('FN','FN','FN','FN') values('a','b','c','d')

따옴표 주의!!!

<?php

//이전 페이지에서 값 가져오기
//$_POST[''] / $_GET['']
$u_name = $_POST['u_name'];
$u_id = $_POST['u_id'];
$pwd = $_POST['pwd'];

//$_POST['']

//값 확인
echo '<p> 이름:'.$u_name;
echo '<p> 아이디:'.$u_id;
echo '<p> 비밀번호:'.$pwd;

$now = date('Y-m-d');

//데이터베이스 연결
$dbcon = mysqli_connect('localhost','root','front') or die('접속실패');

//쿼리 작성
// $sql = "insert into members(u_name, u_id, pwd, reg_date) values('$u_name','$u_id','$pwd','$now') "

 //insert into members(u_name, u_id, pwd, reg_date) values('$u_name','$u_id','$pwd','$now')

 $sql="inset into members(u_name, u_id, pwd, reg_date)";
 $sql.="values('$u_name', '$u_id', '$pwd', '$now')";

mysqli_query($dbcon,$sql)
?>

date는 database에서 기본값을 자동으로 시간이 들어가게 만들수도 있고, 사용자 정의에 의해 함수를 만들어서 생성할수도 있는거고, 위의 코드처럼 구해서 넣을 수도 있다.

쿼리 작성이 길어지면 연결연산자를 이용할 수도 있다.
또한 문자열 내부에 변수도 문자열 처리되지 않고, 변수처리가 되고 있음을 알 수 있다.


쿼리를 작성한 후 폼을 전송했을때 오류 없이 phpMyAdmin에서 잘 출력되면 ok

그러나 데이터를 전달받는 php 파일에는 문자셋에 관련된 선언이 없기 때문에 테이블에 한글이 제대로 출력되지 않는다. 따라서 문자셋 선언을 해줘야 한다.


문자셋 선언

mysqli_set_charset() 을 이용하면 된다.

mysqli_set_charset( $dbcon,'utf8');

첫 번째 인자는 데이터 베이스를 연결하는 $mysqli(변수)를 넣었고, 두 번째 인자는 string $charset으로 문자열 문자셋을 넣어주면 되는데 utf8을 사용했다.

문제점

정보 입력받는 페이지 -> 처리페이지 -> 데이터베이스 순서로 오고 가고 리턴되면 결과 페이지가 보여지는데 결과 페이지는 input(정보를 입력받는 페이지)일수도 있다.
그런데 여기에서 결과 페이지를 벗어나지 못하면 같은 데이터가 계속 저장될 수 있다.

데이터베이스의 null이 '아니오'로 설정되어있기 때문에 javascript에서 값이 없을 때 넘겨지지 않도록 해야하는거다. 따라서 javascript에서 규칙에 맞는것만 insert.php에 전달이 되었을 거고, 그대로 데이터베이스에 저장이 되었을 거다.

따라서 list.php 파일을 만들어서 insert 되면 list로 이동하도록 만들었다.

//insert.php
<script>
    //리디렉션
    location.href="list.php";
</script>

php는 html과 성질이 비슷하기 때문에 스크립트 코드를 작성할 수도 있다.

제출하면 list에 나타나게 하기

데이터베이스 연결 후 DB에 전달할 query를 작성한 뒤 전송하고, 전체 데이터를 가져올 거다.
php파일은 외부 파일을 불러울 때 include 라고 한다.

select * from (table name)
= 전체 데이터를 불러오는 query

데이터베이스에 저장된 데이터 불러오기

mysqli_fetch_array()

<?php
    while($array = mysqli_fetch_array($result)){
    ?>
    <tr>
        <td><?php echo $array["u_name"] ?></td>
        <td><?php echo $array["u_id"] ?></td>    
        <td><?php echo $array["pwd"] ?></td>
    </tr>
    <?php 
    };
    ?>

(전체코드)

<?php
    //DB 연결하기
    include "inc.dbcon.php";

    //DB에 전달할 query 작성하기
    $sql = "select * from members";

    //query 전송
   $result=  mysqli_query($dbcon, $sql);

    //전체데이터 가져오기(정보를 가져와야 하기 때문에)
    $total = mysqli_num_rows($result);

?>

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h2>사용자 목록(<?php echo $total ?> 명)</h2>
    <table border ="1">
    <tr>
        <th>이름</th>
        <th>아이디</th>
        <th>비밀번호</th>
    </tr>

    <?php
    while($array = mysqli_fetch_array($result)){
    ?>
    <tr>
        <td><?php echo $array["u_name"] ?></td>
        <td><?php echo $array["u_id"] ?></td>    
        <td><?php echo $array["pwd"] ?></td>
    </tr>
    <?php 
    };
    ?>

    </table>
</body>
</html>

데이터 업데이트

정보 보기페이지와 수정페이지를 함께 만들어보자!

데이터 수정 및 삭제하기

사용자 정보를 수정할 수 있는 페이지를 생성하기 위해 input.php를 복사하여 info.php 파일을 생성했다.
-> 회원가입 페이지의 입력하는 개인정보는 보통 회원 정보 수정할 때 필요한 폼 정보와 거의 일치하기 때문에 복사하여 임시로 만들었다!

이 페이지는 클릭한 사용자의 정보를 가져올 수 있어야 한다!

php는 기본적으로 페이지 통신이 가능하다!

따라서 수정하기 버튼을 눌렀을 때 사용자의 데이터를 가져올 수 있어야 하는데 이때

<form action="insert.php?id=<?php echo $array['idx']; ?>" method="post">

이렇게 나타낼 수 있다.

사용자를 구분짓기 위해 생성했던 idx를 이용한 것이고, php는 코드 어디든 <?php ?> 형태로 입력해서 사용할 수 있다.


(수정페이지에 데이터 가져오기)

<?php 
//사용자 id 가져오기
$id = $_GET["id"];

//db연결
include "inc/dbcon.php";

//쿼리작성
$sql = "select * from members where idx=".$id;

//쿼리 전송
$result = mysqli_query($dbcon,$sql);

//db에서 결과 가져오기
$array = mysqli_fetch_array($result);
?>

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>사용자 정보</title>
</head>
<body>
    <h2>정보수정</h2>
    <form action="insert.php?id=<?php echo $array['idx']; ?>" method="post">
    <p>
    이름
    <input type="text" name="u_name" value="<?php echo $array["u_name"]; ?>">
    </p>
    <p>
    아이디
    <input type="text" name="u_id" value="<?php echo $array["u_id"]; ?>">
    </p>
    <p>
    비밀번호
    <input type="text" name="u_pwd" value="<?php echo $array["pwd"]; ?>">
    </p>
    <button type="submit">전송</button>
    <button type="button" onclick="history.back()">뒤로가기</button>
    </form>
</body>
</html>

(수정한 데이터 데이터베이스에 저장하기)

update문 작성하는 방법

update (TableName) set (FieldName) ='',(FieldName)=''...

그러나 위 처럼 작성하면 모든 데이터에 적용되어버린다.
따라서 조건절이 필요하다.

update TN set FN='',FN='',FN='' where ...

모든 페이지에서 공통으로 사용할 수 있는 공통의 저장소가 필요한데 그 개념이 backend에서는 session 이라고 한다.
이걸 이용해서 로컬 저장소를 만들면 session storage라고 한다.
그러나 지금은 session 정보가 없기 때문에 info 페이지에서

 <h2>정보수정</h2>
    <form action="update.php?id=<?php echo $array['idx']; ?>" method="post">
    <input type="hidden" name="id" value="<?php echo $id;?>">

이렇게 아이디를 받아와서 사용하고

update페이지에서는

<?php

//이전 페이지에서 값 가져오기
//$_POST[''] / $_GET['']
$id = $_POST['id'];
$u_name = $_POST['u_name'];
$u_id = $_POST['u_id'];
$pwd = $_POST['pwd'];


$now = date('Y-m-d');

//데이터베이스 연결
include "inc/dbcon.php";

//쿼리 작성
$sql="update members set";
$sql .="u_name='$u_name',";
$sql .="u_id='$u_id',";
$sql .="pwd='$pwd'";
$sql .="where idx=$id";
//echo $sql;
//return false;

//쿼리 전송
mysqli_query($dbcon,$sql)

?>

<script>
    //리디렉션
    location.href="list.php";
</script>

아이디를 넘겨받았고, 쿼리가 insert에서 업데이트 된 부분만 다르다.

데이터 삭제하는 문장 작성하기

데이터 삭제같은 경우 사용자의 실수를 방지하는 용도로 확인창을 하나 더 넣어둘 수 있었다.
삭제같은 경우는 바로 delete.php 로 이동하는 것이 아니라, confirm을 담아둔 함수를 호출해서 실수를 방지할 수 있다.

Tip) alert과 confirm은 return value가 있고, 없고의 차이이다!

 <script>
        function del_user(){
            let ask = confirm("정말 삭제하시겠습니까?");
            if(ask){
                location.href = "delete.php"
            }
        }
    </script>

삭제할 때는 delete from (TableName) where ... 형식으로 조건절을 사용하여 수정해야 한다.

(삭제 데이터 넘겨받는 list.php 페이지)

<?php
    //DB 연결하기
    include "inc.dbcon.php";

    //DB에 전달할 query 작성하기
    $sql = "select * from members";

    //query 전송
   $result=  mysqli_query($dbcon, $sql);

    //전체데이터 가져오기(정보를 가져와야 하기 때문에)
    $total = mysqli_num_rows($result);

?>

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>사용자 목록</title>
    <script>
        function del_user(g_id){
            let ask = confirm("정말 삭제하시겠습니까?");
            if(ask){
                location.href = "delete.php?id="+g_id;
            }
        }
    </script>

</head>
<body>
    <h2>사용자 목록(<?php echo $total ?> 명)</h2>
    <table border ="1">
    <tr>
        <th>이름</th>
        <th>아이디</th>
        <th>비밀번호</th>
        <th>관리</th>
    </tr>

    <?php
    while($array = mysqli_fetch_array($result)){
    ?>
    <tr>
        <td><?php echo $array["u_name"] ?></td>
        <td><?php echo $array["u_id"] ?></td>    
        <td><?php echo $array["pwd"] ?></td>
        <td>
            <a href="info.php?id=<?php echo $array['idx']; ?>">수정</a>
            <a href="#none" onclick="del_user(<?php echo $array['idx']; ?>)">삭제</a>
        </td>
    </tr>
    <?php 
    };
    ?>

    </table>
</body>
</html>

(삭제 페이지 코드)

//delete.php

<?php

//이전 페이지에서 값 가져오기
$u_id = $_GET['id'];

//데이터베이스 연결
include "inc/dbcon.php";

//쿼리 작성
 $sql="delete from members where idx=$id";
 //echo $sql;
 //return false;
 
//쿼리 전송
$result = mysqli_query($dbcon,$sql)

?>

<script>
    //리디렉션
    location.href="list.php";
</script>

+) 추가

list.php에 사용자 추가 페이지로 연결되는 링크 만들기

    <p>
        <a href="input.php">추가</a>
    </p>
profile
오늘의 공부 기록📝

0개의 댓글