검색어 검색기 구글과 네이트 먹통

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!
검색어 검색기 구글과 네이트 먹통

QA

검색어 검색기 구글과 네이트 먹통

본문

검색어 검색기 소스에서 구글과 네이트가 먹통입니다

 

어디를 수정해야 할까요?

 

고수님들 부탁드립니다

 


<?
// 외부 유입 검색어 분석기
// SearchQuery by mahler83 Ver 1.21 UTF-8
// A plugin for GNU board 4.31.02
// Released at 2009-07-29
// Please give feedbacks to http://bomool.net/
include_once("./_common.php");
$g4[title]="검색어 분석기";
include_once("$g4[path]/_head.php");
// 날짜 설정
if(!$datefrom) $datefrom = date("Y-m-d", strtotime("6 days ago"));
if(!$dateto) $dateto = $g4[time_ymd];
// 주사 지랄 방지
$datefrom = substr($datefrom, 0, 10);
$dateto = substr($dateto, 0, 10);
$site = substr($site, 0, 10);
$site_ori = $site;
// 검색사이트들
$site_arr = array("Google", "Nate", "Yahoo", "Daum", "Naver", "Bing");
$surl_arr = array("Google" => "http://www.google.%", "Nate" => "%nate.com%", "Yahoo" => "%search.yahoo.com%", "Daum" => "%search.daum.net%", "Naver" => "%search.naver.com%", "Bing" => "http://www.bing.com%");
$svar_arr = array("Google" => "q", "Nate" => "q", "Yahoo" => "p", "Daum" => "q", "Naver" => "query", "Bing" => "q");
?>
<style type="text/css">
#m3tbl { border:solid 1px #CCC; border-collapse:collapse;}
#m3tbl th { border:solid 1px #CCC; text-align:center;}
#m3tbl td { border:solid 1px #CCC; text-align:center; padding:2px 8px;}
#div_m3sq ul { display:inline; padding:0; margin:0; }
#div_m3sq ul li { display:inline; padding:0 10px; border:solid 1px #CCC; }
</style>
<div id="div_m3sq">
<h2>외부 유입 검색어 분석기</h2>
<ul>
<li><a href="<?=$PHP_SELF?>?dateto=<?=$dateto?>&datefrom=<?=$datefrom?>">All</a></li>
<? foreach($site_arr as $site) { ?>
<li><a href="<?=$PHP_SELF?>?site=<?=$site?>&dateto=<?=$dateto?>&datefrom=<?=$datefrom?>"><?=$site?></a></li>
<? } ?>
</ul>
<br />
<br />
<form method="get" action="<?=$_SERVER[PHP_SELF]?>">
    <input type="hidden" name="site" value="<?=$site_ori?>" />
    시작 : <input type="text" name="datefrom" value="<?=$datefrom?>" size="10" />
    끝 : <input type="text" name="dateto" value="<?=$dateto?>" size="10" />
    <input type="submit" value="go" /><br />
</form><br />
<form action="javascript:;" onsubmit="findsq(getElementById('sq').value)" />
    결과내 검색 : <input type="text" id="sq" name="sq" value="<?=$sq?>" />
    <input type="submit" value="search" />
    <input type="button" value="reset" onclick="resetsq()" />
    <span id="search_cnt"></span><br />
</form>
<br />
<?
// vi_referer에서 사이트 찾고, vi_date로 범위 정하기, 정렬은 vi_id 역순 (속도 개선 필요)
if(in_array($site_ori, $site_arr)) {
    $where1 = "vi_referer LIKE '{$surl_arr[$site_ori]}' ";
}
else { // 5개 사이트 모두 포함
    $where1 = " ( ";
    foreach($surl_arr as $site => $surl) {
        $where1 .= " vi_referer LIKE '$surl' OR ";
    }
    $where1 .= " 0 )";
}
$query = sql_query("select * from `$g4[visit_table]` where $where1 AND vi_date>='$datefrom' AND vi_date<='$dateto' order by vi_id desc");
?>
<table id="m3tbl">
<tr><th width="150">날짜</td>
    <th width="150">사이트</td>
    <th width="400">검색어</td>
</tr>
<?
$cnt = 0;
$cnt2 = array();
while($row = sql_fetch_array($query)) {
    // 어느 사이트인지 찾기
    foreach($surl_arr as $site => $surl) {
        if(strstr($row[vi_referer], str_replace("%", "", $surl))) {
            $engine = $site;
            break;
        }
    }
    // 검색문자열 찾기
    $regex = "/(\?|&){$svar_arr[$engine]}\=([^&]*)/i";
    preg_match($regex, $row[vi_referer], $matches);
    $querystr = $matches[2];
    // 보통 검색어 사이를 +로 넘긴다
    $querystr = str_replace("+", " ", $querystr);
    // %ab 이런 식으로 된 걸 바꿔주기
    $querystr = urldecode($querystr);
    // 네이버는 unicode로 된 경우도 있어서
    if($engine=="Naver") $querystr = utf8_urldecode($querystr);
    // 캐릭터셋이 EUC-KR인 경우는 UTF-8로 고치기 (EUC-KR 유저는 UTF-8과 EUC-KR를 서로 바꿔주면 될 듯)
    $charset = mb_detect_encoding($querystr, "ASCII, UTF-8, EUC-KR");
    if($charset=="EUC-KR") $querystr = iconv("EUC-KR", "UTF-8", $querystr);
    // 자잘한 처리들
    $querystr = trim($querystr);
    $querystr = htmlspecialchars($querystr);
    
    // 가끔 빈 것들도 있다 -_-
    if(!strlen($querystr)) continue;
    // 에코
    echo "<tr><td>$row[vi_date]</td>";
    echo "<td><a href=\"$PHP_SELF?site=$engine\"><img src=\"$g4[path]/image/".strtolower($engine).".jpg\" /></a></td>";
    echo "<td style=\"text-align:left\" id=\"m3sqtd[$cnt]\"><a href=\"$row[vi_referer]\" target=\"_blank\">$querystr</a></td></tr>\n";
    // 카운트용 변수
    $cnt++;
    $cnt2[$engine]++;
}
ksort($cnt2);
// 베짱이님 제공 함수
function utf8_urldecode($str, $chr_set='CP949') {
    $callback_function = create_function('$matches, $chr_set="'.$chr_set.'"', 'return iconv("UTF-16BE", $chr_set, pack("n*", hexdec($matches[1])));');
    return rawurldecode(preg_replace_callback('/%u([[:alnum:]]{4})/', $callback_function, $str));
} 
?>
</table><br />
Total : <?=$days=(strtotime($dateto)-strtotime($datefrom))/(24*60*60)+1?> days, <?=$cnt?> results (<?=sprintf("%.1f",$cnt/$days)?>/day)<br />
<? if(!$site_ori) { // 모든 사이트의 경우 비율 분석
    foreach($cnt2 as $engine => $count) {
        echo "$engine : $count (".sprintf("%.1f",$count/$cnt*100)."%)<br />";
    }
}?>
</div>
<script type="text/javascript">
function findsq(sq) {
    if(sq=="") return;
    var i = 0;
    var search_cnt = 0; // 결과내 검색 개수
    while(a = document.getElementById("m3sqtd["+i+"]")) {
        if(a.innerText.toLowerCase().match(sq.toLowerCase())) { // 찾는 값이 있으면 보이기
            a.parentNode.style.display="";
            search_cnt++;
        } else { // 찾는 값이 없으면 숨기기
            a.parentNode.style.display="none";
        }
        i++;
    }
    document.getElementById("search_cnt").innerText = "결과내 검색 : " + search_cnt + "건";
}
function resetsq() {
    var i = 0;
    while(a = document.getElementById("m3sqtd["+i+"]")) {
        a.parentNode.style.display=""; // 모든 행의 display 속성 reset
        i++;
    }
    document.getElementById("search_cnt").innerText = "";
    document.getElementById("sq").value = "";
}
</script>
<?
include_once("$g4[path]/_tail.php");
?>

이 질문에 댓글 쓰기 :

답변 1


$site_arr = array("Google", "Nate", "Yahoo", "Daum", "Naver", "Bing");
$surl_arr = array("Google" => "%google.com%", "Nate" => "%nate.com%", "Yahoo" => "%search.yahoo.com%", "Daum" => "%search.daum.net%", "Naver" => "%search.naver.com%", "Bing" => "%bing.com%");
$svar_arr = array("Google" => "q", "Nate" => "q", "Yahoo" => "p", "Daum" => "q", "Naver" => "query", "Bing" => "q");


이렇게 수정하고 몇가지 적용해 보았는데 잘 됩니다.   

// 가끔 빈 것들도 있다 -_-
if(!strlen($querystr)) continue;
이 부분에서 만약에 $row['vi_referer']에 ?q의 q가 없으면  continue 되어서 나오지 않게 됩니다.
참고하세요
답변을 작성하시기 전에 로그인 해주세요.
전체 1
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT