티스토리 뷰

반응형

1. PDO는 뭐지? 왜 쓰는건가?


참조사이트



나는 이전 프로젝트까지는 MYSQL을 썼기 때문에, PHP와 데이터베이스를 연동하기 위해 mysqli 함수를 사용하였다.


mysqli 함수 역시 객체지향형 데이터베이스 인터페이스로서, 여러가지 장점이 많은 인터페이스이다. 또한, MariaDB를 지원한다.


하지만... 나는 이번 프로젝트에서 Postgresql을 사용하기 때문에 더이상 mysqli 함수를 쓰지 못한다. 


그래서 그냥 pgsql 함수를 사용할까 생각도 했지만, 객체 지향형이 아닌 절차지향형 함수여서 포기하였다.


그래서 선택한 것이 PDO이다.(아, 그리고 mysqli함수는 php에서 제외 될 예정이라 카더라.(진짜인지 모름))


PDO는 PHP extension module 중 하나로써, PHP Data Objects 의 준말이며, 객체지향형 데이터베이스 인터페이스이다.

(※이미 이전에 AWS에 LEPP 설치를 진행 하면서 php-pdo 모듈을 설치했었다.)


기본적으로 mysqli와 같이 SQL Injection을 막기 위하여 prepared statement를 지원한다.

SQL injection에 대해서 알아보자(1)SQL injection에 대해서 알아보자(2)


또한 PDO는, Mysql과 MariaDB 뿐만 아니라, Oracle, DB2, Postgresql, mssql 등 여러가지 데이터베이스를 종합적으로 지원한다.


이 덕분에, 다른 데이터베이스로 옮길 때, 코드 수정에 대한 부담이 확 줄어들게 된다.




2. PDO의 기본 사용법(Postgresql)

참조사이트




2-1) PDO 객체 생성(_DB_CONNECT.php)


<?php

$pg_db_host = 'localhost';
$pg_db_username = 'postgres'; // 자신이 설정한 DB 유저(role)이름. postgres는 기본 이름
$pg_db_name = 'postgres'; // 자신이 만든 DB 이름, postgres는 기본 DB이름
$pg_db_password = 'password'; // 자신이 설정한 비밀번호 입력

$dsn = "pgsql:host=$pg_db_host;dbname=$pg_db_name";
// cf. 만약, mysql로 DB를 바꾸려면 pgsql을 mysql로 바꿔주기만 하면 됨. 이게 PDO의 장점

$pdo = new PDO($dsn, $pg_db_username, $pg_db_password); // PDO 객체 생성.


또한, DB와 커넥션을 해제(기존의 mysqli에서 쓰던 close();와 같은..)하기 위해서는 다음과 같이 한다.

$pdo = null;





2-2) Prepared statement 활용한 CRUD 쿼리문 작성(USER_CRUD.php)

(회원정보를 갖고 활용하는 것으로 예를 들겠다.)


※PDO는 mysqli과 다르게 bindParam 함수를 쓸 때, 한꺼번에 집어넣지 못한다. 따라서 execute함수에 다 넣는다.

※bindParam 또는 bindValue 함수를 쓸 수 있지만, 번거롭기 때문에 제외한다.








①. INSERT(CREATE) - 회원가입


<?php
require_once '_DB_CONNECT.php';

$user_id = $_POST['user_id']; // POST 요청으로 받은 ID값
$user_name = $_POST['user_name']; // POST 요청으로 받은 이름 값
$user_pw = sha1($_POST['user_pw']); // POST 요청으로 받은 비밀번호 값을 sha1함수를 통해 암호화 시킴

$stmt = $pdo->prepare("INSERT INTO user_table (u_id, u_name, u_pw) VALUES (?, ?, ?)");
$stmt->execute([$user_id, $user_name, $user_pw]); // 파라미터를 배열화 시킴.
$pdo=null;








②. SELECT(READ) - 회원정보 모두 나열, 중복 회원 검사



1) fetchAll 함수를 쓰는 경우

※ 회원들의 정보 중 이름과 아이디 정보를 모두 나열하여 JSON으로 보냄

※ PDO는 fetchAll를 지원하기 때문에 매우 간단하게 데이터를 불러올 수 있다.


<?php
require_once '_DB_CONNECT.php';

$response = array();

$stmt = $pdo->prepare("SELECT u_id, u_name FROM user_table");
$stmt->execute();
$response = $stmt->fetchAll(PDO::FETCH_ASSOC);

echo json_encode($response,JSON_UNESCAPED_UNICODE);

$pdo = null;




2) fetch 함수를 쓰는 경우(while문을 돌려, 회원들의 아이디와 이름정보를 JSON으로 내보냄)


<?php
require_once '_DB_CONNECT.php';

$response = array();
$stmt = $pdo->prepare("SELECT u_id, u_name FROM user_table");
$stmt->execute();
while ($row=$stmt->fetch()) {
$temp = array();
$temp['u_id'] = $row['u_id']; // $row['u_id'] 는 데이터베이스 한 열에 해당하는 데이터 값(아이디)
$temp['u_name'] = $row['u_name']; // $row['u_name'] 는 데이터베이스 한 열에 해당하는 데이터 값(이름)
array_push($response, $temp);
}
echo json_encode($response,JSON_UNESCAPED_UNICODE);
$pdo = null;


3) 아이디 중복검사 (COUNT(*)을 이용하여 해당 아이디가 존재하는지 검사)

※rowCount() 함수도 있지만 2번 일을 수행하게 되니, COUNT문을 쓰는걸 권장.


<?php
require_once '_DB_CONNECT.php';
$user_id = $_POST['user_id'];
$stmt = $pdo->prepare("SELECT COUNT(*) u_name FROM user_table WHERE u_id = ?");
$stmt->execute([$user_id]);
if ($stmt->fetchColumn() > 0) { // fetchColumn함수는 SQL문으로 COUNT 된 행의 개수를 나열하는 함수, id가 1개 이상인 경우
echo "이미 존재하는 아이디 입니다.";
// 가입 불가 코드 작성
} else {
echo "아이디가 없습니다. 회원가입을 진행하세요.";
// 회원가입(INSERT SQL) 코드 작성
}
$pdo = null;








③. UPDATE - 회원정보 수정



해당 아이디의 회원정보 중 이름값을 수정


<?php
require_once '_DB_CONNECT.php';
$user_id = $_POST['user_id'];
$user_rename = $_POST['user_rename']; // 수정할 이름 요청 값
$stmt = $pdo->prepare("UPDATE user_table SET u_name = ? WHERE u_id = ?");
if ($stmt->execute([$user_rename, $user_id])) {
echo "수정 완료.";
// 수정 완료 코드 작성.
} else {
echo "수정 실패.";
// 수정 실패 코드 작성.
}
$pdo = null;







④. DELETE - 회원정보 삭제


<?php
require_once '_DB_CONNECT.php';
$user_id = $_POST['user_id']; // 삭제할 아이디 요청 값
$stmt = $pdo->prepare("DELETE FROM user_table WHERE u_id = ?");
if ($stmt->execute([$user_id])) {
echo "삭제 완료.";
// 삭제 완료 코드 작성.
} else {
echo "삭제 실패.";
// 삭제 실패 코드 작성.
}
$pdo = null;


반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함