본문 바로가기
Language/php

php 개발 시 참고사항 (2)

by 잘먹는 개발자 에단 2025. 1. 31.

* 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엔티티로 변환되어서 안전하게 출력된다.

즉, <&lt;, >&gt;로 변환되어 브라우저에서 텍스트로만 표시됨.

 

 

 

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"}
]