본문 바로가기
Coding/Etc

PHP PDO 사용하는법 + Prepared Statement

by Hide­ 2017. 3. 18.
반응형

기존 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();