PHP, MySQL, HTML
Created: 2020년 5월 14일 오후 11:24 Updated: 2020년 5월 29일 오후 10:27
Apache, PHP, Mysql, phpmyadmin, html 기초 - 정동우
1. APM(Apache & PHP & MySQL) 기초

웹페이지를 서비스 하기 위해 가장 많이 사용되는 조합은 Apach server, PHP, MySQL server(APM)이다. 이것들이 어떻게 웹 페이지를 서비스 하는지 알아보자.
유저는 웹 상에서 제공되는 HTML 문서를 보며 여러가지 반응을 한다. 유저의 모든 반응에 대응하는 HTML 페이지를 제작할 수 있다면 HTML 만으로도 웹 페이지를 제작할 수 있다. 하지만 변수가 많아질수록 이는 불가능하다. HTML은 변수를 처리하는 기능 없이, 작성된 문서를 출력하는 기능만 있다. 쉽게 설명하자면 같은 사용자 정보 페이지라도 그 버튼을 누른 유저마다 다른 정보를 담은 페이지가 필요할 것이다. 등록된 유저마다 하나의 HTML 문서를 만들어 보여줄 수 있지만, 효율적인 관리라 보긴 힘들다. 이를 하나의 페이지로 가능하게 하는 언어가 PHP다. PHP 코드는 HTML 문서에서 HTML 코드보다 먼저 처리되어 하나의 페이지를 다양하게 출력할 수 있도록 해준다. 또한 PHP 코드는 MySQL 등 데이터 베이스 서버와 상호작용 가능하기 때문에, 웹 상에서 더욱 많은 데이터를 효율적으로 출력할 수 있다.
앞서 설명한 사용자 정보 페이지를 예로들어보자. 유저가 사용자 정보 버튼을 누를 때 유저의 ID를 전송해주고, 데이터 베이스에서 그 ID에 해당하는 유저의 정보를 PHP 변수를 통해 출력한다. 이때 출력된 PHP 변수는 HTML 처리보다 먼저 진행되어 최종적으로 HTML 문서 상에서는 변수가 아닌 상수로 출력된다. 이 순서는 중요하기 때문에 코드 예시를 들어보자.
<html>
<?php
$UserName = “JDW”;
?>
안녕하세요 <?php echo $UserName; ?>님!
</html><html>
안녕하세요 JDW님!
</html>PHP 변수의 값을 HTML 코드 중앙에 위치시키기 위해서는 두가지 방법이 있다. PHP 코드에서 HTML 코드까지 출력하는 방법과, HTML 코드 중간에 PHP 코드를 출력시키는 방법이 있다. 후자는 앞의 예제와 같고, 전자는 다음 예제 코드와 같다.
<?php
$UserName = “JDW”;
echo “안녕하세요 “.$UserName.”님!”;
?>두 코드의 결과는 같으므로, HTML 과 PHP 사이의 관계를 잘 생각하여 사용하면 된다.
클라이언트(유저)에게 이러한 HTML문서를 출력해 주는 서버가 APACHE 서버이다. APACHE 서버는 PHP 코드를 지원하고 완성된 HTML 문서를 유저에게 출력해주는 서버이다. APACHE 서버에서 관리 할 수 없는 큰 데이터들을 관리하기 위해 데이터베이스 서버를 이용하는데, 이 문서에서는 MySQL 데이터베이스 서버를 이용한다. MySQL 데이터베이스 서버를 이용하는 방법은 HTML과 PHP에 대한 이야기 후에 설명하겠다.
HTML 페이지 간 변수의 전송 방법은 크게 SESSION, POST, GET 3가지가 있다. SESSION은 클라이언트(유저)의 쿠키를 이용하여 변수를 저장해두고, 필요할 때 마다 저장된 SESSION 변수를 불러와서 사용 할 수 있다. 이 세션 변수를 사용하기 위해서는 코드의 가장 앞에
<?php
SESSION_START();
?>가 위치해야 된다. 이후 SESSION_START(); 함수가 선언된 PHP 문서에서는 SESSION 어레이를 사용할 수 있다.
$_SESSION[‘addr’]형태로 저장하고 불러와서 PHP 변수로 이용할 수 있다. 예를 들어보자면, 유저가 웹페이지에 로그인을 하면
$_SESSION[‘id’] = ‘userid'에 유저의 아이디를 저장해두고, 유저의 아이디가 필요한 페이지에서 같은 형태로 불러와 사용할 수 있다.
SESSION과 다른 두 방식의 큰 차이는 유지성에 있다. GET과 POST 방식의 전송 방식은 한 페이지에서 다음 페이지로만 데이터를 전송할 수 있는 반면에, SESSION 변수는 유저의 쿠키를 이용하여 어느 페이지에서도 해당 값을 불러올 수 있다. GET과 POST는 <FORM>태그를 이용하여 유저가 입력한 값들과 대량의 데이터들을 전송하기 유리하다. 기본적인 전송 폼은 아래 예제 코드와 같다.
<form name="writeForm" method=‘POST or GET' action=‘destination.php’>
<input type="text" name=“variable" placeholder=“description” value=“default value”>
<button type="submit" class="button" style="float:right;”>BUTTON</button>
</form>위 예제 코드의 결과는 유저가 텍스트를 입력할 수 있는 텍스트 창 하나와 BUTTON 이라고 적혀있는 버튼 하나다. 기능은 유저가 텍스트 창에 값을 적은 뒤 BUTTON이라 적힌 버튼을 누르면 destination.php 문서로 이동하고 variable 이라는 변수에 유저가 적은 값을 저장한다. destination.php 문서에서 해당 변수를 사용하기 위해서는
$variable = \$_POST[‘variable’];처럼 가져오거나,
EXTRACT($_POST);함수를 사용하여 모든 POST로 전송된 값을 어레이의 어드레스 이름의 변수에 저장하여 사용할 수 있다.
이 방법을 이용한 전송방법에는, FROM 태그에 method 옵션을 사용하여 GET과 POST 방법 둘 다 사용할 수 있다. 둘의 차이는 POST는 유저에게 노출되는 정보가 없다는 것 이고, GET의 방식은 URL(주소창)에 전송하는 데이터 값을 출력한다는 것 이다. GET을 이용한 전송을 이용한 페이지에 접속하면 URL이 다음과 같이 작성된다.
http://JDW.HJworld.com/JDW/destination.php?variable1=1234&&variable2=asdf
destination.php 라는 문서로 이동하였고, variable1 이라는 변수에 1234라는 값을, variable2 라는 변수에 asdf 라는 값을 전송한 것을 알 수 있다. 클라이언트가 URL을 수정할 경우 다른 값을 전송할 수 있기 때문에 FORM 태그를 이용한 전송에서는 이런 문제때문에 POST 방식을 추천한다.
GET 방식을 사용할 수 밖에 없는 경우가 있는데, 링크의 경우이다. <a href=‘destination.php?variable1=1234’>GO 코드와 같이 단순 글자 또는 버튼에 링크를 걸어 이동시켜야 하는 경우에는 GET 방식을 이용하여 전송한다. a 태그의 옵션중 href는 해당 페이지로 이동하는 옵션이고, 이때 목적 페이지에 GET 형식을 추가하여 데이터를 전송하는 방법이다. 이는 단순한 정보를 전송할 때 사용하고, 중요한 정보의 경우에는 form 태그의 hidden 타입을 사용해야된다. 자세한 설명은 FROM 태그에 대한 설명에서 진행하겠다.
MySQL은 관계형 데이터베이스 서버이다. 많은 데이터를 Database Server > Database > Table > Column 형태로 저장한다. 데이터 베이스 서버 안에 여러개의 데이터 베이스가 존재하고, 데이터 베이스 안에 여러가지 테이블이 있고, 테이블은 여러개의 컬럼으로 이루어진 데이터 목록이다. 데이터베이스 서버는 데이터를 효율적으로 관리하기 위해 컬럼을 INDEX KEY로 사용한다. 테이블에는 단 하나의 PRIMARY KEY Column이 존재하고 해당 컬럼에는 중복된 데이터가 등록될 수 없고 데이터의 메인 INDEX로 사용된다. 다른 INDEX KEY로는 UNIQUE KEY 와 MULTIPLE KEY가 있다. UNI는 중복된 데이터가 등록될 수 없고, MUL은 중복이 허용된다. 이 KEY들은 하나의 테이블에도 여러개를 설정할 수 있으며, 해당 데이터를 찾을 때 참고 INDEX로 사용된다.

위의 사진에 적용해 보면 TimeID가 1503430659000264인 데이터의 CAL 값이 필요하다면, PHP 코드를 이용해 MySQL에 쿼리 요청(SELECT L0.CAL FROM L0 WHERE L0.TimeID = ‘1503430659000264’)을 보내고 그 결과를 불러와 변수에 저장 하여 사용할 수 있다. MySQL에서 사용하는 언어가 query 문장이고, 이를 PHP를 이용하여 전송하고 그 결과를 받아 오는 방법이다. 쿼리문은 데이터의 선택, 추가, 삭제, 수정 부터 컬럼, 테이블, 데이터베이스에 걸쳐 MySQL 전체를 관리할 수 있는 다양한 종류가 있고, 이는 추후 MySQL 쿼리문 파트에서 따로 다루겠다.
2. PHP, MySQL 접속
PHP에서 MySQL 데이터 베이스에 접근하기 위해서는 PHP에서 MySQL에 로그인 해야된다.
$conn = mysqli_connect("localhost”,”UserID”,"UserPassword”,"Database”);
$conn = mysqli_connect("localhost”,”UserID”,"UserPassword”);
위 코드는 $conn이라는 PHP 변수에 아파치 서버와 같은 호스트(localhost)의 MySQL에 접속정보를 저장하는 코드이다. 아이디와 패스워드를 입력하고 4번째 옵션에 데이터베이스를 선택하면 MySQL 데이터 베이스 서버에서 해당 데이터 베이스에 연결된다. 해당 4번째 옵션을 입력하지 않으면 모든 데이터베이스에 접근 가능하고, 쿼리문을 사용할 때 데이터 베이스까지 입력해주어야 한다. 접속 실패를 확인하기 위해 if(!$conn){echo “mysql conn error”;}와 같은 코드를 사용한다. 데이터베이스 접속은 거의 모든 문서에서 사용하고, 다른 데이터 베이스 서버에서도 사용할 수 있도록 헤더파일로 분리시켜 사용한다.
접속된 MySQL 서버로 전송할 쿼리문을 작성하고,
$query = “SELECT * FROM Database.Table WHERE Table.Column = ‘x’;"
작성된 쿼리문을 서버에서 실행시킨다.
$run = mysqli_query($conn, $query);
mysqli_query 함수를 사용하면 해당 쿼리문은 해당 서버에서 실행된 상태이다. 쿼리문의 종류에 따라 그 결과 확인하는 방법이 다양하다. 일단 쿼리문에 에러가 생겼을 경우 확인 하는 방법은 if(!conn); 코드를 사용한다. mysqli_error(conn 서버에서 생성된 최근의 에러를 출력해주는 함수이다. 쿼리문이 에러없이 실행되었다면, 이제 쿼리문의 사용법과 그 결과를 알아야 된다. 다음 장에서 쿼리문을 정리해보자.
3. MySQL Query
MySQL에서 실행할 수 있는 명령어들을 Query 문이라 한다. 그 종류는 아주 다양하며 모두 다 설명할 수는 없다. 이럴 때 가장 유용한 방법은 phpmyadmin을 이용하는 방법이다. phpmyadmin은 MySQL 데이터 베이스 서버를 유저 인터페이스를 이용하여 시각적으로 관리할 수 있는 프로그램이다. 해당 프로그램에서는 MySQL에서 필요한 거의 모든 기능을 시각화된 인터페이스로 제공하고 있으며, 해당 Query 문을 실행하기 이전에 그 Query문을 보여준다. 예를 들어 Table 이나 Column의 이름을 변경하고 싶은데, 해당 쿼리문을 모르겠다면 phpmyadmin에서 하나의 Table이나 Column의 이름을 바꿔보고 그때 사용된 쿼리문을 복사하여 사용하면 된다.
또 하나의 강력한 기능은 유저가 직접 적은 쿼리문도 실행가능하다. SQL 쿼리문을 직접 적을 수 있는 창을 이용하여 해당 쿼리문의 문법을 체크해볼 수 있다. 이 방법들을 통하면 복잡한 쿼리문들도 쉽게 얻을 수 있을 것 이다.
3.1 SELECT
가장 중요하고 많이 사용되는 쿼리문은 SELECT 문이 있다. 해당 조건에 맞는 데이터들을 원하는 순서대로 가져와 테이블로 만들어주는 쿼리문이다. 데이터 베이스 서버를 쓰는 가장 주된 이유이기 때문에 잘 다룰 수 있어야 한다. 가장 기본적인 문법은
SELECT table1.column1, table1.column2, table2.column3 ….
FROM Database1.table1, Database2.table2
WHERE table1.column1 = table2.column1
AND table1.column4 = ‘condition1’
AND (table2.column5 = ‘condition2’
OR table2.column5 = ‘condition3’);
과 같다. 첫줄에는 SELECT 결과 테이블에 출력될(선택될) Column을 선택한다. 이때 column을 적지 않고 *을 입력하면 모든 column을 출력한다. FROM은 SELECT 에 사용되는 Table을 선언하는 줄이다. 예제와 같이 여러 테이블을 선택해야되는 경우에는 다양한 조합이 가능하다. 예제와 같이 FROM에 여러가지 테이블을 선언하면 자동으로 INNER JOIN 형태로 선택된다. JOIN에 대한 설명은 한장을 할애해서 다루겠다. WHERE 은 조건을 선언하는 줄이다. 조건은 SELECT에 출력될 Column외에도 다른 Column을 사용할 수 있지만, 선언되지 않은 Table은 사용할 수 없다. 여러가지 테이블을 JOIN하기 위해 테이블 간의 JOIN 조건을 줄 수도 있다(JOIN 조건은 WHERE 말고 ON에서 선언하는 것이 일반적이다.). 예제 코드를 보자.
SELECT d.name, d.datasetid, da.permit, d.owner, u.name, d.description, d.adddata
FROM DataSetInfo AS d
INNER JOIN DataAccess AS da
ON da.userid = $uid && d.datasetid = da.datasetid && d.datasetid = $did && d.name = '$dname'
INNER JOIN Userinfo AS u
ON d.owner = u.userid;
해당 코드는 3개의 테이블에서 7개의 컬럼을 가져오는 쿼리문이다. DataSetInfo 에서 name과 datasetid, owner, description, adddata 컬럼을, DataAccess 에서 permit 컬럼을, Userinfo에서 name을 INNER JOIN으로 합쳐 출력해준다. INNER JOIN 조건은 DataAccess의 datasetid와 DataSetInfo의 datasetid 가 같은 줄을 합치고, DataSetInfo의 owner과 Userinfo의 userid 가 같은 줄을 합친다. 그 외에 3가지 조건을 더 주어 원하는 테이블을 만들었다. datasetid가 DataSetInfo 테이블과 DataAccess 테이블을 연결하는 정보고, owner과 userid가 DataSetInfo 테이블과 Userinfo 테이블을 연결하는 정보인 것을 알 수 있다.
DataSetInfo Table

DataAccess Table

사진과 같이 datasetid가 같은 줄을 하나의 줄로 연결하여

이런 테이블을 합쳐서 새로운 테이블로 출력해 주는 것 이다.
원하는 정보를 잘 SELECT 해 왔다면, 우리는 이제 해당 테이블을 한줄한줄 읽어와야 한다. 이때 사용하는 함수는
$row = mysqli_fetch_array($run);
$row = mysqli_fetch_row($run);
$row = mysqli_fetch_assoc($run);세 개가 있다. 세 함수의 차이를 간단히 알아보자. 위의 결과 그림을 예로 들어 적어보면,
array : $row[1] = ‘G3MCpidinfo', $row[’name’] = ‘G3MCpidinfo’, $row[3] = 8, $row[‘owner’] = 8, ….
row : $row[1] = ‘G3MCpidinfo', $row[3] = 8, ….
assoc : $row[‘name’] = ‘G3MCpidinfo’, $row[‘owner’] = 8, ….$row는 어레이가 되고, 안에 들어가는 숫자나 문자는 어레이의 키가 된다. 세 종류를 비교해보면 array는 키가 숫자와 문자 두종류로 다 저장되고, row는 키가 숫자, assco는 키가 문자로 저장된다. 숫자 키는 내가 SELECT문 첫줄에 적은 컬럼 순서대로 0부터 순서대로 지정되고, 문자 키는 컬럼명으로 저장된다. 내가 어떤 키를 사용하는 것이 편한지 생각해보고 하나를 선택하면 된다. 이후 설명의 편의를 위해 세 함수를 대표해 array 함수를 사용하겠다.
mysqli_fetch_array() 함수는 결과 테이블에서 한줄을 읽어오는 함수이므로, 테이블의 줄 수 만큼 호출되어야 모든 줄을 불러올 수 있다. 이 때 가장 많이 사용하는 방법은
while($run = mysqli_fetch_array($run)){ }을 이용한다. 자동으로 마지막 줄까지 순서대로 읽어올 때 마다 { } 안의 코드를 실행한다.
3.2 INSERT, UPDATE, DELETE
데이터를 읽어오는 것 만큼 중요한 것이 데이터를 관리하는 것이다. 기본은 새로운 데이터를 올리고, 수정하고, 지우는 쿼리문을 알아보자.
INSERT INTO Database.Table (column1, column2, column3, column4, ….) VALUES (‘value1', ‘value2’, ’value3’, 'value4’, ….);INSERT 쿼리문에서 가장 중요한 것은 NULL 이다. 해당 테이블에 새로운 데이터를 INSERT 하기 위해서는 테이블의 모든 컬럼에 해당하는 value가 입력되어야 한다. Column에 기본값(default)가 설정되어 있다면, 해당 컬럼은 column과 value가 없어도 INSERT가 되지만, 없다면 에러가 난다. Column의 기본값은 Column을 생성할 때 설정해야된다. 해당 컬럼이 비어있어도 된다면 NULL을 기본값으로 주고, 데이터를 업로드한 시간이 자동으로 업로드 되길 원한다면 CURRENT_TIME_STAMP 값을 주면된다. 이런 기본값이 설정되지 않은 컬럼은 모두 value를 입력해야된다.
DELETE FROM Database.Table WHERE Table.column = ‘condition’;DELETE 문의 가장 중요한 부분은 WHERE 파트이다. 당연하게도 조건을 주지 않으면 해당 테이블의 모든 데이터가 삭제된다. 조건절에 사용하는 컬럼은 PRIMARY KEY로 사용한는 column을 사용하여 중복되지 않고 하나의 데이터를 삭제할 수 있도록 하는것이 좋다.
UPDATE Database.Table SET Table.column1 = ‘value' WHERE Table.column2 = ‘condition’;UPDATE 문도 비슷하다. 조건을 잘못주면 원하지 않은 데이터들이 수정된다. 데이터를 특정하기에 가장 안전한 방법은 PRIMARY KEY Column을 이용하는 것 이다.
3.3 CREATE DATABASE, TABLE
데이터베이스와 테이블, 컬럼을 만드는 쿼리문을 알아보자.
$createdb = "CREATE DATABASE $dbname DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;";
$db = mysqli_query($conn, $createdb);dbname의 데이터 베이스가 생성된다.
$createtb = "CREATE TABLE $dbname.$tablename( num BIGINT(30) AUTO_INCREMENT COMMENT 'Data number auto_increment’,
PRIMARY KEY (num)) COMMENT = '$description';";
$tb = mysqli_query($conn, $createtb);테이블 생성 쿼리문이다. tablename 이라는 새로운 테이블을 만든다. 이때 괄호안에 들어가는 내용은 Column이다. 컬럼 이름은 num, 타입은 BIGINT(30), defualt 값은 AUTO_INCREMENT, 인덱스 키 타입은 PRIMARY KEY인 컬럼을 추가하는 것 이다. 마지막으로 테이블의 코멘트는 $description가 입력된다. 테이블을 생성할때는 항상 PRIMARY KEY 컬럼을 하나 생성해야하므로, 위와같이 자동으로 증가하는값을 default로 가지는 컬럼을 같이 생성하는 것이 좋다. 해당 컬럼에는 데이터가 업로드 될 때마다 1씩 증가하는 값이 자동으로 입력되어 데이터의 주소로 사용된다. 테이블까지 생성되었으니 Column을 테이블에 추가해주어야 한다. Column의 정보인 타입과 defualt value는 다음 컬럼 생성에서 알아보도록 하자.
3.4 ADD COLUMN(ALTER TABLE)
테이블을 생성할 때 모든 컬럼을 추가할 수 있지만, PRIMARY KEY COLUMN 하나만 생성한 경우 또는 새로운 컬럼을 추가하고 싶은경우 컬럼은 생성하는 것이 아니라 테이블을 수정하여 추가할 수 있다.
$acol = "ALTER TABLE $dbname.$tbname
ADD $colname $type NULL COMMENT '$description'
AFTER num;";
$col = mysqli_query($conn, $acol);기본적인 Column 추가 쿼리문이다. tbname 테이블을 수정하는 쿼리문이다. ADD 옵션은 Column이나 Column의 정보를 추가한다. 컬럼의 이름은 type, default value는 NULL, 컬럼의 설명은 $description이 입력되고 컬럼이 위치하는 순서는 num이라는 컬럼 뒤에 위치하게 된다. 차례로 알아보자. 컬럼의 이름은 문자 코딩을 따라 입력해주면 된다.
MySQL 컬럼의 타입은 크게 숫자, 날짜와 시간, 문자열, 공간(좌표)형으로 나뉜다. 각각 타입은 phpmysql의 컬럼 생성창의 종류를 보면 잘 정리되어 있다.




실제 쿼리문에서 사용되는 타입들의 이름이다. 타입마다 길이가 필요한 경우 type(n)으로 타입의 최대 길이를 설정할 수 있다. 대부분의 타입들은 이름으로 알 수 있으니 설명은 건너뛰겠다. 혹시 궁금하다면 phpmysql의 컬럼 생성창의 타입을 열어보라. 타입 설정에서 조심해야될 부분이 있다. 첫번째는 당연히 맞지 않는 타입을 설정할 경우 데이터를 INSERT 할 수 없다는 것 이다. 두번째는 BLOB(바이너리) 타입들과, TEXT 타입들의 경우에는 길이가 가변적이기 때문에 INDEX 설정이 불가능하다. 길이가 가변적이라는 뜻을 간단히 살펴보면, INT(3)의 경우 유저가 1을 입력하였다면 001, 123을 입력하였을 경우 123 과 같이 항상 같은 길이의 문자가 입력된다는 뜻이다. 하지만 BLOB타입과 TEXT 타입은 그 길이를 맞추지 않고 입력된 만큼 저장되어 INDEX KEY로 사용될 수 없다. 세번째는 defualt value를 설정한 경우이다. 일단 default value를 알아보자.
Defualt value는 유저가 해당 컬럼의 값을 작성하지 않는다면 기본적으로 업로드 되는 값을 말한다. 이 값이 NOT NULL 이거나, 없을 경우 유저는 해당 컬럼의 값을 반드시 입력하여야 데이터 INSERT를 성공할 수 있다. 그렇다면 defualt value에 NOT NULL을 입력할 경우 필수 입력 항목이 된다는 뜻 이다. NULL을 입력한 경우, 비워놔도 되는 컬럼인 동시에 아무 값도 입력되지 않아도 업로드 가능한 컬럼이 된다. NULL 설정외에도 유저가 원하는 값을 defualt value로 입력해 놓을 수있다. 이때 유저가 설정한 defualt value와 컬럼의 타입이 일치해야된다. 예로들어 defualt value가 1234인데 DATE 타입이나 BLOB로 설정 할 수 없다.
이와 같은 맥락에서 MySQL에서 제공하는 기본 defualt value 두가지 AUTO_INCREMENT와 CURRENT_TIMESTAMP도 정해진 타입이 존재한다. AUTO_INCREMENT는 0부터 데이터가 INSERT될 때 자동으로 1씩 커지는 값을 입력해주는 역할을 한다. 때문에 TYPE은 정수를 입력할 수 있는 INT 나 BIGINT 타입을 사용한다. AUTO_INCREMENT는 몇가지 주의사항이 있는데, 이는 따로 다루겠다.
CURRENT_TIMESTAMP는 이름에서 보듯이 데이터가 업로드되는 현재 시간을 자동으로 입력해주는 default value다. 타입은 TIMESTEAMP를 사용하면 된다.
COMMENT는 컬럼의 설명부분으로, 컬럼의 속성에는 영향을 주지 않고 추가적인 정보를 제공하는 컬럼이다. 컬럼의 정보를 가져오는 쿼리문이 여러가지 있는데, 크게 이 COMMENT를 포함하는 쿼리문과 포함하지 않는 쿼리문이 있다. 이는 다음장에서 다루겠다.
마지막 줄인 AFTER num은 num 컬럼 다음에 추가한다는 뜻 이다. 데이터를 가져올 때 특별히 컬럼의 순서를 지정하지 않는다면 생성할 때 추가된 순서대로 출력되기 때문에 유저가 원하는 순서로 컬럼을 만들어 두기 위해 사용한다. 이렇게 컬럼까지 추가하면 Table을 완성할 수 있을 것 이다.
3.5 Show Columns
데이터베이스의 다양한 데이터들을 관리하기 위해서는 컬럼의 정보를 알고 있어야 한다. 컬럼 정보와 떨어져있는 데이터는 단순한 값일 뿐인것을 이해할 수 있을 것 이다. 데이터는 SELECT 쿼리문을 사용하여 가져올 수 있을 것 이다. 그렇다면 컬럼의 정보는 어떻게 가져올 수 있을까?
$scol = "SHOW COLUMNS FROM $dbname.$tbname;”;
$sfcol = “SHOW FULL COLUMNS FROM $dbname.$tbname;”;컬럼의 정보를 가져오는 쿼리문은 위와 같이 SHOW COLUMNS 와 SHOW FULL COLUMNS 두가지가 있다. 두 쿼리문 모두 tbname 테이블에 있는 모든 컬럼의 정보를 가져오는 쿼리문이다. 그결과는 아래와 같다.


두 쿼리문의 차이는 유저의 권한과 COMMENT 출력 차이이다. SHOW COLUMNS의 경우 Field, Type, Null, Key, Default, Extra 항목을 출력하고, SHOW FULL COLUMNS의 경우 추가로 Privileges 와 Comment를 출력한다. Field는 컬럼의 이름, Type은 컬럼의 타입, Null은 Null 허용 여부, Key는 INDEX KEY 종류, Default는 default value, Extra는 MySQL에서 제공하는 default value인 AUTO_INCREMENT와 CURRENT_TIMESTAMP 여부이다. 추가로 FULL COLUMNS의 경우 Privileges는 로그인 유저의 컬럼 권한이다. 어떤 쿼리문을 실행 시킬 수 있는가가 출력된다. Comment는 컬럼을 생성할 때 입력하였던 COMMENT 내용이 출력된다. 필요에 따라 선택하여 사용하면 된다.
SHOW COLUMNS 쿼리문은 SELECT와 같이 테이블 형태로 출력되기 때문에 SELECT 쿼리문과 같이 mysqli_fetch_array() 함수를 이용하여 컬럼의 정보를 사용한다.
$query = mysqli_query($conn, $sfcol)
while($row = mysqli_fetch_array($query)){
echo $row[0];
echo $row[’Type’].<br>;
}
위의 코드와 같이 query에 저장하고, mysqli_fetch_array()함수로 한줄씩 어레이 형태로 읽어올 수 있다. 위의 코드를 실행시키면 컬럼의 수 만큼 컬럼의 Field와 Type이 출력될 것 이다. 이를 이용하여 테이블의 데이터를 출력할 때 컬럼과의 연관성을 추가 할 수 있을 것 이다.