테스트 사이트 - 개발 중인 베타 버전입니다

[1원짜리 팁] 리스트 페이지에서 등록자 정보 효율적으로 추출하기

· 12년 전 · 4462 · 4
리스트에서 게시물 등록자의 레벨을 추출한다던가 포인트를 추출한다던가 해서
계급장을 붙인다. 별점을 준다 이런 것이 필요할 때
즉 등록자의 정보를 회원 테이블에서 가져올 때 아래처럼 하는 것을 자주 봅니다

예를들어 등록자별 레벨이 필요할 때
for($i=0; $i<count($list); $i++){
$level=get_member($list[$i][mb_id], 'mb_level');
~~
~~
echo $level[mb_level];
-----------------------------------
개발하다보면 이런 기능이 자주 쓰이게 됩니다
간단해 보이기도 하고 위와 같이 해서 안 될 것이야 없지만
그누 기본설정 대로 목록수가 15개면 15번 디비를 쿼리하게 되겠습니다
10명이 접속한다면 리스트 페이지 하나를 볼 때 150번의 디비 쿼리가 추가로 발생한다는 얘기죠
이것은 대단히 비효율적이고 느려지게 만드는 방법이 되겠습니다
목록수를 20개, 30개 이상으로 사용하고 있다면 서버 입장에서는 끔찍한 일입니다
------------------------------------
한번만 쿼리를 하면 되는 방법입니다 (list.skin.php 상단에 추가)
--요령은 리스트에 나오는 회원 아이디를 모아서 한번에 쿼리한 다음
아이디별로 자신의 레벨이나 포인트 등의 필요정보를 배열에 담아 둡니다

for($i=0; $i<count($list); $i++) if($list[$i][mb_id]) $tmpArr[]=$list[$i][mb_id];

if($tmpArr[0]){ //등록자 아이디가 있으면
$tmpArr =array_unique($tmpArr); //같은 등록자는 한번만
$idStr="'".implode("','", $tmpArr)."'";
$result=sql_query("select mb_id, mb_level, mb_point from $g4[member_table] where mb_id IN($idStr)");
while($row=sql_fetch_array($result))
$level[$row[mb_id]]= $row[mb_level];
//포인트가 필요하면 $point[$row[mb_id]]= $row[mb_pointl];
}


목록 출력에서
for($i=0; $i<count($list); $i++){
$tmpid=$list[$i][mb_id]
~~
~~
echo $level[$tmpid];
--------------------------------------
한번 쿼리로 리스트에 나오는 모든 등록자의 정보를 가져오는 것이니 대단히 효율적입니다

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 4개

12년 전
새롭게 배워갑니다. 감사합니다.
사용하지는 않지만 디비억세스 최소화 필수죠 좋아요~!! ^^
12년 전
역시 균이님은 그누보드에서 빛과 같은 분이십니다.
감사합니다.
good!!!

게시글 목록

번호 제목
34706
34693
34563
34536
34521
34480
34479
34466
34437
34436
34435
34406
34398
34387
34382
34375
34364
34336
34294
34293