PHP에서 MySQL 데이터 읽어보기

이 포스트에서는 PHP에서 MySQL 데이터를 간단히 읽어들이는 방법에 대해 포스팅합니다.

우선 데이터베이스 이름이 ‘hello’이고 그 안에서 ‘product’라는 이름의 테이블이 다음과 같이 있다고 가정해 봅시다.

name category price
신라면 라면 700
새우깡 과자 1000
안성탕면 라면 650
새우탕 라면 1100
포스틱 과자 1300
너구리 라면 900
감자깡 과자 700
육개장 라면 800
양파링 과자 1200
짜파게티 라면 750

이 데이터를 HTML 문서로 출력하기 위한 PHP 코드를 작성해 보면 다음과 같습니다.

※ 아래의 코드는 옛날방식으로 PHP 7에서는 지원하지 않는 방식입니다.

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>PHP MySQL load sample</title>
		<style type="text/css">
			table {
				border: 0;
				border-collapse: collapse;
				border-spacing: 0;
			}
			table td, table th {
				border: 1px solid;
				padding: 2px 5px 2px 5px;
			}
			.text-center { text-align: center; }
			.text-right { text-align: right; }
		</style>
	</head>
  
	<body>
		<?php
			/* Load DB */
			$conn = mysql_connect('localhost', 'id', 'passwd');
			$db_status = mysql_select_db('hello');
			if (!$db_status) die('DB Error');
			
			/* Set to UTF-8 Encoding */
			mysql_query('set session character_set_connection=utf8;');
			mysql_query('set session character_set_results=utf8;');
			mysql_query('set session character_set_client=utf8;');
			
			/* Load data */
			$query = 'SELECT * FROM product';
			$result = mysql_query($query);
			
			echo '<table class="text-center"><tr>' .
				'<th>상품명</th><th>분류</th><th>가격</th>' .
				'</tr>';
			while( $prods = mysql_fetch_array($result) ) {
				echo '<tr><td>' . $prods['name'] . '</td>' .
					'<td>' . $prods['category'] . '</td>' .
					'<td class="text-right">' . $prods['price'] . '</td></tr>';
			}

			echo '</table>';
		?>
	</body>
</html>

※ Mysql 대신 Mysqli를 사용한 새로운 방식입니다. 이제는 이 방식의 사용을 권장합니다.

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>PHP MySQL load sample</title>
		<style type="text/css">
			table {
				border: 0;
				border-collapse: collapse;
				border-spacing: 0;
			}
			table td, table th {
				border: 1px solid;
				padding: 2px 5px 2px 5px;
			}
			.text-center { text-align: center; }
			.text-right { text-align: right; }
		</style>
	</head>
   
	<body>
		<?php
			/* Load DB */
			$conn = mysqli_connect('localhost', 'id', 'passwd', 'hello');
			if ( !$conn ) die('DB Error');

			/* Set to UTF-8 Encoding */
			mysqli_query($conn, 'set session character_set_connection=utf8;');
			mysqli_query($conn, 'set session character_set_results=utf8;');
			mysqli_query($conn, 'set session character_set_client=utf8;');
			 
			/* Load data */
			$query = 'SELECT * FROM product';
			$result = mysqli_query($conn, $query);
			 
			echo '<table class="text-center"><tr>' .
				'<th>상품명</th><th>분류</th><th>가격</th>' .
				'</tr>';
			while( $row = mysqli_fetch_array($result) ) {
				echo '<tr><td>' . $row['name'] . '</td>' .
					'<td>' . $row['category'] . '</td>' .
					'<td class="text-right">' . $row['price'] . '</td></tr>';
			}
 
			echo '</table>';
			mysqli_close($conn);
		?>
	</body>
</html>

이 코드를 설명하자면,

먼저 24번 줄에서 MySQL 데이터베이스에 연결합니다. 입력된 4개의 인자는 순서대로 DB 호스트, ID, 비밀번호, 선택할 데이터베이스입니다. 만약 선택하는 데 실패했다면 25번 줄에서 ‘DB Error’라는 메시지를 출력하고 프로그램을 중단시킵니다.

28번 줄부터 30번 줄까지는 UTF-8 인코딩으로 읽고 쓰기 위한 쿼리입니다. 인코딩 인식이 잘못되어 데이터 안의 한글이 깨지는 것을 막기 위해 삽입합니다.

이제 데이터를 읽어서 출력합니다. 33번 줄에서 SELECT * FROM product라는 쿼리를 보냅니다. 이 쿼리는 ‘product’라는 이름의 테이블에 있는 모든 필드를 읽어들이는 쿼리입니다. 그리고 34번 줄에서 이 쿼리를 수행한 결과를 $result라는 이름의 변수에 저장합니다.

36번 줄부터 45번 줄까지의 코드는 읽어들인 데이터를 테이블로 출력하기 위한 코드입니다. 먼저 맨 윗줄을 출력하고 그 다음이 중요한데, 39번 줄부터 43번 줄까지의 반복문은 읽어들인 데이터의 레코드를 하나씩 읽어서 배열로 저장하면서 반복합니다. 이 예제처럼 mysqli_fetch_array 함수를 사용하면 읽어들인 레코드의 필드가 배열의 키 이름으로 저장되어 그 이름으로 접근할 수 있습니다.

그리고 마지막으로 46번 줄에서 mysqli_close 함수를 써서 연결을 닫습니다.

이 코드의 결과는 다음과 같습니다.

상품명 분류 가격
신라면 라면 700
새우깡 과자 1000
안성탕면 라면 650
새우탕 라면 1100
포스틱 과자 1300
너구리 라면 900
감자깡 과자 700
육개장 라면 800
양파링 과자 1200
짜파게티 라면 750

이렇게 데이터의 내용이 표로 출력되었음을 알 수 있습니다.

여기서 보면 모든 항목이 원래 레코드 순으로 정렬되어 표시되는데, 물론 특정 조건을 만족하는 항목만 정렬해서 출력할 수도 있습니다. 예를 들어, 이 예제에서 분류가 ‘라면’인 상품을 가격이 낮은 순으로 출력한다고 하면, 이 예제에서 데이터를 읽어들이는 쿼리 부분을 다음과 같이 수정해 봅시다.

$query = 'SELECT * FROM product WHERE category="라면" ORDER BY price ASC';

이는 product 테이블의 모든 필드를 추출하되 category 필드의 값이 ‘라면’인 레코드에 한해 추출한 후 price 필드의 값 오름차순으로 정렬하는 의미입니다. 이렇게 고쳐서 실행해 보면,

상품명 분류 가격
안성탕면 라면 650
신라면 라면 700
짜파게티 라면 750
육개장 라면 800
너구리 라면 900
새우탕 라면 1100

이렇게 분류가 ‘라면’인 상품만 가격 오름차순으로 정렬되어 출력되는 것을 볼 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다.