MySql - POD 예제


MySql - POD 예제




최초 작성일 : 2022-03-08 | 수정일 : 2022-03-08 | 조회수 :

PHP 프로그래밍 언어에서 MariaDB(또는 MySQL)을 사용하는 걸 예로들어 설명한다.

PDO를 사용하여 데이터베이스에 접속

데이터베이스 프로그램에 접속하기 위해 PHP Data Objects : PDO를 사용한다.

PDO는 여러 데이터베이스와의 통신을 간단하게 해주는 PHP의 기능이며 객체이다.

데이터베이스 관리 시스템(DBMS)의 종류, 호스트의 주소, 데이터베이스의 이름, 사용자의 아이디와 비밀번호를 매개변수로 넣어 PDO 객체를 만듭니다.

$db = new PDO('mysql:host=localhost;dbname=skills','dbuser','dbuserpw');

매개 변수는 세 개이며 두 번째와 세 번째는 DB 사용자의 아이디와 비밀번호이다.

첫 번째 매개 변수는 DBMS의 종류를 나타내는 콜론(:) 앞의 Data Source Name 접두어와 그 뒤에 세미콜론(;)으로 구분하는 몇 가지의 정보가 있는 문자열이다.

다른 데이터베이스라면 접두어가 mysql이 아니라 다른 이름이 된다.

위 예에선 DBMS가 localhost에 설치되어있다.

DB의 이름은 skills, ID는 dbuser, 비밀번호는 dbuserpw이다.

DB 접속에 실패하면 예외가 발생하기 때문에 try catch 문으로 감싸서 예외를 처리해야한다.

try{
  $db = new PDO('mysql:host=localhost;dbname=skills','dbuser','dbuserpw');
}catch (PDOException $e){
  print $e->getMessage();
}

exec() 함수

DELETE 구문을 사용해보자.

$count = $db->exec('DELETE FROM table1 WHERE id LIKE $id');

INSERT, UPDATE, DELETE 쿼리를 실행할 땐 exec() 함수를 사용한다.

반환값은 UPDATE 구문이면 변경된 row의 수, DELETE 구문이면 삭제된 row의 수가 된다.

쿼리 실행 중 문제가 생기면 false가 반환됩니다.

그리고 성공해도 반환값이 0인 경우가 있을 수 있으니(반영 row가 0개거나 삭제할 것이 없거나) 반환 값을 확인하려면 삼중 등호를 사용한다.

if (false === $count){...}

prepare()와 execute() 함수

이런 SQL 구문은 위험하죠.

$db->exec('INSERT INTO table1 (id, password) VALUES ('$_POST[id]', '$_POST[pw]')');

아주 간단한 SQL Injection으로도 데이터가 날아갈 수 있다.

따라서 prepare() 함수를 사용해 Prepared Statements를 사용한다.

$stmt = $db->prepare('INSERT INTO table1 (id, password) VALUES (?,?)');
$stmt->execute(array($_POST['id'],$_POST['pw']));

query()와 fetch() 함수

SELECT 쿼리를 실행할 땐 query() 함수를 사용한다.

$result = $db->query('SELECT id, password FROM table1');
while ($row = $result->fetch()){
  print '$row[id], $row[password]\n';
}

위 예제를 보면 사용방법을 쉽게 이해할 수 있다.

더 이상 fetch 할 것이 없다면 false 값이 반환되니 이렇게 사용할 수 있다.

table1 테이블의 컬럼 중 id와 password가 각각 첫 번째와 두 번째 컬럼이라면 row[0], row[1]처럼 쓸 수도 있다.

또 fetchAll()을 쓰면 결과를 몽땅 rows 배열에 넣을 수 있다.

$rows = $result->fetchAll();

SELECT 구문도 prepare()와 execute() 함수를 사용할 수 있다.

$stmt = $db->prepare('SELECT id, password FROM table1 WHERE id LIKE ?');
$stmt->execute(array($_POST['id']));
while ($row = $stmt->fetch()){
  print '$row[id], $row[password]\n';
}

quote()와 strtr() 함수

그런데 SQL에는 밑줄(_)과 퍼센트(%)라는 와일드카드 기호가 있다.

밑줄은 임의의 한 글자와 일치하는 것을, 퍼센트는 0개 이상의 문자와 일치한다.

따라서 입력된 값의 와일드카드 문자를 사용하지 못하게 하려면 prepare()와 execute() 대신 quote()와 strtr()을 사용해야 한다.

quote()는 문자열을 따옴표로 감싸는 함수, strtr()은 문자를 바꾸는 함수이다.

$id = $db->quote($_POST['id']);
$id = strtr($id, array('_'=>'\_', '%'=>'\%'));
$stmt = $db->query('SELECT id, password FROM table1 WHERE id LIKE $id');

quote() 함수는 작은따옴표와 역슬래시 앞에 역슬래시를 붙이고 따옴표 처리를 하므로 반드시 strtr() 함수보다 먼저 실행해야 한다.

Tags  #MySql  

닉네임:
댓글내용: