PHP MySQL Select Data
PHP MySQL Select Data : 데이터베이스에서 데이터 조회하기
PHP에서 MySQL 데이터베이스에 저장된 데이터를 조회하려면 SELECT 쿼리를 사용합니다. 이 쿼리는 원하는 데이터를 데이터베이스에서 가져와서 웹 페이지나 애플리케이션에서 사용할 수 있도록 합니다. MySQLi와 PDO를 통해 데이터를 안전하고 효율적으로 조회할 수 있습니다.
이 가이드에서는 PHP로 MySQL에서 데이터를 조회(Select Data)하는 방법, MySQLi와 PDO를 사용한 데이터 조회 예제, 그리고 보안적인 고려 사항을 설명합니다.
1. MySQL에서 데이터 조회(SQL 쿼리)
MySQL에서 데이터를 조회하기 위한 기본적인 SQL 쿼리는 다음과 같습니다:
SELECT column1, column2 FROM table_name WHERE condition;
column1
,column2
: 조회하고자 하는 열의 이름입니다.table_name
: 데이터를 조회할 테이블의 이름입니다.WHERE condition
: 특정 조건을 만족하는 행을 조회할 때 사용합니다. (선택사항)
예시: users 테이블에서 모든 사용자의 정보를 조회
SELECT id, username, email FROM users;
2. MySQLi를 사용한 데이터 조회
2.1 객체 지향 방식으로 데이터 조회
<?php
// MySQL 데이터베이스 연결 정보
$host = "localhost";
$username = "root";
$password = "";
$database = "my_database";
// MySQL 데이터베이스 연결
$conn = new mysqli($host, $username, $password, $database);
// 연결 확인
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// 데이터 조회 SQL 쿼리
$sql = "SELECT id, username, email FROM users";
$result = $conn->query($sql);
// 결과 확인 및 데이터 출력
if ($result->num_rows > 0) {
// 각 행의 데이터를 출력
while($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"]. " - Username: " . $row["username"]. " - Email: " . $row["email"]. "<br>";
}
} else {
echo "0 results";
}
// 연결 종료
$conn->close();
?>
설명:
$conn->query()
: SQL 쿼리를 실행하고 결과를 반환합니다.$result->fetch_assoc()
: 결과 행을 연관 배열로 가져옵니다. 이를 통해 열 이름을 기준으로 데이터를 접근할 수 있습니다.$result->num_rows
: 쿼리 결과로 반환된 행의 개수를 확인합니다.
2.2 절차적 방식으로 데이터 조회
<?php
// MySQL 데이터베이스 연결 정보
$host = "localhost";
$username = "root";
$password = "";
$database = "my_database";
// MySQL 데이터베이스 연결
$conn = mysqli_connect($host, $username, $password, $database);
// 연결 확인
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// 데이터 조회 SQL 쿼리
$sql = "SELECT id, username, email FROM users";
$result = mysqli_query($conn, $sql);
// 결과 확인 및 데이터 출력
if (mysqli_num_rows($result) > 0) {
// 각 행의 데이터를 출력
while($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row["id"]. " - Username: " . $row["username"]. " - Email: " . $row["email"]. "<br>";
}
} else {
echo "0 results";
}
// 연결 종료
mysqli_close($conn);
?>
설명:
mysqli_query()
: MySQLi 절차적 방식에서 쿼리를 실행하고 결과를 반환합니다.mysqli_fetch_assoc()
: 결과를 연관 배열로 가져와 데이터를 출력합니다.
3. PDO를 사용한 데이터 조회
PDO는 여러 데이터베이스 시스템을 지원하는 범용적인 데이터베이스 인터페이스입니다. 데이터를 객체나 배열로 반환할 수 있어 유연성이 높습니다.
<?php
// 데이터베이스 연결 정보
$host = "localhost";
$dbname = "my_database";
$username = "root";
$password = "";
try {
// PDO 객체 생성 및 MySQL 서버 연결
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 데이터 조회 SQL 쿼리
$sql = "SELECT id, username, email FROM users";
$stmt = $pdo->query($sql);
// 결과 확인 및 데이터 출력
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "ID: " . $row['id'] . " - Username: " . $row['username'] . " - Email: " . $row['email'] . "<br>";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
설명:
$pdo->query()
: SQL 쿼리를 실행하고 결과를 반환합니다.$stmt->fetch(PDO::FETCH_ASSOC)
: 결과를 연관 배열로 가져옵니다.PDO::FETCH_ASSOC
는 열 이름으로 데이터를 접근할 수 있게 해줍니다.
4. 조건에 따른 데이터 조회
WHERE 절을 사용하여 특정 조건을 만족하는 데이터를 조회할 수 있습니다. 이를 통해 원하는 데이터만 필터링하여 가져올 수 있습니다.
예시: 특정 사용자 데이터 조회
MySQLi 객체 지향 방식:
<?php
// 데이터 조회 SQL 쿼리
$username = "JohnDoe";
$sql = "SELECT id, username, email FROM users WHERE username = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $username);
// 쿼리 실행 및 결과 출력
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"]. " - Username: " . $row["username"]. " - Email: " . $row["email"]. "<br>";
}
} else {
echo "0 results";
}
$stmt->close();
$conn->close();
?>
PDO 방식:
<?php
try {
// 데이터 조회 SQL 쿼리
$username = "JohnDoe";
$sql = "SELECT id, username, email FROM users WHERE username = :username";
$stmt = $pdo->prepare($sql);
$stmt->execute(['username' => $username]);
// 결과 출력
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "ID: " . $row['id'] . " - Username: " . $row['username'] . " - Email: " . $row['email'] . "<br>";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
설명:
$stmt->prepare()
: 파라미터화된 쿼리를 사용하여 SQL 인젝션을 방지합니다.bind_param()
또는 **execute()
*로 조건 값을 바인딩하여 쿼리를 실행합니다.
5. 보안 고려 사항
5.1 SQL 인젝션 방지
사용자 입력을 기반으로 데이터를 조회할 때는 SQL 인젝션의 위험이 있습니다. 이를 방지하기 위해 **파라미터화된 쿼리(Prepared Statements)**를 사용하여 쿼리와 데이터를 분리해야 합니다.
MySQLi에서 SQL 인젝션 방지:
$stmt = $conn->prepare("SELECT id, username, email FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
PDO에서 SQL 인젝션 방지:
$stmt = $pdo->prepare("SELECT id, username, email FROM users WHERE username = :username");
$stmt->execute(['username' => $username]);
5.2 사용자 입력 유효성 검사
SQL 인젝션을 방지하기 위해서는 Prepared Statements 외에도 사용자 입력에 대한 유효성 검사가 필요합니다. 예를 들어, 이메일 형식이 맞는지 확인하거나, 문자열 길이를 제한하는 등의 검사를 수행해야 합니다.
if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
// 유효한 이메일일 경우 쿼리 실행
}
6. 페이징 처리
많은 양의 데이터를 조회할 경우 페이징을 사용하여 한번에 보여줄 데이터의 양을 제한하는 것이 좋습니다.
예시: 10개의 데이터씩 페이징 처리
<?php
$limit = 10;
$page = isset($_GET['page']) ? (int)$_GET['page
'] : 1;
$start = ($page - 1) * $limit;
// 데이터 조회 SQL 쿼리
$sql = "SELECT id, username, email FROM users LIMIT ?, ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ii", $start, $limit);
// 쿼리 실행 및 결과 출력
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"] . " - Username: " . $row["username"] . " - Email: " . $row["email"] . "<br>";
}
$stmt->close();
$conn->close();
?>
설명:
LIMIT
절을 사용하여 한 번에 조회할 데이터의 수를 제한합니다.page
파라미터를 통해 현재 페이지를 계산하고, 그에 맞는 데이터만 가져옵니다.
요약
- *PHP와 MySQL을 사용하여 데이터를 조회(Select Data)**하는 방법에는 MySQLi와 PDO를 사용할 수 있습니다. SELECT 쿼리를 통해 원하는 데이터를 가져오고, 이를 배열이나 객체 형태로 처리할 수 있습니다. 또한 파라미터화된 쿼리를 사용하여 SQL 인젝션을 방지하고, 사용자 입력에 대한 유효성 검사를 추가함으로써 보안을 강화할 수 있습니다. 많은 양의 데이터를 조회할 경우에는 페이징 처리를 통해 성능을 최적화할 수 있습니다.