본문 바로가기
PHP

PHP & MySQL

by FraisGout 2020. 7. 2.

MySQL이란?

PHP를 사용하면 손쉽게 데이터베이스에 연결하고 그 내용을 관리할 수 있습니다.

 

MySQLPHP와 함께 사용되는 가장 대중적인 데이터베이스 시스템입니다.

 

 

 

이러한 MySQL의 특징은 다음과 같습니다.

 

 

 

1. 오픈 소스이므로, 무료로 다운받아 사용할 수 있습니다.

 

2. 다양한 운영체제에서 사용할 수 있으며, 여러 가지의 프로그래밍 언어를 지원합니다.

 

3. 크기가 큰 데이터도 아주 빠르고 효과적으로 처리할 수 있습니다.

 

4. 널리 알려진 표준 SQL(standard SQL) 형식을 사용합니다.

 

5. MySQL 응용 프로그램을 사용자의 용도에 맞게 수정할 수 있습니다.

 

6. MySQL은 데이터를 테이블에 저장하며, 각 테이블은 관련된 데이터를 행과 열의 형태로 저장합니다.

SQL(Structured Query Language)이란 데이터베이스에서 자료를 처리할 때 사용하는 구조화된 질의어를 의미합니다.

 

MySQL과 같은 데이터베이스는 많은 데이터를 효과적으로 저장하고 관리할 수 있도록 도와줍니다.

 

예를 들어, 학교(School)라는 데이터베이스에는 다음과 같은 테이블을 만들어 데이터를 관리할 수 있습니다.

 

 

 

- 학생(Student)

 

- 선생님(Teacher)

 

- 수업(Class)

 

쿼리(query)

PHP에서는 쿼리(query)를 사용하여 MySQL과 같은 데이터베이스에 작업을 요청할 수 있습니다.

 

쿼리(query)란 데이터베이스에 보내는 요청(request) 또는 질문이라고 이해할 수 있습니다.

 

 

 

예를 들어, 다음과 같은 쿼리는 Student 테이블에서 Name이라는 필드를 모두 선택해 줄 것입니다.

 

)

SELECT Name FROM Student;

MySQL에서 각 테이블은 유일한 이름과 자신만의 타입을 가지는 열(column)과 관계된 데이터의 묶음을 나타내는 행(row)으로 구성됩니다.

열은 필드(field)라고도 부르며, 행은 레코드(record)라고도 불립니다.

 

MySQL extension

예전에는 PHP에서 MySQL 데이터베이스에 연결하기 위해 MySQL extension이라는 API를 사용했습니다.

 

MySQL extensionmysql_로 시작하는 다양한 함수를 사용하여 MySQL 데이터베이스를 관리할 수 있었습니다.

 

 

 

하지만 이 APIPHP 5.5.0부터는 사용을 권장하지 않고(deprecated) 있으며, PHP 7.0.0에서는 삭제되었습니다.

 

MySQLiPDO

따라서 현재 PHP에서 MySQL 데이터베이스에 연결하기 위해 사용할 수 있는 API는 다음과 같습니다.

 

 

 

1. MySQL improved extension(MySQLi extension)

 

2. PHP Data Objects(PDO)

 

 

 

위의 두 가지 API는 각각 장단점을 가지지만, MySQL 환경에서 성능상의 큰 차이를 보이지는 않습니다.

 

따라서 자신이 사용하기 편한 API를 선택하는 것이 좋습니다.

MySQLiMySQL 데이터베이스에서만 동작하지만, PDOMySQL를 포함한 12개의 다른 데이터베이스에서도 모두 똑같이 동작할 것입니다.

 

서버와의 연결

PHP를 사용하여 MySQL 데이터베이스에 접속하기 위해서는 우선 서버와의 연결이 필요합니다.

 

 

 

다음 예제는 PDO를 사용하여 서버와 연결하는 예제입니다.

 

)

<?php

 

$servername = "localhost";

 

$dbname = "testDB";

 

$user = "choi";

 

$password = "0219";

 

 

 

try

 

{

 

$connect = new PDO('mysql:host=$servername;dbname=$dbname', $user, $password);

 

$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 

echo "서버와의 연결 성공!";

 

}

 

catch(PDOException $ex)

 

{

 

echo "서버와의 연결 실패! : ".$ex->getMessage()."<br>";

 

}

 

?>

 

 

 

위 예제의 번 라인에서는 서버 이름, 데이터베이스 이름, 사용자명과 비밀번호를 전달하여 새로운 PDO 객체를 생성합니다.

 

번 라인에서는 생성된 PDO 객체에 에러 모드(error mode)를 설정하고 있습니다.

 

이렇게 에러 모드를 설정하면, PDO 생성자는 에러가 발생할 때마다 PDOException 예외를 던질 것입니다.

 

서버와의 연결 종료

이렇게 생성된 서버와의 연결은 PHP 스크립트가 끝나면 자동으로 같이 종료됩니다.

 

하지만 PHP 스크립트가 끝나기 전에 서버와의 연결을 종료하고 싶다면, 다음 예제처럼 PDO 객체에 null을 대입하면 됩니다.

 

)

<?php

 

$connect= null;

 

?>

 

데이터베이스 생성

MySQLCREATE DATABASE 문은 새로운 데이터베이스를 생성할 때 사용합니다.

 

 

 

다음 예제는 Hotel이라는 새로운 데이터베이스를 생성하는 PHP 예제입니다.

 

)

<?php

 

$servername = "localhost";

 

$dbname = "testDB";

 

$user = "choi";

 

$password = "0219";

 

 

 

try

 

{

 

$connect = new PDO('mysql:host=$servername;dbname=$dbname', $user, $password);

 

$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 

$sql = "CREATE DATABASE Hotel";

 

$connect->exec($sql);

 

echo "데이터베이스 생성 성공!";

 

}

 

catch(PDOException $ex)

 

{

 

echo "데이터베이스 생성 실패! : ".$ex->getMessage()."<br>";

 

}

 

$connect = null;

 

?>

 

 

 

위 예제의 번 라인에서는 Hotel이라는 이름의 데이터베이스를 생성하는 SQL 구문(statement)을 작성합니다.

 

이렇게 작성한 SQL 구문을 번 라인의 exec() 메소드에 인수로 전달하여 실행하고 있습니다.

exec() 메소드는 인수로 전달받은 SQL 구문을 실행하고, 해당 구문에 의해 영향을 받은 레코드의 개수를 반환합니다.

 

테이블 생성

데이터베이스는 하나 이상의 테이블로 구성되며, 이러한 테이블에 데이터를 저장하여 관리할 수 있습니다.

 

MySQLCREATE TABLE 문은 새로운 데이터베이스를 생성할 때 사용합니다.

 

 

 

다음 예제는 4개의 필드를 갖는 Reservation 테이블을 생성하는 PHP 예제입니다.

 

)

<?php

 

$servername = "localhost";

 

$dbname = "testDB";

 

$user = "choi";

 

$password = "0219";

 

 

 

try

 

{

 

$connect = new PDO('mysql:host=$servername;dbname=$dbname', $user, $password);

 

$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 

$sql = "CREATE TABLE Reservation

 

(

 

ID INT PRIMARY KEY,

 

Name VARCHAR(30) NOT NULL,

 

ReservDate DATE NOT NULL,

 

RoomNum INT

 

)";

 

$connect->exec($sql);

 

echo "테이블 생성 성공!";

 

}

 

catch(PDOException $ex)

 

{

 

echo "테이블 생성 실패! : ".$ex->getMessage()."<br>";

 

}

 

$connect = null;

 

?>

위 예제의 번 라인에서는 4개의 필드를 갖는 Reservation이라는 이름의 테이블을 생성하는 SQL 구문을 작성합니다.

 

테이블을 생성할 때는 필드의 이름뿐만 아니라 타입, 제약조건 등을 함께 명시할 수 있습니다.

 

레코드 추가

새로운 데이터베이스와 테이블을 생성한 후에는 INSERT INTO 문을 사용하여 테이블에 새로운 레코드를 추가할 수 있습니다.

 

 

 

다음 예제는 Reservation 테이블에 새로운 레코드를 추가하는 PHP 예제입니다.

 

)

<?php

 

$servername = "localhost";

 

$dbname = "testDB";

 

$user = "choi";

 

$password = "0219";

 

 

 

try

 

{

 

$connect = new PDO('mysql:host=$servername;dbname=$dbname', $user, $password);

 

$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 

// VALUES 절을 통해 전달한 데이터로 Reservation 테이블에 새로운 레코드를 추가하는 SQL 구문

 

$sql = "INSERT INTO Reservation(ID, Name, ReserveDate, RoomNum) VALUES(5, '이순신', '2016-02-16', 1108)";

 

$connect->exec($sql);

 

echo "레코드 추가 성공!";

 

}

 

catch(PDOException $ex)

 

{

 

echo "레코드 추가 실패! : ".$ex->getMessage()."<br>";

 

}

 

$connect = null;

 

?>

 

 

 

위 예제의 번 라인에서는 Reservation 테이블에 새로운 레코드를 추가하는 SQL 구문을 작성합니다.

 

이때 VALUES 절을 사용하여 새로운 레코드를 구성할 데이터를 함께 전달하고 있습니다.

 

이렇게 작성한 구문을 번 라인의 exec() 메소드에 인수로 전달하여 실행하고 있습니다.

 

문자열 데이터에는 따옴표를 사용해야 하며, 숫자 데이터에는 따옴표를 사용하지 않아도 됩니다.

 

여러 레코드 추가

여러 레코드를 한 번에 추가하고 싶을 때는 beginTransaction() 메소드로 새로운 트랜젝션을 시작할 수 있습니다.

 

그리고 commit() 메소드로 해당 트랜젝션을 커밋(commit)할 수 있습니다.

트랜젝션(transaction)이란 데이터베이스에서 데이터의 일관성을 보장하기 위해 사용하는 가장 작은 작업 단위입니다.

커밋(commit)이란 해당 트랜젝션의 내용을 데이터베이스에 영구히 반영하는 것을 의미합니다.

, 커밋(commit)된 이후에는 데이터베이스의 내용을 해당 트랜젝션 이전으로 되돌릴 수 없습니다.

 

다음 예제는 Reservation 테이블에 여러 개의 새로운 레코드를 한 번에 추가하는 PHP 예제입니다.

 

)

<?php

 

$servername = "localhost";

 

$dbname = "testDB";

 

$user = "choi";

 

$password = "0219";

 

 

 

try

 

{

 

$connect = new PDO('mysql:host=$servername;dbname=$dbname', $user, $password);

 

$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 

 

 

$connect->beginTransaction(); // 새로운 트랜젝션을 시작함.

 

$connect->exec("INSERT INTO Reservation(ID, Name, ReserveDate, RoomNum) VALUES(1, '홍길동', '2016-01-05', 2014)");

 

$connect->exec("INSERT INTO Reservation(ID, Name, ReserveDate, RoomNum) VALUES(2, '임꺽정', '2016-02-12', 918)");

 

$connect->exec("INSERT INTO Reservation(ID, Name, ReserveDate, RoomNum) VALUES(3, '장길산', '2016-01-16', 1208)");

 

$connect->commit(); // 해당 트랜젝션을 커밋(commit).

 

 

 

echo "레코드 추가 성공!";

 

}

 

catch(PDOException $ex)

 

{

 

echo "레코드 추가 실패! : ".$ex->getMessage()."<br>";

 

}

 

$connect = null;

 

?>

 

 

 

위 예제의 번 라인에서는 beginTransaction() 메소드를 호출하여 자동 커밋 모드(autocommit mode)의 사용을 중지하고, 새로운 트랜젝션을 시작합니다.

 

따라서 , , 번 라인에서 exec() 메소드를 호출해도 해당 트랜젝션을 자동으로 커밋(commit)하지 않을 것입니다.

 

, 번 라인처럼 commit() 메소드를 호출해야만 비로서 해당 트랜젝션을 데이터베이스에 커밋(commit)하게 됩니다.

 

레코드 수정

MySQL에서는 UPDATE 문을 사용하여 레코드의 내용을 수정할 수 있습니다.

 

 

 

다음 예제는 Reservation 테이블의 레코드의 내용을 수정하는 PHP 예제입니다.

 

)

<?php

 

$servername = "localhost";

 

$dbname = "testDB";

 

$user = "choi";

 

$password = "0219";

 

 

 

try

 

{

 

$connect = new PDO('mysql:host=$servername;dbname=$dbname', $user, $password);

 

$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 

 

 

// SET 절을 통해 전달한 데이터로 Reservation 테이블의 레코드를 수정하는 SQL 구문

 

$sql = "UPDATE Reservation SET RoomNum = 2002 WHERE Name = '홍길동'";

 

$statement = $connect->prepare($sql);

 

$statement->execute();

 

echo $statement->rowCount()."개의 레코드 수정 성공!";

 

}

 

catch(PDOException $ex)

 

{

 

echo "레코드 수정 실패! : ".$ex->getMessage()."<br>";

 

}

 

$connect = null;

 

?>

 

 

 

위 예제의 번 라인에서는 Reservation 테이블에 저장된 Name 값이 '홍길동'인 레코드의 RoomNum 값을 2002로 수정하는 SQL 구문을 작성합니다.

 

이렇게 작성된 SQL 구문은 번 라인에서 prepare() 메소드를 통해 준비된 상태로 설정됩니다.

 

번 라인에서는 이렇게 준비된 상태인 SQL 구문을 PDOStatement 클래스의 execute() 메소드를 사용하여 실행하고 있습니다.

 

prepare() 메소드는 인수로 전달받은 SQL 구문을 준비된 상태로 설정하고, 이에 해당하는 PDOStatement 객체를 반환합니다.

execute() 메소드는 준비된 SQL 구문을 실행하고, 해당 구문에 의해 영향을 받은 레코드의 개수를 반환합니다.

 

레코드 삭제

MySQL에서는 DELETE 문을 사용하여 테이블의 레코드를 삭제할 수 있습니다.

 

 

 

다음 예제는 Reservation 테이블에서 Name 필드의 값이 '홍길동'인 레코드만을 삭제하는 PHP 예제입니다.

 

)

<?php

 

$servername = "localhost";

 

$dbname = "testDB";

 

$user = "choi";

 

$password = "0219";

 

 

 

try

 

{

 

$connect = new PDO('mysql:host=$servername;dbname=$dbname', $user, $password);

 

$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 

$sql = "DELETE FROM Reservation WHERE Name = '홍길동'";

 

$connect->exec($sql);

 

}

 

catch(PDOException $ex)

 

{

 

echo "레코드 삭제 실패! : ".$ex->getMessage()."<br>";

 

}

 

$connect = null;

 

?>

 

 

 

위 예제의 번 라인에서는 Reservation 테이블에서 Name 필드의 값이 '홍길동'인 레코드만을 삭제하는 SQL 구문을 작성합니다.

 

이렇게 작성한 구문을 번 라인의 exec() 메소드에 인수로 전달하여 실행하고 있습니다.

만약 DELETE 문에서 WHERE 절을 생략하면, 해당 테이블에 저장된 모든 데이터가 삭제될 것입니다.

따라서 DELETE 문을 사용하여 레코드를 삭제할 때는 언제나 주의를 기울여야 합니다.

 

레코드 선택

MySQL에서는 SELECT 문을 사용하여 테이블의 레코드를 선택할 수 있습니다.

 

 

 

다음 예제는 Reservation 테이블에 저장된 모든 레코드의 Name 필드와 ReserveDate 필드의 값을 선택하여 출력하는 PHP 예제입니다.

 

)

<?php

 

$servername = "localhost";

 

$dbname = "testDB";

 

$user = "choi";

 

$password = "0219";

 

 

 

try

 

{

 

$connect = new PDO('mysql:host=$servername;dbname=$dbname', $user, $password);

 

$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 

$sql = "SELECT Name, ReserveDate FROM Reservation";

 

foreach ($connect->query($sql) as $field) {

 

echo $field['Name']."님의 예약일자 : ";

 

echo $field['ReserveDate']."<br>";

 

}

 

}

 

catch(PDOException $ex)

 

{

 

echo "레코드 선택 실패! : ".$ex->getMessage()."<br>";

 

}

 

$connect = null;

 

?>

 

 

 

위 예제의 번 라인에서는 Reservation 테이블에 존재하는 모든 레코드의 Name 필드와 ReserveDate 필드의 값을 선택하는 SQL 구문을 작성합니다.

 

이렇게 작성된 SQL 구문은 번 라인의 query() 메소드를 통해 실행됩니다.

 

또한, 번 라인에서는 query() 메소드의 반환 결과를 foreach 문을 사용하여 출력하고 있습니다.

query() 메소드는 인수로 전달받은 SQL 구문을 실행하고, 그 결과 집합에 해당하는 PDOStatement 객체를 반환합니다.

'PHP' 카테고리의 다른 글

PHP exception  (0) 2020.07.02
PHP cookie & session  (0) 2020.07.02
PHP file  (0) 2020.07.02
PHP Form  (0) 2020.07.02
PHP inheritance  (0) 2020.07.02

댓글