본문 바로가기
PHP

[PHP] PDO를 활용한 CRUD 구현

by teamnova 2021. 2. 19.

이번 포스팅에서 다룰 내용은 PHP PDO를 이용한 CRUD 구현입니다.

PDO(PHP Data Objects) 여러가지 데이터베이스를 제어하는 방법을 표준화시킨 것으로

데이터베이스를 처리하기위한 여러 기능을 제공합니다.

 

기본적인 서버 세팅과 php,db 연동이 되어있다면 스틱코드를 활용하면 빠르게 구현이 끝납니다.

 

간단하지만 자주 쓰게 될 수도 있는 부분입니다.

 

아래는 예제에 사용된 테이블 입니다.

 

CREATE TABLE user
(
    `idx`       INT             NOT NULL    AUTO_INCREMENT COMMENT '인덱스', 
    `id`        VARCHAR(45)     NOT NULL    COMMENT '아이디', 
    `password`  VARCHAR(255)    NOT NULL    COMMENT '비밀번호', 
    `nickname`  VARCHAR(15)     NOT NULL    COMMENT '닉네임', 
    PRIMARY KEY (idx)
);

해당 테이블을 이용해 회원가입에 해당하는 동작을 간단히 구현해 보겠습니다.

 

 

사용될 파일들입니다.

 

stickode.com/detail.html?no=1904

 

스틱코드

 

stickode.com

완성된 모든 코드는 스틱코드 포스팅을 즐겨찾기 혹은 코드 추가를 통해 간단하게 이용해 볼수 있습니다. 

stickode.com/detail.html?no=1905

 

스틱코드

 

stickode.com

코드 작성에 이용된 스틱코드 모듈(스니펫) 입니다.

 

dbconfig.php

<?php
return [
    'server'=>'서버 ip',
    'name'=>'DB 이름',
    'username'=>'DB 유저 명',
    'password'=>'DB 유저 비밀번호',
    'charset'=>'utf8mb4'
];

?>

우선 DB 정보를 특정파일에 세팅합니다.

 

 

dbconnect.php

<?php
//echo __DIR__;
$dbconfig = require_once __DIR__.'/dbconfig.php';
//echo $dbconfig['server'];

try {
    $pdo = new PDO(
        "mysql:host=" . $dbconfig['server'] . ";dbname=" . $dbconfig['name'] . ";
        charset=" . $dbconfig['charset'], $dbconfig['username'], $dbconfig['password'],
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES => false,
        ]
    );
} catch (Exception $e) {
    echo $e->getMessage();
    // echo 'db connection error';
}

 

db에 접속해서 pdo 객체를 생성합니다.

 

 

insert.php

 

require_once __DIR__.'/dbconnect.php';

try {
//    if(!$this->pdo->inTransaction()) // 필요시 트랜잭션
//        $this->pdo->beginTransaction();
    $col1 = '아이디1';
    $col2 = '1234';//패스워드
    $col3 = '닉네임1';
    $col2 = password_hash($col2,PASSWORD_BCRYPT); // 패스워드 해싱
//    echo $col1;
    $sql = "INSERT INTO user (id,password,nick) VALUES (?, ?,?)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute(array($col1,$col2,$col3));
    $last_idx = $pdo->lastInsertId();
    echo "insert ok - last_idx=".$last_idx;
//    if($this->pdo->inTransaction())  // 필요시 트랜잭션
//        $this->pdo->commit();
} catch (Exception $e){
    if($pdo->inTransaction())
        $pdo->rollBack();
    echo $e->getMessage();
}

 

우선 Create 에 해당하는 insert 구문을 실행하는 파일을 작성해보았습니다.

스틱코드에 있는 INSERT - PDO 부문을 내 테이블 구조와 데이터에 맞게 넣으면 됩니다.

중간에 패스워드를 해시화 하는부분은 선택사항입니다.

 

 

sql문과 PDO를 한번이라도 공부해 보셨다면 어려운 내용은 크게 없습니다. 

 

 

select.php

 

<?php

require_once __DIR__.'/dbconnect.php';
$id = '아이디1';
$password = '1234';
$sql ="SELECT id,nick,password FROM user WHERE id=?  ";
try {
    $stmt = $pdo->prepare($sql);
    $stmt->execute(array($id));

    if ($stmt->rowCount()>0) { //
        $result = $stmt->fetchAll();
        echo json_encode($result,JSON_UNESCAPED_UNICODE);
        $hashed_password = $result[0]['password'];
        if(password_verify($password,$hashed_password)){
            echo "<br>pass";
        }

    }else{ // 결과값 없음.
        echo "no user";
    }
} catch (Exception $e){
    if($pdo->inTransaction()) // 트랜잭션과 연관된 경우 롤백처리.
        $pdo->rollBack();
    echo $e->getMessage();
}

 

 

다음은 Read에 해당하는 select 구문을 실행하는 파일을 작성해 보았습니다.

유저 정보를 가져와서 json 형태로 보여주고

해시화된 패스워드를 확인하는 부분을 간단히 넣어보았습니다.

 

 

update.php

 

<?php
require_once __DIR__.'/dbconnect.php';
try {
//            if(!$this->pdo->inTransaction()) // 트랜잭션 필요시
//                $this->pdo->beginTransaction();

    $column1 = '변경닉';
    $column2 = '아이디1';

    $sql = "UPDATE user SET nick = ? WHERE  id = ?";

    $stmt = $pdo->prepare($sql);
    $stmt->execute(array($column1,$column2));
//            if($this->pdo->inTransaction())  // 트랜잭션 필요시
//                $this->pdo->commit();
    echo "update ok";

} catch (Exception $e){
    if($pdo->inTransaction()) // 트랜잭션 오류시 롤백
        $pdo->rollBack();
    echo $e->getMessage();
}

다음은 Update에 해당하는 update 구문을 실행하는 파일을 작성해 보았습니다.

 

오류없이 업데이트가 완료되면 update ok 합니다.

 

실행후 select.php 를 실행해보면 nick 부분이 변한걸 확인가능합니다.

 

delete.php

 

<?php

require_once __DIR__.'/dbconnect.php';

$sql ="DELETE FROM user WHERE  idx= ?";

try {
    $idx = 1;
//    if(!$this->pdo->inTransaction()) // 필요시 트랜잭션
//        $this->pdo->beginTransaction();
    $stmt = $pdo->prepare($sql);
    $stmt->execute(array($idx));
//    if($this->pdo->inTransaction())  // 필요시 트랜잭션
//        $this->pdo->commit();
    echo "delete ok";
} catch (Exception $e) {
    if($pdo->inTransaction())
        $pdo->rollBack();
    echo $e->getMessage();
}

 

마지막으로 Delete 에 해당하는 delete 구문을 실행하는 파일입니다.

 

오류없이 delete 하면 delete ok 합니다.

 

실행후 테이블에서 데이터가 제거됩니다.

 

 

지금까지 간단히 PDO를 활용한 CRUD기능을 구현해보았습니다.

 

stickode.com/detail.html?no=1904

 

스틱코드

 

stickode.com

 

stickode.com/detail.html?no=1905

 

스틱코드

 

stickode.com