[MySQL & PHP] 18장 PHP 스크립트를 이용해서 MySQL 조작하기
MySQL & PHP 학습/정리 그리고 체크! 2016. 3. 9. 01:28
정리
1. PHP로 MySQL 데이터베이스에 접속하고, 접속 종료하기
1. PHP 스크립트로 MySQL 서버에 접속하기
1.1 PHP로 MySQL 서버에 접속하기
먼저 PHP 스크립트를 이용해서 MySQL 서버에 접속해 보겠습니다.
접속만 하는 것이라면 다음의 PHP 스크립트를 실행하면 됩니다. 이 예에서는 서버 이름은 localhost, 사용자 이름은 root, 비밀번호는 1234를 사용하고 있지만, 현재 사용하는 실제 환경에 맞게 설정하도록 합니다.
예제 18-1 connect.php
1 2 3 4 5 | <?php $s = mysql_connect("localhost", "root", "1234") or die ("실패입니다."); print "성공입니다."; mysql_close($s); ?> | cs |
2번 라인의 $s = mysql_connect("localhost", "root", "1234")로 데이터베이스에 접속하고, 설정한 값이 일치하지 않아 실패하게 되면 or die ("실패입니다.");가 실행되어 스크립트가 그대로 종료됩니다. 성공한 경우에는 4번 라인에서 접속을 종료합니다. 이 구조를 자세히 살펴보겠습니다.
예제 18-1의 스크립트를 connect.php라는 파일 이름으로 공개 폴더에 저장하고, MySQL과 Apache가 실행 중인지 확인합니다. 그리고 브라우저에 http://localhost/connect.php를 입력하고 Enter를 누릅니다.
접속에 성공했다면 이와 같이 표시됩니다. 접속하고 나서 곧바로 접속이 종료됩니다. 종료할 때에는 아무것도 표시되지 않습니다.
만일, '실패입니다.'라고 표시된 경우에는 서버 이름, 사용자 이름, 비밀번호가 일치하지 않거나, MySQL 자체가 실행 중이지 않은 상태일 수 있습니다.
일단, 여기에서는 MySQL 서버에 접속이 확실히 이루어지도록 합니다.
보안상의 문제
예제 18-1의 스크립트로 접속하게 되면, 비밀번호 등의 정보를 포함한 파일이 공개 폴더에 저장됩니다. 실제로 데이터베이스를 운용할 때에는 비밀번호 등의 정보는 공개되지 않는 폴더에 별도의 파일로 저장해야 합니다.
1.2 접속하기
MySQL 서버에 접속하는 구조에 대해 자세히 알아보겠습니다. mysql_connect()는 MySQL 서버에 접속하기 위한 함수입니다. 구문 작성법은 다음과 같습니다.
MySQL에 접속하기
mysql_connect(서버_이름, 사용자_이름, 비밀번호)
mysql_connect() 함수는 데이터베이스의 접속에 성공하면 '데이터베이스의 접속 값'을 반환하고, 실패하면 FALSE를 반환합니다.
데이터베이스의 접속 값이란, 'MySQL 서버와 접속할 때 설정하는 이름'과 같은 것입니다. PHP 스크립트는 이를 사용해서 MySQL 서버에 명령을 실행합니다.
$s = mysql_connect("localhost", "root", "1234")
여기에서는 변수 $s에 저장됩니다. PHP에서는 변수의 자료형을 정의하지 않아도 알아서 정해줍니다. 또한, 변수의 이름은 $s가 아니얻 상관없습니다. 변수 이름으로는 $con 등이 많이 사용되지만, 여기서는 $s를 사용하겠습니다.
$s = mysql_connect("localhost", "root", "1234") or die ("실패입니다.");
데이터베이스 접속에 성공하면 mysql_connect() 함수는 접속 값을 변수 $s에 대입합니다.
그 뒤에 있는 or die()에 대해 알아보겠습니다. die()라는 것은 괄호() 안에 표시할 문자열을 설정해서 스크립트의 실행을 중지하는 함수입니다. 참고로, die() 대신에 exit() 라는 함수를 사용할 수도 있습니다. die()와 exit() 함수는 내부에서 같은 프로그램을 사용하고 있기 때문에 동작도 같습니다.
die()의 앞에 있는 or는 '또는'이라는 의미입니다. 결과적으로는 이 행은 다음과 같은 의미입니다.
■ 접속 값을 변수 $s에 대입하거나 또는(or) 종료한다(die).
즉, 접속을 하거나 만약 접속에 실패한 경우에는 종료하는 명령입니다. 실패한 경우에는 or die("실패입니다.") 부분이 실행되어 '실패입니다.'가 표시되며 스크립트 전체가 종료됩니다.
접속에 성공하면 계속해서 3번째 라인이 실행되어 print "성공입니다."에 설정한 메시지가 표시됩니다.
1.3 접속 종료하기
이번에는 접속 중인 MySQL 데이터베이스를 종료하는 스크립트입니다. 접속을 종료할 때에는 mysql_close() 함수를 사용합니다.
MySQL 접속을 종료하는 함수
mysql_close(데이터베이스의_접속_값)
접속할 때 mysql_connect() 함수가 반환한 값. 즉, 여기에서는 변수 $s를 인수에 대입합니다.
mysql_close($s);
mysql_close() 함수는 종료에 성공하면 TRUE, 실패하면 FALSE를 반환합니다.
참고로, 다음은 종료에 성공하면 '종료 성공', 실패하면 '종료 실패'라고 표시되는 스크립트 입니다.
1 2 3 4 5 | if (mysql_close($s)) { print "종료 성공"; } else { print "종료 실패"; } | cs |
PHP에서 데이터베이스에 접속하는 방법 - PDO란?
PHP를 이용하면 데이터베이스에 쉽게 접속할 수 있습니다. PHP에서 MySQL에 접속하는 방법에는 몇 가지가 있지만, 여기서는 가장 이해하기 쉬운 mysql_connect()와 mysql_select_db(), mysql_query() 등의 함수를 이용하는 방법을 설명하고 있습니다. 이와 같은 함수를 이용하는 방법은 간단합니다. 기본적으로는 SQL 문을 MySQL에 전달하기만 하면 됩니다. 단, 최근에는 PDO를 이용한 방법을 많이 사용합니다.
PDO(PHP Data Object)는 5.1.0 이상의 PHP에서 표준으로 사용하는 데이터베이스 접속방법입니다. PHP에서는 MySQL뿐만 아니라 다른 여러 데이터베이스에도 접속할 수 있습니다. MySQL 이외의 데이터베이스에 접속할 때, mysql_connect()와 mysql_select_db() 등의 함수를 이용하려면 사용하는 데이터베이스에 맞게 프로그램을 달리 작성해야 합니다. 그러나 PDO를 이용하면 같은 명령으로 여러 종류의 데이터베이스를 조작할 수 있습니다. 다음은 후에 소개하는 '테이블에 레코드를 추가하는 질의를 실행하는 스크립트'(insert.php)를 PDO를 이용해서 실행한 예입니다(pdo.insert.php).
▶ pdo_insert.php
1 2 3 4 | <?php $d = new PDO("mysql:host=localhost;dbname=db1", "root", "1234"); $d->query('INSERT INTO tb1 VALUES("K777", "PHP", 20)'); ?> | cs |
2. PHP로 질의 실행하기
2. PHP 스크립트로 질의 작성하기
2.1 insert.php
MySQL 서버에 성공적으로 접속했다면 이번에는 PHP 스크립트를 이용해 질의를 실행해 보겠습니다. 14장까지 사용했던 데이터베이스 db1의 테이블 tb1에 레코드를 추가하겠습니다.
먼저, 데이터베이스 db1에 다음과 같은 칼럼 구조를 가진 테이블 tb1이 있는지 확인하기 바랍니다.
테이블 tb1의 칼럼 구조
칼럼(열) 이름 |
자료형 |
number |
VARCHAR(10) |
name |
VARCHAR(10) |
age |
INT |
현재, 테이블 tb1에는 다음과 같은 데이터가 입력되어 있다고 가정합니다.
▶ 테이블 tb1의 데이터
number |
name |
age |
A101 |
강신우 |
40 |
A102 |
김기덕 |
28 |
A103 |
김민호 |
20 |
A104 |
문소리 |
23 |
A105 |
박문수 |
35 |
이 테이블 tb1에 다음 데이터를 추가하겠습니다.
▶ tb1에 추가할 데이터
number |
name |
age |
K777 |
PHP |
20 |
2.2 테이블에 데이터를 추가하는 PHP 스크립트
데이터를 추가하는 스크립트에 대해 설명하겠습니다. 먼저, 데이터베이스에 접속하고 접속 종료하는 방법은 18장의 예제 18-1과 같습니다.
1 2 3 4 5 6 | <?php $s = mysql_connect("localhost", "root", "1234") or die("실패입니다."); print "성공입니다."; mysql_close($s); ?> | cs |
이번에는 데이터베이스에 접속하여 다음 2개의 명령을 실행하겠습니다.
* 데이터베이스 db1 지정하기 -> USE db1;
* 레코드 추가하기 -> INSERT INTO tb1 VALUES('K777', 'PHP', 20);
MySQL 콘솔창에서 했던 조작법과 비교하면서 PHP 스크립트를 작성해 보겠습니다.
데이터베이스 db1 지정하기
먼저, 사용할 데이터베이스를 지정하는 USE에 해당하는 함수입니다.
데이터베이스를 지정하는 함수
mysql_select_db(데이터베이스_이름, 데이터베이스의_접속_값);
mysql_connect() 함수가 데이터베이스에 접속할 때 반환하는 값은 변수 $s에 저장됩니다. 따라서 이 mysql_select_db() 함수의 '데이터베이스의 접속 값'에 변수 $s를 설정합니다. 즉, 사용할 데이터베이스를 지정하는 스크립트는 다음과 같습니다.
mysql_select_db("db1", $s);
3. PHP로 레코드 추가하기
레코드 추가하기
다음은 INSERT 명령입니다. 'A105'와 '박문수, 35라는 데이터를 추가하는 SQL 문을 기억하시나요?
INSERT INTO tb1 VALUES('A105', '박문수', 35);
SQL 문을 실행하는 함수는 mysql_query() 입니다.
SQL 문을 실행하는 함수
mysql_query(SQL_문)
실행할 SQL 문을 인수로 설정합니다. 이번에 실행할 SQL 문은 다음과 같습니다.
INSERT INTO tb1 VALUES('K777', 'PHP', 20)
MySQL 콘솔창에서 했던 조작과는 달리 구분문자(;)를 붙일 필요는 없습니다.
mysql_query(SQL_문)
앞에서도 설명했지만, SQL 문은 문자열이기 때문에 큰따옴표(") 또는 작은따옴표(')로 감싸야 합니다. 작은따옴표(')로 감싼 SQL 문 안에 같은 작은따옴표(')를 사용하면 오류가 발생합니다. 따라서 다음과 같이 작성하면, 오류가 발생합니다.
mysql_query('INSERT INTO tb1 VALUES('K777', 'PHP', 20)');
오류가 발생하지 않도록 하려면 다음과 같이 작성합니다.
mysql_query('INSERT INTO tb1 VALUES(\'K777\', \'PHP\', 20)');
또는, 다음과 같이 작성할 수도 있습니다.
mysql_query("INSERT INTO tb1 VALUSE('K777', 'PHP', 20)");
첫 번째 예에서는 안쪽의 작은따옴표(') 앞에 \을 붙여서 이스케이프 처리를 하고 있습니다.
두번째 예에서는 작은따옴표(')를 문자로 취급하기 위해서 바깥쪽을 큰따옴표(")로 감싸고 있습니다. 이 예에서는 SQL 문 안에서 큰따옴표(")를 사용하고 이것을 다시 작은따옴표(')로 감쌀 수도 있습니다. 앞으로 여기서 사용하는 예에서는 작은따옴표(')를 포함하는 SQL 문 전체를 큰따옴표(")로 감싸는 방법을 사용하겠습니다.
또한, 복잡한 SQL 문이라면 Heredoc을 사용할 수도 있습니다.
2.3 PHP 스크립트로 테이블에 데이터 추가하기
MySQL에 접속하여 데이터베이스 db1을 선택하고, 질의를 실행하는 스크립트를 정리하면 예제 18-2와 같습니다.
예제 18-2 insert.php
1 2 3 4 5 6 7 | <?php $s = mysql_connect("localhost", "root", "1234") or die("실패입니다."); print "성공입니다."; mysql_select_db("db1", $s); mysql_query("INSERT INTO tb1 VALUES('K777', 'PHP', 20)"); mysql_close($s); ?> | cs |
2번 라인에서 접속을 시도했을 때, 실패하는 경우에는 그대로 종료합니다. 그렇지 않으면, 4번 라인에서 데이터베이스를 지정하고 5번 라인에서 질의를 실행한 후, 접속을 종료합니다.
예제 18-2의 스크립트를 insert.php라는 파일 이름으로 공개 폴더에 저장합니다. 주소창에 다음 URL을 입력하고 Enter를 누릅니다.
http://localhost/insert.php
처리는 순식간에 끝납니다.
4. PHP로 질의 실행 결과 표시하기
2.4 데이터가 성공적으로 추가되었는지 확인하기
이번에는 단순하게 데이터를 추가하는 PHP 스크립트이기 때문에, 결과는 표시되지 않습니다. 즉, 데이터를 성공적으로 추가했는지는 브라우저에서 확인할 수 없습니다.
확인하려면 MySQL 콘솔창을 실행해서 SELECT 명령을 실행해야 합니다. 그럼, 실제로 데이터가 추가되었는지 확인해 보겠습니다. 데이터베이스 db1의 테이블 tb1에 데이터가 추가된 것을 확인해 보겠습니다.
▶ 실행 순서
① MySQL 콘솔창 실행하기
② USE db1 실행하기
③ SELECT * FROM tb1; 실행하기
2.5 PHP를 이용하여 SQL 문의 실행 결과 표시하기
앞에서 만든 SQL 문으로는 브라우저에서 결과를 확인할 수가 없습니다. 하지만, 적어도 브라우저에서 SQL 문을 실행한 결과는 확인하고 싶을 것입니다.
PHP를 이용해서 SELECT 명령 실행하기
이번에는 SELECT 명령으로 테이블 tb1의 레코드를 표시하는 스크립트를 작성해 보겠습니다. PHP를 이용하여 질의를 실행할 때에는 mysql_query() 함수를 사용합니다.
mysql_query("INSERT INTO tb1 VALUES('K777', 'PHP', 20)");
이 예에서는 사용하지 않았지만, mysql_query() 함수는 질의의 실행 결과를 반환합니다.
그럼, mysql_query() 함수로 SELECT 명령을 실행하여 반환된 결과를 변수 $re에 대입해 보겠습니다. 물론, $re의 이름은 무엇이든 상관없습니다.
$re = mysql_query("SELECT * FROM tb1");
mysql_query() 함수로 반환된 문자로 표시하기
변수 $re에는 SELECT * FROM tb1;이라는 질의의 결과가 대입됩니다. 하지만, print $re를 실행해도 결과는 표시되지 않습니다. 이는 mysql_query() 함수가 반화하는 값은 단순한 문자열이 아니기 때문입니다.
결과를 문자열로 이용하려면 mysql_fetch_array() 함수를 사용합니다.
SQL 명령의 결과를 배열로 가져오기
mysql_fetch_array(결과)
참고로, 'fetch(페치)'는 '가져오다'라는 의미입니다. 여기서 인수에 설정하는 '결과'는 mysql_query() 함수가 반환한 값(변수 $re)입니다. 이 예에서 mysql_fetch_array($re)는 질의 결과를 배열로 반환합니다. 다음은 mysql_fetch_array() 함수가 반환하는 배열을 변수 $result에 대입하는 예입니다.
$result = mysql_fetch_array($re)
$result는 배열 변수 입니다. 질의 결과는 첫 번째 행의 각 칼럼 값이 $result[0], $result[1], $result[2]... 에 대입됩니다. 이 예에서는 다음과 같은 값을 추출합니다(첨자는 1부터가 아닌 0부터 시작).
* $result[0] -> 칼럼 number A101등
* $result[1] -> 칼럼 name 강신우 등
* $result[2] -> 칼럼 age 40 등
반환된 결과 표시하기
$result[0] ~ $result[2] 에 하나의 레코드에 저장된 각 칼럼의 값이 들어가므로, 이를 print로 출력합니다. 그리고 표시할 레코드 수만큼 이러한 과정을 반복합니다. SELECT 한 결과를 표시하는 스크립트를 정리해 보면 다음과 같습니다.
$re = mysql_query("SELECT * FROM tb1");
$re = mysql_fetch_array($re);
print $result[0];
print $result[1];
print $result[2];
~ 중간 생략 ~
$result = mysql_fetch_array($re);
print $result[0];
print $result[1];
print $result[2];
이때, 모든 레코드의 수만큼 출력을 반복하려면 다음과 같이 while 문을 사용합니다.
$re=mysql_query("select * from tb1");
while($result = mysql_fetch_array($re)){
print $result[0];
print $result[1];
print $result[2];
}
mysql_fetch_array() 함수는 SQL 명령의 결과를 배열로 반환하지만, 가져올 데이터가 없으면 FALSE를 반환합니다. 이 점을 이용해서 앞의 예처럼 가져올 데이터가 없어 FALSE가 반환될 때까지 print $result를 반복합니다.
2.6 레코드를 추가하고 데이터 표시하기
예제 18-3은 또 다른 데이터 ('K777, 'SQL', 25)를 추가하고, SELECT 명령으로 데이터를 표시하는 예입니다. 알아보기 쉽게 줄바꿈과 쌍점(;)을 사용하고 있습니다.
예제 18-3 insert_disp.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php $s = mysql_connect("localhost", "root", "1234") or die("실패입니다."); print "성공입니다.<BR>"; mysql_select_db("db1", $s); mysql_query("INSERT INTO tb1 VALUES('K777', 'SQL', 25)"); $re = mysql_query("SELECT * FROM tb1"); while ($result = mysql_fetch_array($re)) { print $result[0]; print " : "; print $result[1]; print " : "; print $result[2]; print "<BR>"; } mysql_close($s); ?> | cs |
6번 라인에서 질의 결과를 변수 $re에 대입하고, 7번 라인에서 그 결과를 배열로 가져옵니다.
오류 내용 확인하기
질의가 실행될 때 어떤 원인에 의해 오류가 발생할 수도 있습니다. 그러나 오류의 구체적인 내용은 그 자리에서 확인할 수 없습니다. 그래서 오류가 발생하면 실행을 중지하고 마지막에 발생한 오류를 표시하는 방법을 소개하겠습니다.
예를 들어, 예제 18-4는 테이블 tb1에 'K888'과 25를 추가하는 스크립트이지만, 추가할 데이터가 칼럼의 수에 비해 부족하면 오류가 발생합니다. 단, mysql_query(...)의 뒤에 or die(mysql_error());를 기술했기 때문에 오류가 발생하면 실행을 중단하고 오류 내용을 표시합니다.
예제 18-4 die.php
1 2 3 4 5 6 7 | <?php $s = mysql_connect("localhost", "root", "1234") or die("실패입니다."); mysql_select_db("db1", $s); mysql_query("INSERT INTO tb1 VALUES('K888', 25)") or die(mysql_error()); $re = mysql_query("SELECT * FROM tb1"); mysql_close($s); ?> | cs |
INSERT INTO tb1 VALUES('K888', 25)에서 오류가 발생합니다. or die(...) 부분은 데이터베이스에 접속할 때와 마찬가지로 실패하면 괄호() 안의 내용을 표시하고 실행 중이던 스크립트가 중지됩니다. 여기서, mysql_error() 함수는 마지막에 일어난 오류를 반환합니다. 따라서 만일 mysql_query() 함수로 실행하던 질의에 오류가 발생하면 실행을 멈추고 오류 내용을 표시합니다.
질의를 실행할 때 발생한 오류의 원인을 파악하는 데 도움이 되는 방법입니다.
데이터베이스의 테이블 목록 표시하기
데이터베이스에 존재하는 테이블 목록을 표시하려면, mysql_query() 함수를 사용해서 MySQL의 SHOW TABLES 명령을 실행합니다.
다음은 데이터베이스 db1에 존재하는 테이블 목록을 출력하는 스크립트의 예입니다.
예제 18-5 show_tb.php
1 2 3 4 5 6 7 8 9 | <?php $s = mysql_connect("localhost", "root", "1234") or die("실패입니다."); $re = mysql_query("SHOW TABLES FROM db1"); while ($result = mysql_fetch_array($re)) { print $result[0]; print "<BR>"; } mysql_close($s); ?> | cs |
체크!
★ mysql_connect()와 mysql_close() 함수를 사용해서 데이터베이스에 접속하고, 접속을 종료할 수 있다.
★ mysql_select_db() 함수를 사용해서 데이터베이스를 선택할 수 있다.
★ mysql_query() 함수를 사용해서 질의를 실행할 수 있다.
★ mysql_fetch_array() 함수를 사용해서 질의 실행 결과를 표시할 수 있다.
'MySQL & PHP 학습 > 정리 그리고 체크!' 카테고리의 다른 글
[MySQL & PHP] 20장 인터넷에 공개할 때 주의할 점 (3) | 2016.03.15 |
---|---|
[MySQL & PHP] 19장 PHP와 MySQL로 간단한 게시판 만들기 (4) | 2016.03.11 |
[MySQL & PHP] 17장 PHP 스크립트와 HTML (5) | 2016.03.06 |
[MySQL & PHP] 16장 PHP의 기초 지식 (4) | 2016.03.01 |
[MySQL & PHP] 15장 MySQL을 이용하는 데 필요한 PHP (2) | 2016.02.22 |