MYSQL

MySql - POD 예제


MySql - POD 예제


  2022-03-08  604 View 공개

PHP 프로그래밍 언어에서 MariaDB(또는 MySQL)을 예시로 설명합니다.

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

데이터베이스 프로그램에 접속하기 위해 PHP Data Objects : PDO를 사용합니다.
PDO는 여러 데이터베이스와의 통신을 간단하게 해주는 PHP의 기능이며 객체입니다.
데이터베이스 관리 시스템(DBMS)의 종류, 호스트의 주소, 데이터베이스의 이름, 사용자의 아이디와 비밀번호를 매개변수로 넣어 PDO 객체를 만듭니다.

 Mysql

Mysql
$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 문으로 감싸서 예외를 처리해야합니다.

 Mysql

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

exec() 함수

DELETE 구문을 사용해보겠습니다.

 Mysql

Mysql
$count = $db->exec("DELETE FROM table1 WHERE id LIKE $id");
INSERT, UPDATE, DELETE 쿼리를 실행할 땐 exec() 함수를 사용합니다.
반환값은 UPDATE 구문이면 변경된 row의 수, DELETE 구문이면 삭제된 row의 수가 됩니다.
쿼리 실행 중 문제가 생기면 false가 반환됩니다.
그리고 성공해도 반환값이 0인 경우가 있을 수 있으니(반영 row가 0개거나 삭제할 것이 없거나) 반환 값을 확인하려면 삼중 등호를 사용하세요.

 Mysql

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

prepare()와 execute() 함수

이런 SQL 구문은 위험합니다.

 Mysql

Mysql
$db->exec("INSERT INTO table1 (id, password) VALUES ('$_POST[id]', '$_POST[pw]')");
아주 간단한 SQL Injection으로도 데이터가 날아갈 수 있습니다.
따라서 prepare() 함수를 사용해 Prepared Statements를 사용하세요.

 Mysql

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

query()와 fetch() 함수

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

 Mysql

Mysql
$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 배열에 넣을 수 있습니다.

 Mysql

Mysql
$rows = $result->fetchAll();
SELECT 구문도 prepare()와 execute() 함수를 사용할 수 있습니다.

 Mysql

Mysql
$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";
}
그런데 SQL에는 밑줄(_)과 퍼센트(%)라는 와일드카드 기호가 있습니다.
밑줄은 임의의 한 글자와 일치하는 것을, 퍼센트는 0개 이상의 문자와 일치합니다.
따라서 입력된 값의 와일드카드 문자를 사용하지 못하게 하려면 prepare()와 execute() 대신 quote()와 strtr()을 사용해야 합니다.
quote()는 문자열을 따옴표로 감싸는 함수, strtr()은 문자를 바꾸는 함수입니다.

 Mysql

Mysql
$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  



🚩 MYSQL 글 모음 (총 37 건)

[macOS] zsh: command not found: mysql 해결 방법

Last Updated : 2023-09-29
#MySql

Mysql DB생성 및 유저등록

Last Updated : 2023-09-29
#Mysql

Mysql 백업 및 복구

Last Updated : 2023-09-29
#MySql

MySql - POD 예제

Last Updated : 2023-09-29
#MySql

데이터베이스에서 작은따옴표(')를 다루는 방법 : SQL 인젝션 예방과 데이터 출력

Last Updated : 2023-09-29
#Mysql

[mySQL] 특정 레코드가 몇 번째인지 알아내는 방법

Last Updated : 2023-09-10
#mySQL #row_number