이 포스트에서는 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 |
이렇게 분류가 ‘라면’인 상품만 가격 오름차순으로 정렬되어 출력되는 것을 볼 수 있습니다.