* PHP 5.3.6 기준으로 작성함
1. mysql_fetch_assoc()
* mysql_fetch_assoc()이란
- MySQL에서 데이터를 연관배열 (associative array)로 가져오는 함수
- SQL 결과셋에서 한행 row를 가져오고, 컬럼명을 키로 갖는 배열을 반환한다.
* array()에 담으면 사실상 JSON 구조와 동일한가?
- php에서 array()로 데이터를 담으면 key-value 형식이라 JSON과 유사하다.
- json_encode()를 사용하면 실제로 JSON 형태로 변환가능하다.
2. MySQL에서 데이터를 조회하고, array()에 저장하는 코드
- 아래의 코드는 MySQL에서 데이터를 조회한 후, mysql_fetch_assoc()을 사용해서 배열에 저장하는 방법을 보여준다.
<?php
// mysql 연결정보
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";
// MySQL 연결
$conn = mysql_connect($servername, $username, $password);
mysql_select_db($dbname, $conn);
$sql = "SELECT id, name, email FROM users";
$result = mysql_query($sql);
// 결과를 배열로 저장한다.
$data_array = array();
while( $row = mysql_fetch_assoc($result){
$data_array[] = $row; // 각 행을 배열에 추가한다.
}
mysql_close($conn);
// 배열 출력.. 디버깅용
print_r($data_array);
// JSON 형식으로 변환 후 출력
echo json_encode($data_array);
?>
출력 ** print_r($data_array)
Array
(
[0] => Array
(
[id] => 1
[name] => John Doe
[email] => john@example.com
)
[1] => Array
(
[id] => 2
[name] => Alice Smith
[email] => alice@example.com
)
)
출력 ** json_encode($data_array)
[
{
"id": 1,
"name": "John Doe",
"email": "john@example.com"
},
{
"id": 2,
"name": "Alice Smith",
"email": "alice@example.com"
}
]
** $data_array[] = $row; 는 어떻게 동작할까?
이 코드는 mysql_fetch_assoc($result)로 가져온 한 줄 (row)의 데이터를 $data_array 배열에 새로운 요소로 추가하는 동작을 한다.
동작 과정은 다음과 같다.
- mysql_fetch_assoc($result)는 while 루프에서 한 행 row 씩 데이터를 가져온다.
- row에는 연관배열 형태의 데이터가 들어간다.
- $data_array[] = $row; 는 배열의 마지막에 새로운 값을 추가push하는 축약형 표현이다.
$data_array = array(); // 빈배열 초기화
while($row = mysql_fetch_assoc($result)){
$data_array[] = $row; // 가져온 행을 배열에 추가
}
그럼 $data_array[] = $row를 축약형 말고 그냥 쓰려면?
$data_array = array();
while ($row = mysql_fetch_assoc($result)) {
array_push($data_array, $row); // 배열 끝에 값 추가
}
-> 그럼 그냥 명확하게 축약하지 말고 써야하나?
그렇지 않다! $data_array[] = $row;는 더 간결하고 성능이 좋다. php 내부적으로 최적화되어있다고 한다.
하지만 array_push($data_array, $row)는 여러개의 요소를 한번에 추가할 때 유용하다.
이렇게
array_push($data_array, $row1, $row2, $row3);
** while($row = mysql_fetch_assoc($result))는 뭘 순회하는 걸까?
while ($row = mysql_fetch_assoc($result)) {
$data_array[] = $row;
}
이 문은 SQL 실행결과 $result의 행 row들을 순회하는 것이다.
-> 동작과정( 위에서부터 차례대로 )
- mysql_query()로 sql을 실행하면 $result라는 결과집합 resource이 생성된다.
- mysql_fetch_assoc($result)가 결과집합에서 한 행row 씩 가져온다.
- $row는 연관배열 형태로 한 행을 저장한다.
- while문이 실행되면서 $row가 false를 반환할 때까지 계속 반복한다.
** mysql_fetch_assoc($result)의 반환값
$row = mysql_fetch_assoc($result);
- 이 메서드는 현재 행을 연관배열 형태로 반환한다.
- 만약 가져올 행이 없다면 false를 반환한다.
아래를 보자.
$data_array = array();
while ($row = mysql_fetch_assoc($result)) {
$data_array[] = $row;
}
반환되는 $row는 다음과 같다.
// 첫 번째 루프 (1번 사용자)
$row = [
"id" => 1,
"name" => "John",
"email" => "john@example.com"
];
// 두 번째 루프 (2번 사용자)
$row = [
"id" => 2,
"name" => "Alice",
"email" => "alice@example.com"
];
// 세 번째 루프 (3번 사용자)
$row = [
"id" => 3,
"name" => "Bob",
"email" => "bob@example.com"
];
// 네 번째 루프 → 더 이상 가져올 데이터가 없음 → `false` 반환 → `while` 종료
*** 결과적으로 $data_array에는 전체 데이터가 저장되는 것이다..!
3. 자 그렇다면 이제 가져온 데이터를 순회하면서 무엇인가를 출력하려면?
* php의 순회
php의 foreach 문은 배열이나 연관배열을 쉽게 반복 iterate 할 수 있는 문법이다.
특히 mysql에서 가져온 데이터를 html에서 출력할 때 유용하게 사용할 수 있다.
- 숫자 인덱스 배열을 순회할 때
$fruits = array("Apple", "Banana", "Cherry");
foreach( $fruits as $fruit ){
echo $fruit."<br>";
}
- 연관배열을 순회할 때
연관배열에서는 $key => $value 형태로 사용해서 키와 값을 모두 가져올 수 있다.
$user = array(
"name" => "Alice",
"age" => 25,
"email" => "alice@example.com"
);
foreach ($user as $key => $value){
echo "$key : $value <br>";
}
* 출력
name: Alice
age: 25
email: alice@example.com
4. $data_array를 html에서 foreach로 출력하기
fetch_data.php
<?php
// MySQL 연결 정보
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test_db";
// MySQL 연결 (PHP 5.5 이상에서는 mysqli나 PDO를 사용하는 것이 좋음)
$conn = mysql_connect($servername, $username, $password);
mysql_select_db($dbname, $conn);
$sql = "SELECT id, name, email FROM users";
$result = mysql_query($sql);
// 결과를 배열에 저장
$data_array = array();
while ($row = mysql_fetch_assoc($result)) {
$data_array[] = $row; // 각 행을 배열에 추가
}
mysql_close($conn);
?>
index.php
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>사용자 목록</title>
<style>
table {
width: 50%;
border-collapse: collapse;
}
th, td {
border: 1px solid black;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
</style>
</head>
<body>
<h2>사용자 목록</h2>
<table>
<tr>
<th>ID</th>
<th>이름</th>
<th>이메일</th>
</tr>
<?php
require 'fetch_data.php'; // 데이터 가져오기
foreach ($data_array as $row) {
echo "<tr>";
echo "<td>" . htmlspecialchars($row["id"]) . "</td>";
echo "<td>" . htmlspecialchars($row["name"]) . "</td>";
echo "<td>" . htmlspecialchars($row["email"]) . "</td>";
echo "</tr>";
}
?>
</table>
</body>
</html>
** 왜 foreach에서 htmlspecialchars()를 사용하는 걸까?
echo "<td>" . htmlspecialchars($row["name"]) . "</td>";
htmlspecialchars()를 통해서 크로스 사이트 스크립팅 공격 (xss 공격) 을 방어할 수 있기 때문이다.
만약에 데이터베이스에 <script>alert('hacked!');</script> 같은 값이 저장되어있으면 이걸 htmlspecialchars() 없이 출력하면 브라우저에서 실행될 수도 있다.
htmlspecialchars()를 사용하면 html엔티티로 변환되어서 안전하게 출력된다.
즉, < → <, > → >로 변환되어 브라우저에서 텍스트로만 표시됨.
5. foreach로 JSON데이터도 다룰 수 있다.
json_encode($data_array);를 사용해서 php 배열을 json으로 변환하면 foreach를 사용해 javascript에서 데이터를 처리할 수도 있다. javascript에서 users 배열을 활용해서 동적으로 html을 생성가능하다.
$json_data = json_encode($data_array);
echo "<script>let users = $json_data;</script>";
6. mysql_fetch_assoc() 결과를 JSON으로 변환할 수 있다.
- 연관배열을 JSON으로 변환해서 api응답을 만들 때 사용할 수 있다.
echo json_encode($data_array);
[
{"id":1, "name":"John", "email":"john@example.com"},
{"id":2, "name":"Alice", "email":"alice@example.com"},
{"id":3, "name":"Bob", "email":"bob@example.com"}
]
'Language > php' 카테고리의 다른 글
SQL 인젝션 방지, htmlspecialchars(), isset() (0) | 2025.01.31 |
---|---|
php 개발 시 참고사항 (3) - 연관배열 (0) | 2025.01.31 |
PHP 개발 참고 사항 (0) | 2025.01.31 |
php 호스팅 후에 404 처리 feat chatgpt (2) | 2024.09.19 |
post restful api / 프리플라이트 / 왜 배포할 때 모든 도메인에서의 요청을 다 받으면 안될까 (0) | 2024.09.19 |