흔히들 실습하거나 소규모 개발을 할 때 APM을 참 많이 쓰는 것 같아요. 저도 개인적으로 테스트 프로젝트를 만들거나 연습할 때는 WIN32 환경에서 APMSETUP을 설치해서 씁니다. 예전에는 리눅스나 솔라리스 계열에 VM웨어를 써서 연습하곤 했는데, 요즘은 간편하게 APM SETUP 쓰는 것을 즐겨합니다.

 문득 글을 써야 겠단 생각이 들어서, 예전에 누군가와 같이 에러를 잡고 싸매다가 알아낸 사실을 적어보고자 합니다.

다들 알고 계시겠지만 FETCH 방식은 크게 3개의 방식이 있습니다. 

우선 테이블을 다음과 같이 제시하겠습니다. 예제를 위해서 많이 과장을 했습니다 :)

- user
   - idx(PK, auto increment), name(VARCHAR), notes(VARCHAR)

 idx name notes 
 1  john  student
 2  eric  programmer
 3  max  designer

- user_import
   - idx(PK, auto increment), name(VARCHAR), notes(VARCHAR), assistant_id(INT, FK - user(idx))

 idx  name  notes  assistant_id
 1  susan  tester  2
 2  Mc  professor  1
 3  lucy  illustrator  3

그리고 쿼리는 동일하게 다음과 같이 제시합니다.

 SELECT * FROM user a LEFT JOIN user_import b ON a.idx=b.assistant_id;

그리고 각각의 첫 행을 print_r 함수로 출력하기 위해 간단히 소스를 작성했습니다. :) 

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<?php
	mysql_connect("127.0.0.1","root","apmsetup");

	mysql_select_db("test");

	$query = "SELECT * FROM user a LEFT JOIN user_import b ON a.idx=b.assistant_id;";

	ECHO "1. fetch_row<HR />";

	$rs = mysql_query($query);	
	print_r(mysql_fetch_row($rs));

	ECHO "<HR />2. fetch_assoc<HR />";

	$rs = mysql_query($query);
	print_r(mysql_fetch_assoc($rs));

	ECHO "<HR />3. fetch_array<HR />";

	$rs = mysql_query($query);
	print_r(mysql_fetch_array($rs));

	ECHO "<HR />";
	
?>

그러면 결과는 다음과 같은데요!



1은 쉽게 예상할 수 있지만, 2와 3은 좀 의아하지 않나요?

fetch를 할 때 동일한 column 명을 가졌는데 행 명을 배열의 키로 받는(즉, assoc)방식은 동일한 이름이 있을 경우 마지막에 나온 결과로 처리를 합니다. 

그래서 assoc에서는 애초에 name과 notes가 1개씩 밖에 나오지 않은 것이고, array에서는 1은 john인데 그 옆 name은 Mc이 나오는 결과가 나오게 됩니다.

그 당시, 기존 프로그램을 받아서 거의 개조 수준으로 바꾸는 일이었는데, 기존 개발자가 assoc을 써서 코드 분위기 맞춘다고 assoc을 쓰다가 JOIN을 할 일이 있엉서 썼다가 결과가 나오지 않아서 당황했던 기억이 나서 적어봤습니다 :)
Posted by TY
,