
PHP ์จ๋ผ์ธ ๊ฐ์
>PHP - ์ค๊ธ
๐ PHP ์ค๊ธ - 1์ฃผ์ฐจ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ์ด ๋ฐ MySQL ์ฐ๋ (PDO) - 03 PHP Data Objects (PDO)๋ฅผ ์ด์ฉํ DB ์ฐ๊ฒฐ
![]() |
ํ์ | 10.0 | ๋ผ์ด์ผ์ค | free |
---|---|---|---|---|
์ฌ์ฉ์ํ์ | 10.0 | ์ด์์ฒด์ | ||
๋ค์ด๋ก๋ | 1 | ํ์ผํฌ๊ธฐ | 0 | |
์ ์์ฌ | LUZENSOFT | ๋ฑ๋ก์ผ | 2025-07-11 13:15:53 | |
์กฐํ์ | 38 |
๐ PHP ์ค๊ธ - 1์ฃผ์ฐจ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ์ด ๋ฐ MySQL ์ฐ๋ (PDO) - 03 PHP Data Objects (PDO)๋ฅผ ์ด์ฉํ DB ์ฐ๊ฒฐ
์ #PDO๋ฅผ ์ฌ์ฉํด์ผ ํ๋๊ฐ?
์๋ ํ์ธ์! #PHP ์ค๊ธ ๊ณผ์ ์ ๋ค์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค. ์ง๋ ์๊ฐ์๋ #SQL์ ๊ธฐ๋ณธ์ ์ธ #CRUD ๋ช ๋ น์ด์ ๋ํด ๋ฐฐ์ ์ฃ . ์ค๋์ #PHP์์ #MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ #์์ ํ๊ณ #ํจ์จ์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ํต์ฌ ๋ฐฉ๋ฒ์ธ #PDO(PHP Data Objects)์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
๊ณผ๊ฑฐ PHP์์๋ mysql_connect()
๋ mysqli_connect()
์ ๊ฐ์ ํจ์๋ฅผ ์ง์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ์ต๋๋ค. mysqli
๋ mysql
ํจ์๋ณด๋ค๋ ๊ฐ์ ๋์์ง๋ง, ์ฌ์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข
๋ฅ๋ณ๋ก ๋ค๋ฅธ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๋ถํธํจ์ด ์์์ต๋๋ค.
PDO๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ์ต๋๋ค. PDO๋ #๋ฐ์ดํฐ๋ฒ ์ด์ค #์ถ์ํ #๊ณ์ธต(Database Abstraction Layer)์ ์ ๊ณตํ์ฌ, ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข ๋ฅ(MySQL, PostgreSQL, SQLite ๋ฑ)์ ๊ด๊ณ์์ด ๋์ผํ ์ธํฐํ์ด์ค๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ํํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์๊ธธ ๋ ์ฝ๋ ์์ ์ ์ต์ํํ ์ ์๋ค๋ ๊ฐ๋ ฅํ ์ฅ์ ์ด ์์ต๋๋ค.
๋ฌด์๋ณด๋ค PDO์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ #๋ณด์์ ๋๋ค. PDO๋ #์ค๋น๋ #๊ตฌ๋ฌธ(Prepared Statements)์ ์ง์ํ์ฌ #SQL #์ธ์ ์ ๊ณต๊ฒฉ์ ํจ๊ณผ์ ์ผ๋ก ๋ฐฉ์ดํ ์ ์๋๋ก ๋์์ค๋๋ค. ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ณด์์์ ๋งค์ฐ ์ค์ํ ๋ถ๋ถ์ ๋๋ค.
PDO๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ค์
PDO๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๋ ๊ฒ์ PDO
ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์ด๋ ๋ช ๊ฐ์ง ์ค์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
1. #DSN (Data Source Name)
DSN์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ํ์ํ ์ ๋ณด๋ฅผ ๋ฌธ์์ด ํํ๋ก ์ ์ํฉ๋๋ค. PDO๊ฐ ์ด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ป๊ฒ ์ฐ๊ฒฐํด์ผ ํ๋์ง๋ฅผ ์๋ ค์ฃผ๋ ์ผ์ข ์ ์ฃผ์๋ก์ ๋๋ค.
ํ์: ๋ฐ์ดํฐ๋ฒ ์ด์ค_๋๋ผ์ด๋ฒ:ํธ์คํธ=ํธ์คํธ_์ฃผ์;๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช
=DB_์ด๋ฆ;์บ๋ฆญํฐ์
=๋ฌธ์์
๋ฐ์ดํฐ๋ฒ ์ด์ค_๋๋ผ์ด๋ฒ
: ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข ๋ฅ๋ฅผ ๋ช ์ํฉ๋๋ค. (์:mysql
,pgsql
,sqlite
๋ฑ)ํธ์คํธ=ํธ์คํธ_์ฃผ์
: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๊ฐ ์คํ ์ค์ธ ์ฃผ์์ ๋๋ค. ๋ก์ปฌ ํ๊ฒฝ์์๋localhost
๋๋127.0.0.1
์ ์ฌ์ฉํฉ๋๋ค.๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช =DB_์ด๋ฆ
: ์ฐ๊ฒฐํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฆ์ ๋๋ค. (์:phplearning
)์บ๋ฆญํฐ์ =๋ฌธ์์
: ๋ฐ์ดํฐ ํต์ ์ ์ฌ์ฉํ ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ค์ ํฉ๋๋ค. ํ๊ธ ๋ฑ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํดutf8mb4
๋ฅผ ๊ถ์ฅํฉ๋๋ค.
์์:
PHP
$dsn = "mysql:host=localhost;dbname=phplearning;charset=utf8mb4";
2. ์ฌ์ฉ์ ์ด๋ฆ ๋ฐ ๋น๋ฐ๋ฒํธ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ ๊ถํ์ด ์๋ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ํด๋น ๋น๋ฐ๋ฒํธ์ ๋๋ค.
$user
: MySQL ์ฌ์ฉ์ ์ด๋ฆ (์:root
)$pass
: MySQL ๋น๋ฐ๋ฒํธ (์ค์ ๋์ด ์์ง ์๋ค๋ฉด ๋น ๋ฌธ์์ด''
๋๋null
)
3. ์ต์ (Options)
PDO ๊ฐ์ฒด์ ๋์ ๋ฐฉ์์ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์๋ ์ค์ ๊ฐ๋ค์
๋๋ค. ์ด๋ค์ ๋ฐฐ์ด ํํ๋ก PDO
์์ฑ์์ ๋ค ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ฉ๋๋ค.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
:๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด #PDOException์ ๋ฐ์์ํค๋๋ก ์ค์ ํฉ๋๋ค. ์ด๋ ์ค๋ฅ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋๋ฒ๊น ํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด ์ค์ ์ ํ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํด๋ PHP ๊ฒฝ๊ณ (Warning)๋ง ๋ฐ์ํ๊ณ ์คํฌ๋ฆฝํธ๊ฐ ๊ณ์ ์คํ๋ ์ ์์ด ์ํํฉ๋๋ค.
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
:#SELECT ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ๊ธฐ๋ณธ ํ์น ๋ชจ๋๋ฅผ #์ฐ๊ด #๋ฐฐ์ด(Associative Array)๋ก ์ค์ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฒฐ๊ณผ ๋ฐ์ดํฐ์ ์ปฌ๋ผ ์ด๋ฆ์ผ๋ก ์ ๊ทผํ ์ ์์ด ์ฝ๋ ๊ฐ๋ ์ฑ์ด ์ข์์ง๋๋ค. (์:
$row['name']
)
PDO::ATTR_EMULATE_PREPARES => false
:๋งค์ฐ ์ค์ํ ์ค์ ์ ๋๋ค. #๋ค์ดํฐ๋ธ #์ค๋น๋ #๊ตฌ๋ฌธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋๋ก ์ง์ํฉ๋๋ค. ์ด ์ค์ ์
false
๋ก ํด์ผ #SQL #์ธ์ ์ ๊ณต๊ฒฉ ๋ฐฉ์ด์ ๋ ํจ๊ณผ์ ์ ๋๋ค.true
๋ก ์ค์ ํ๋ฉด PDO๊ฐ SQL ์ฟผ๋ฆฌ๋ฅผ ์๋ฎฌ๋ ์ดํธํ์ฌ ์ฒ๋ฆฌํ๊ฒ ๋์ด ๋ณด์์ ์ทจ์ฝ์ ์ด ์๊ธธ ์ ์์ต๋๋ค.
์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ฝ๋
์ด์ ์ง์์ ๋ฐํ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๋ ์ ์ฒด PHP ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. #์ค๋ฅ #์ฒ๋ฆฌ(try-catch
๋ธ๋ก)๋ ํ์์
๋๋ค.
PHP
<?php
$host = '127.0.0.1'; // ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ์คํธ ์ฃผ์
$db = 'phplearning'; // ์ฐ๊ฒฐํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ
$user = 'root'; // ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์ ์ด๋ฆ
$pass = 'your_password'; // ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋น๋ฐ๋ฒํธ (์ค์ ๋ ๋น๋ฐ๋ฒํธ๋ก ๋ณ๊ฒฝ)
$charset = 'utf8mb4'; // ๋ฌธ์ ์ธ์ฝ๋ฉ
// DSN (Data Source Name) ๊ตฌ์ฑ
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
// PDO ์ต์
์ค์
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // ์ค๋ฅ ๋ฐ์ ์ ์์ธ throw
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // ๊ธฐ๋ณธ ํ์น ๋ชจ๋๋ฅผ ์ฐ๊ด ๋ฐฐ์ด๋ก ์ค์
PDO::ATTR_EMULATE_PREPARES => false, // ๋ค์ดํฐ๋ธ ์ค๋น ๊ตฌ๋ฌธ ์ฌ์ฉ (๋ณด์/์ฑ๋ฅ ํฅ์)
];
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์๋
try {
$pdo = new PDO($dsn, $user, $pass, $options);
echo "๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๊ณต์ ์ผ๋ก ์ฐ๊ฒฐ๋์์ต๋๋ค!". "<br>";
// ์ฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ฝ๋ (SELECT, INSERT ๋ฑ)๋ฅผ ์์ฑ
// ์:
// $stmt = $pdo->query('SELECT * FROM users');
// while ($row = $stmt->fetch()) {
// echo $row['name'] . "<br>";
// }
} catch (PDOException $e) {
// ์ฐ๊ฒฐ ์คํจ ์ ์์ธ ์ฒ๋ฆฌ
// ์ค์ ์๋น์ค์์๋ ์ฌ์ฉ์์๊ฒ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ง์ ๋ณด์ฌ์ฃผ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
// ๋์ ์ค๋ฅ๋ฅผ ๋ก๊น
ํ๊ณ ์ฌ์ฉ์์๊ฒ๋ "์๋น์ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค."์ ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค.
throw new PDOException($e->getMessage(), (int)$e->getCode());
}
?>
์ ์ฝ๋๋ฅผ PHP ํ์ผ๋ก ์ ์ฅํ๊ณ ์น ์๋ฒ๋ฅผ ํตํด ์คํํด ๋ณด์ธ์. your_password
๋ถ๋ถ์ ์ค์ MySQL ๋น๋ฐ๋ฒํธ๋ก ๋ฐ๋์ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ์ฑ๊ณต์ ์ผ๋ก ์ฐ๊ฒฐ๋๋ฉด "๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๊ณต์ ์ผ๋ก ์ฐ๊ฒฐ๋์์ต๋๋ค!" ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ ๊ฒ์
๋๋ค.
๋ง์ฝ ์ฐ๊ฒฐ์ ์คํจํ๋ฉด PDOException
์ด ๋ฐ์ํ๊ณ ์์ธํ ์ค๋ฅ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋์ด ๋ฌธ์ ํด๊ฒฐ์ ๋์์ ์ค ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, ๋น๋ฐ๋ฒํธ๊ฐ ํ๋ ธ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ์ด ์๋ชป๋์์ ์ ์์ต๋๋ค.
์ ๋ฆฌ ๋ฐ ๋ค์ ์ฃผ์ฐจ ์๊ณ
์ด๋ฒ ์๊ฐ์๋ #PDO๊ฐ ์ PHP์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ #ํ์ค์ด์ #์ต์ ์ ๋ฐฉ๋ฒ์ธ์ง, ๊ทธ๋ฆฌ๊ณ PDO๋ฅผ ์ฌ์ฉํ์ฌ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ #์์ ํ๊ฒ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์์ธํ ์์๋ณด์์ต๋๋ค. DSN ๊ตฌ์ฑ, ์ฌ์ฉ์ ์ธ์ฆ, ๊ทธ๋ฆฌ๊ณ ์ค์ํ ์ต์
์ค์ (ATTR_ERRMODE
, ATTR_DEFAULT_FETCH_MODE
, ATTR_EMULATE_PREPARES
)์ ์๋ฏธ์ ์ค์์ฑ์ ์ดํดํ๋ ๊ฒ์ด ํต์ฌ์
๋๋ค.
์ด์ ์ฌ๋ฌ๋ถ์ PHP ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํตํ ์ ์๋ ๊ฒฌ๊ณ ํ ๊ธฐ๋ฐ์ ๋ง๋ จํ์ต๋๋ค.