기존 PHP에서 데이터베이스에 연결할 때는 DBMS마다 다른함수를 사용했다.
하지만 PDO를 사용하면 DBMS의 종류와 상관없이 통일된 함수로 처리할 수 있다.
먼저 php.ini파일을 수정해야한다.
그림에 나와있는 총 6가지의 옵션을 주석(세미콜론)을 제거하여 활성화시킨다.
그다음 아파치를 재시작한다.
[DB접속]
기존 DB접속을 mysql_connect를 사용했다면 PDO에서는 다음과 같이 사용할 수 있다.
<?php
$hostname = "localhost";
$user = "";
$pass = "";
try {
$conn = new PDO("mysql:host=$hostname;dbname=dbname", $user, $pass);
} catch(PDOException $e) {
print $e;
}
?>
앞으로의 예제는 모두 DB접속 후 작업하는 예제이므로 위 소스를 dbase.php로 따로 저장해놓고
각 예제마다 include "dbase.php"; 를 상단에 선언한 후 사용하는 것으로 한다.
(사실 예제라고 해봤자 쿼리문 작성 후 exec을 통해 실행하는 것 뿐이다)
[데이터베이스 생성]
<?php
include "dbase.php";
$q = "create database test";
try {
$conn->exec($q);
echo "Successfully created db";
} catch(PDOException $e) {
echo "error";
}
$conn = null;
?>
[테이블 생성]
<?php
include "dbase.php";
$q = "CREATE TABLE MyGuests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP)";
try {
$conn->exec($q);
echo "Successfully created table";
} catch(PDOException $e) {
echo "error";
}
$conn = null;
?>
[데이터 입력]
<?php
include "dbase.php";
$q = "insert into MyGuests(firstname, lastname, email)
values('hide','hide','hide@hide.net')";
try {
$conn->exec($q);
echo "success";
} catch(PDOException $e) {
echo "error";
}
$conn = null;
?>
보통 사용자에게 인풋값을 받고 DB를 다루는 경우 mysql_real_escape_string 함수를 사용하여
SQL Injection 공격을 방어한다.
각 인풋값을 mysql_real_escape_string 함수로 덮어주는 방법대신
Prepared Statement를 사용할수도 있다.
사용법은 아래와 같다.
<?php
include "dbase.php";
try {
$stmt = $conn->prepare("insert into MyGuests(firstname, lastname, email)
values(:firstname, :lastname, :email)");
$stmt->bindParam(":firstname", $firstname);
$stmt->bindParam(":lastname", $lastname);
$stmt->bindParam(":email", $email);
$firstname = "h";
$lastname = "ide";
$email = "hide@hide.net";
$stmt->execute();
echo "success";
} catch(PDOException $e) {
echo "error ".$e->getMessage();
}
$conn = null;
?>
추가적으로 Prepared Statement를 사용하여 LIKE문 쿼리를 날릴 때는
다음과 같이 해야한다.
$search = "%$search%";
$stmt = $pdo->prepare("SELECT * FROM user WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();
'Coding > Etc' 카테고리의 다른 글
MySQL timestamp와 datetime 차이점 (0) | 2017.03.25 |
---|---|
PHP PDO 사용시 query와 exec 차이점 (0) | 2017.03.18 |
Warning: mysqli::mysqli(): (HY000/2002): No such file 에러해결 (0) | 2017.03.05 |
자바스크립트 URL/Base64/Hex Encoding, Decoding (0) | 2017.02.18 |
오픈위키(MediaWiki) 설치방법 (0) | 2017.02.01 |