- 3
- 이니스프리
- 조회 수 918
안녕하세요?
아미나의 Q&A 게시판에 제가 오늘 답변 댓글을 작성한 것 중에서 회원 이미지와 관련하여 주제가 겹치는 부분이 있어서
PHP를 공부하는 차원에서 조금 더 보완하고 정리하여 이 게시판에 다시 올립니다.
물론 제 스크립트에 부족한 점이 많지만 스포어 회원님들과 함께 더욱 나은 방법을 궁리해보도록 하겠습니다 :)
1. 회원 이미지 미등록시 여러 종류의 다른 사진을 최대한 랜덤하게 보여주기
이와 관련해서는 우선 한별아빠 님께서
/lib/apms.lib.php 파일의 apms_photo_url() 함수에서 if(!is_file($photo_file)) return $xp['xp_photo_url']; 부분을
if(!is_file($photo_file)) {
$photo_url = G5_URL.'/이미지경로/'.substr($mb_id, 0, 1).'.gif';
}
이렇게 수정하면 id의 알파벳 첫 글자에 따라 26개의 이미지를 보여줄 수 있다고 말씀해주셨습니다.
그런데 jake 님의 말씀에 따르면 회원들이 소셜 로그인을 많이 하기 때문에 특정 알파벳의 비율이 지나치게 높다고 하시더군요 ㄷㄷ
예컨대 구글 계정으로 가입하면 google_???????? 이런 식으로 mb_id가 생성되기 때문에
모두 'g'에 해당하는 이미지가 보여지게 되는 문제점이 있는 것이죠.
그래서 mb_id의 각 글자(알파벳 대소문자 및 숫자, 공백을 제외한 특수문자)를 아스키코드로 변환한 값을 모두 더하여
사용할 예정인 이미지의 개수로 나눈 후 1을 더한 값을 사용하게 되면,
소셜 로그인을 통해 생성되는 mb_id 값이 모두 다를테니
완전한 랜덤은 아니더라도 랜덤에 가깝게 특정 이미지에 몰리지 않고 고르게 분포될 것이라고 생각되네요.
이를 PHP 스크립트로 나타내면 다음과 같습니다.
이 글을 빌어 jake 님께 다시 한 번 감사드려요 ^-^
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | if (! is_file ( $photo_file )) { $mb_check = preg_replace( "/\s+/" , "" , $mb_id ); $mb_check = preg_replace( "/[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/" , '' , $mb_check ); // id에 한글을 허용하지 않으면 삭제하셔도 무방합니다. if (! $mb_check ) { $mb_check = 'Aa10!' ; } $sum = 0; $length = strlen ( $mb_check ); for ( $i =0; $i < $length ; ++ $i ) { $sum += ( intval (ord( substr ( $mb_check , $i , 1)))); } $sum = ( $sum % 26)+1; // 출력할 이미지가 1.gif부터 26.gif인 경우를 전제로 했습니다. $photo_url = G5_URL. '/이미지경로/' . $sum . '.gif' ; } |
사실 for문으로 $mb_check 전체를 돌리는 것은 리소스와 시간 낭비인 것 같고
소셜 로그인으로 생성되는 $mb_id의 형식을 볼 때 뒤에서 5자리 정도만 고려하면 충분할 것 같네요.
대략 for ($i = -1; $i >= -5; --$i) 이런 방식으로 하면 될텐데
다만 $length < 5인 경우에 대하여 별도로 고려를 해서 break를 해야 에러가 발생하지 않겠네요.
2. 특정 레벨 이상인 경우에만 회원 이미지를 등록할 수 있도록 하기
가입하자마자 회원 이미지에 광고용 사진을 업로드하는 사람들 때문에 사이트 관리에 애를 먹는 분들이 계시더군요 ㅠㅠ
/bbs/myphoto.php의 7번째 줄 정도에 이 스크립트를 추가하시면 레벨 3 이상인 경우에만 사진을 업로드하도록 할 수 있습니다.
1 2 3 | if ( $member [ 'mb_level' ] <= 2) { alert_close(aslang( 'alert' , "레벨업 하신 후에 이용이 가능합니다." )); } |
만약 레벨 2 이하의 경우 회원 이미지를 변경하려고 하면 다음과 같은 경고창이 뜨면서 중단됩니다.
이상 여러모로 부족한 제 스크립트를 읽어주셔서 감사합니다.
다 나은 방향이 있다면 말씀해주시면 감사하겠습니다 ^-^
그럼 감기와 보일러 동파 조심하시고 즐겁고 뜻깊은 연말 되세요~!
1에서 for문과 if문으로 조건을 달기 귀찮으신 분들은 아래와 같이 md5나 sha1과 같은 해싱함수를 사용하셔도 됩니다.
참고로 이니스프리님께서 올리신 코드도 일종의 해싱함수라고 볼 수 있습니다.
if
(!
is_file
(
$photo_file
)) {
$sum
=
intval
(
substr
(md5(
$mb_id
), 0, 5));
$sum
= (
$sum
% 26)+1;
// 출력할 이미지가 1.gif부터 26.gif인 경우를 전제로 했습니다.
$photo_url
= G5_URL.
'/이미지경로/'
.
$sum
.
'.gif'
;
}