rss게시판 중복 불러오는 문제입니다. > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

rss게시판 중복 불러오는 문제입니다. 정보

rss게시판 중복 불러오는 문제입니다.

본문

http://sir.co.kr/bbs/board.php?bo_table=g4_skin&wr_id=111217&sca=&sfl=wr_subject%7C%7Cwr_content&stx=rss&sop=and

위에 rss 게시판을 참고하여 약간 고쳐 쓰고 있습니다

그런데 rss 게시물을 불러올 때 일부 게시판을 중복으로 불러옵니다.
어떤건 2개 어떤건 카테고리 수만큼 그 카테고리 이름이 붙여져 중복으로 불러옵니다.
테스트로 주목님이 참고하신 다른 rss게시판들이나 다른 모닝님 게시판도
적용해 보니 모두 중복으로 불러오는 경우가 있었습니다.
else if 문제나 중복호출 인 것 같은데 한번 봐 주시면 감사하겠습니다.

그리고 분류가 있는 링크도 분류가 없는 것으로 인식하는지 게시물의
자체 분류로 붙여지네요. ㅜ,,ㅜ

 꾸벅


<?
//작업중
$g4path = "./"; 
include_once("$g4path/_common.php"); 
include_once("$g4[path]/lib/trackback.lib.php"); 
include_once("$g4[path]/lib/etc.lib.php");

include_once("./mw.lib/mw.skin.basic.lib.php");
require_once ("$board_skin_path/lib_rss.php"); 


$configFile1 = $board_skin_path."/rss_addr.php"; 
$configFile2 = $board_skin_path."/rss_passwd.php"; 
$configFile4 = $board_skin_path."/rss_latest.php";

// 주소록 읽어오기 
$data = $mw_basic[cf_rss_address];
$src_url = explode("|", $data); // 구분자 | - 배열



// 최근에 읽어온 게시물의 시간 읽어옴 
$data = @file($configFile4); 
for($i=0; $i<count($data); $i++) { 
if($data[$i]) { 
$tmp = explode("|", $data[$i]); 
$ltime[$i][url] = $tmp[0]; 
$ltime[$i][time] = $tmp[1]; 
} 
}

if(count($src_url) > 0) { 
	$write_table = $g4[write_prefix] . $bo_table; // 게시판 테이블 전체이름 


	$sql = " select * from $g4[board_table] where bo_table = '$bo_table' "; 
	$bo = sql_fetch($sql); 

	for($i=0, $j=0; $i<count($src_url); $i++) { 

		$tmp_date = 0; 


		//카테고리 있는지 파악한다.		
		if(substr_count($src_url[$i], "^")){
			$src_car = explode("^", $src_url[$i]); // 구분자 | - 배열
			$rss = $rss_array = rss_array(trim($src_car[1])); 
			$channel = $src_car[0];

		}
		else{
		  $rss = $rss_array = rss_array(trim($src_url[$i])); 
			$channel = $rss_array['channel']['title'];		

		}
		

		
		// $description = $rss_array['channel']['description'];			// 채널 내용 추출 
		// $lastBuildDate = $rss_array['channel']['lastBuildDate'];    // 채널 날자 추출 
		// $img_title = $rss_array['image']['title'];							// 로고 추출 
		// $img_url = $rss_array['image']['url'];							// 로고 추출 
		// $img_link = $rss_array['image']['link'];							// 로고 추출

		foreach ($rss_array['items'] as $item) { 

			define("DATE_FORMAT", "Y-m-d H:i:s"); // 날자형식정의 

			$url = $item['link']; 

			if($item["dcdate"]) 
				$item[date] = $item["dcdate"]; 
			else if($item["pubdate"]) 
				$item[date] = $item["pubdate"]; 

			$st = strtotime($item[date]); 
			$item[date] = @date(DATE_FORMAT, $st); 

			$date = $item[date]; 
        
			//$title = iconv("UTF-8", "EUC-KR", $item['title']); 
			$title = iconv("UTF-8", "UHC", $item['title']); // 확장완성형으로 변형
			$name = $item['author']; 
			// $category = $item['category'];
			// $content = strip_tags($item['description']); 
			// $content = $item['description']; 
			//$item['description'] 내부에 링크 교정 
		if($item['description']){ 
				$item['description'] = parse_description($item['description']); 
				//$content = iconv("UTF-8", "EUC-KR", $item['description']); 
			$content = iconv("UTF-8", "UHC", $item['description']); // 확장완성형으로 변형
			}

			if($date > $tmp_date) $tmp_date = $date; 
			$title = addslashes($title); 
			$sql = "select count(*) from $write_table where wr_subject='$title' and wr_link1='$url' and wr_name='$name'"; 
			$row = sql_fetch($sql); 

			if(!$row[0] && $ltime[$i][time] < $date) { 
				$list[$j][site] = $site; 
				$list[$j][title] = $title; 
				$list[$j][url] = $url; 
				$list[$j][content] = $content; 
				$list[$j][creator] = $name; 
				$list[$j++][date] = $date; 
			} // $row[0] 

		} //foreach ( 

		$latest_date .= $url."|".$tmp_date."\n"; 
		unset($rss); 

		////////////////////////////////////////////////////////////// 저장하기
		if($title && $date) { 
			for($j=count($list)-1; $j>=0; $j--) { 

				// 외부이미지 저장
				$img_content = image_rss_run($list[$j][content]);
				if ($img_content)	$list[$j][content] = addslashes($img_content);

				update_board($channel,$list[$j][site], $list[$j][title], $img_content, $list[$j][url], $list[$j][name], $list[$j][date]); 
			} 
		}

//////////////////////////////////////////////////////////////// 
// 읽어온 게시물중 최근시간 저장 
if($latest_date) { 
$fp = fopen($configFile4, "w"); 
fwrite($fp, $latest_date); 
fclose($fp); 
} 
///////////////////////////////////////////////////////////


	} //for($i=0, $j=0; $i<count($src_url); $i++) { 

}  //if(count($src_url)) { 

function update_board($ca_name, $site, $subject, $content, $url, $name, $date) { 
  global $g4, $bo_table, $write_table, $wr_notice, $HTTP_SERVER_VARS; 

	$wr_num = get_next_num($write_table, $wr_notice); 

	$content = addslashes($content); 
	$ca_name = str_replace("|","-",$ca_name); //###add 
	$ca_name = str_replace("&","-",$ca_name); //###add 
	$ca_name = str_replace("+","-",$ca_name); //###add 
    $sql = " insert into $write_table 
                set wr_num = '$wr_num', 
                    wr_reply = '$wr_reply', 
                    wr_comment = 0, 
                    ca_name = '$ca_name', 
                    wr_option = 'html2,$secret,$mail', 
                    wr_subject = '$subject', 
                    wr_content = '$content', 
                    wr_link1 = '$url', 
                    wr_link2 = '$wr_link2', 
                    wr_link1_hit = 0, 
                    wr_link2_hit = 0, 
                    wr_trackback = '$wr_trackback', 
                    wr_hit = 0, 
                    wr_good = 0, 
                    wr_nogood = 0, 
                    mb_id = '$member[mb_id]',
                    wr_name = '$name', 
                    wr_email = '$wr_email', 
                    wr_homepage = '$wr_homepage', 
                    wr_datetime = '$date', 
                    wr_ip = '$_SERVER[REMOTE_ADDR]', 
                    wr_1 = '$site', 
                    wr_2 = '$wr_2', 
                    wr_3 = '$wr_3', 
                    wr_4 = '$wr_4', 
                    wr_5 = '$wr_5', 
                    wr_6 = '$wr_6', 
                    wr_7 = '$wr_7', 
                    wr_8 = '$wr_8', 
                    wr_9 = '$wr_9', 
                    wr_10 = '$wr_10' "; 
    sql_query($sql); 

    $wr_id = mysql_insert_id(); 

    // 부모 아이디에 UPDATE 
    sql_query(" update $write_table set wr_parent = '$wr_id' where wr_id = '$wr_id' ");

    sql_query("update $g4[board_table] set bo_count_write = bo_count_write + 1 where bo_table = '$bo_table'"); 

}
////////////////////////////////////////////// 
// description 교정 
function parse_description($body) { 
        $current = array( 
                        "<a href=" 
                        ); 
        $target = array( 
                        "<a target='_blank' href=" 
                        ); 
        $body = str_replace($current, $target, $body); 
        return $body; 
  } 

?>

<?
$imgSave[max]		= 0;		// 저장가능한 최대사이즈, max 보다 작아야만 저장한다. byte 단위, 0이면 무제한, 1MB 지정하려면 (1024*1024)
$imgSave[min]		= 0;		// 저장가능한 최소사이즈, min 보다 커야만 저장한다. byte 단위, 0이면 무제한
$imgSave[site]		= "*";		// 사이트 지정, 쉼표로 구분, *는 전체사이트를 말함
$imgSave[mode]		= 1;		// 지정한 사이트의 대한 동작, 1이면 site 저장, 0이면 site 제외
$imgSave[type]	= "sock";		// 이미지를 읽어오는 방식, sock : fsockopen함수 이용,     curl : CURL 모듈 이용

if ($imgSave[type] == "curl" && !function_exists("curl_init")) alert("CURL 모듈이 설치되어 있지 않습니다. imgSave[type]을 sock 으로 변경해주세요.");

function image_rss($file, $data) {
	global $g4, $bo_table;
	@mkdir("$g4[path]/data/$g4[cheditor4]/", 0707);
	@chmod("$g4[path]/data/$g4[cheditor4]/", 0707);
	define('SAVE_AS_DIRECTORY', 	"$g4[path]/data/$g4[cheditor4]/$bo_table/");
	@mkdir(SAVE_AS_DIRECTORY, 0707);
	@chmod(SAVE_AS_DIRECTORY, 0707);

	if (!file_exists($file)) {
		$fp = @fopen ($file, 'w');
		if(!$fp) return false;
		fwrite ($fp, $data);
		fclose ($fp);
	}
	return true;
}
function image_rss_run($rss_content) {
	global $g4, $bo_table, $imgSave;

	$img_content = stripslashes($rss_content);
	$img_content = str_replace("&lt;", "<", $img_content);
	$img_content = str_replace("&gt;", ">", $img_content);
	$patten = "/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i";
	preg_match_all($patten, $img_content, $match); 
	$dest_file = "data/$g4[cheditor4]/$bo_table/";		//저장경로
	
	if ($match[1]) {
		foreach ($match[1] as $link) {
			$url = parse_url($link);
			if ($url[host] && $url[host] != $_SERVER['HTTP_HOST']) {
				$image = remote_read_sock($link);
				if ($image) {
					if ($imgSave[min] && $imgSave[min] > $image[filesize]) continue; // 이미지가 최소크기보다 작으면 저장안함
					if ($imgSave[max] && $imgSave[max] < $image[filesize]) continue; // 이미지가 최대크기보다 크면 저장안함
				
					$siteList = explode(",", trim($imgSave[site]));
					$siteListCnt = count($siteList);
					//$site_exists = true;
					$site_exists = false; // 지정한 도메인에 포함이 되어 있는지 여부
					
					for($c=0; $c<$siteListCnt; $c++) {
						if (stristr($image[domain], $siteList[$c])) { // 지정한 도메인에 포함이 되어 있다면
							$site_exists = true;
							break;
						}
					}

					if ($imgSave[mode]) { // action이 저장일 경우
						if ($site_exists || $imgSave[site] == "*") { ; } // 사이트 목록에 있거나 전체사이트에 적용이라면
						else continue;
					}
					else { // action이 제외일 경우
						if ($site_exists || $imgSave[site] == "*") continue; // 사이트 목록에 있거나 전체사이트에 적용이라면
						else { ; } // 사이트 목록에 없다면 통과
					}

					$saveFileName = $dest_file.$image[basename]."_".random_generator(8, 15) . ($image[extension]?".".$image[extension]:"");
					if (image_rss($g4[path]."/".$saveFileName, $image[body]))
						$img_content = str_replace($link, ($g4[path]."/".$saveFileName), $img_content);
				}
			}
		}
		return $img_content;
	}
	else
		return false;
}

function remote_read_sock($urlstr) {
	$url = parse_url2($urlstr);
	$data = "";
	$res	= fsockopen($url[domain], 80, $strErrorNo, $strErrStr, 2);
	if($res) {
		$headerstr = "GET $urlstr HTTP/1.0\r\n"; 
		$headerstr.= "Host:{$url[domain]}:80\r\n"; 
		$headerstr.= "referer:http://$url[domain]\r\n";
		$headerstr.= "\r\n";
		fputs($res, $headerstr);
		while (!feof($res)) {
			$data.= fgets($res, 1024); 
		} 
		fclose($res);
		if (stristr($data, "Not Found") || stristr($data, "Bad Request") || stristr($data, "Forbidden"))
			return false;
	} else return false;

	$patten = "/Content\\-Length:\\s+([0-9]*)\\r\\n/i";
	preg_match($patten, $data, $match);
	if ($match) $filesize = $match[1];
	else $filesize = 0;

	$dataset = explode("\r\n\r\n", $data);	

	return array("data"=>$data, "domain"=>$url[domain], "file"=>$url[file], "basename"=>$url[basename], "extension"=>$url[extension], "url"=>$urlstr, "header"=>$dataset[0], "body"=>$dataset[1], "filesize"=>$filesize);
}

function parse_url2($urlstr) 
{
	$url				= parse_url($urlstr);
	$domain		= str_replace("www.", "", $url[host]);									// 도메인
	$file				= substr($url[path], strrpos($url[path], "/")+1);					// 파일명
	$basename	= str_replace("%", "", substr($file, 0, strrpos($file, ".")));	// 파일명 (확장자 제외)
	if (empty($basename)) {
		$basename = $file;
		$extension = "";
	} else	$extension	= substr($file, strrpos($file,".") + 1);						// 확장자
	
	return array("url"=>$urlstr, "domain"=>$domain, "file"=>$file, "basename"=>$basename, "extension"=>$extension);
}
function random_generator ($min=8, $max=32, $special=NULL, $chararray=NULL) { 
    $random_chars = array(); 
    
    if ($chararray == NULL) { 
        $str = "abcdefghijklmnopqrstuvwxyz"; 
        $str .= strtoupper($str); 
        $str .= "1234567890"; 

        if ($special) { 
            $str .= "!@#$%"; 
        } 
    } 
    else { 
        $str = $charray; 
    } 

    for ($i=0; $i<strlen($str)-1; $i++) { 
        $random_chars[$i] = $str[$i]; 
    } 

    srand((float)microtime()*1000000); 
    shuffle($random_chars); 

    $length = rand($min, $max); 
    $rdata = ''; 
    
    for ($i=0; $i<$length; $i++) { 
        $char = rand(0, count($random_chars) - 1); 
        $rdata .= $random_chars[$char]; 
    } 
    return $rdata; 
} 
////글쓴후 목록으로//////////////////////////////////////////////////////////////////// 
goto_url("../../../bbs/board.php?bo_table=$bo_table" . $qstr); 
?>

댓글 전체

음.. 이 비슷한 소스를 예전에 수정해서 썼었는데
거진 다 새로 만든거나 마찬가지라서 기억이 잘 안나지만

96번째 줄 부분만 수정해도 아마 큰문제는 없을 듯 합니다.

$sql = "select count(*) from $write_table where wr_subject='$title' and wr_link1='$url' and wr_name='$name'";

이 부분을

$sql = "select count(*) from $write_table where wr_link1='$url' ";

음....
안된다면 다시 소스좀 뚫어져라 쳐다보겠습니다만...;;
if(count($src_url)) {
$write_table = $g4[write_prefix] . $bo_table; // 게시판 테이블 전체이름
$sql = " select * from $g4[board_table] where bo_table = '$bo_table' ";
$bo = sql_fetch($sql);

for($i=0, $j=0; $i<count($src_url); $i++) {
$tmp_date = 0;
$rss_array = rss_array(trim($src_url[$i]));
if(is_array($rss_array)) {
$channel = $rss_array['rss']['channel']['title'];// 채널 제목 추출
//세부내용
$url = $rss_array['rss']['channel']['item'][0]['link'];
$sql = "select count(*) from $write_table where ";
$sql .= " wr_link1='".$url."'";
$row = sql_fetch($sql);
$img = $rss_array['rss']['channel']['image']['url'];
if($row['count(*)'] == 0) {
foreach ($rss_array['rss']['channel']['item'] as $item) {
$url = $item['link'];
$title = addslashes($item['title']);
$name = addslashes($item['author']);
$tag = addslashes(implode(", ",$item['category']));
$content = $item['description'];
if($item["pubDate"])
$date = convertDateymd($item["pubDate"]);
else if($item['dc:date'])
$date = convertDateymd($item['dc:date']);
if($date > $tmp_date) $tmp_date = $date;
if($title && $date) {
$sql = "select count(*) from $write_table where ";
$sql .= " wr_link1='".$url."'";
$row = sql_fetch($sql);
if($row['count(*)'] == 0) {
update_board($channel,$site, $title, $content, $url, $name, $date, $tag, $img);
} else {
break;
}
}
} // endforeach
} //endif

$latest_date .= $url."|".$tmp_date."\n";
// 읽어온 게시물중 최근시간 저장
if($latest_date) {
$fp = fopen($rss_url_latest, "w");
fwrite($fp, $latest_date);
fclose($fp);
}
} //endif(is_array)
} // endfor
} //endif

예전에 수정했던 소스중 일부분 인데
함수도 뜯어 고친거라 그대로 적용하시면 안되고 혹 참고하실 부분만 보시면 될듯합니다.
일단 저 소스로 중복글은 등록되지 않습니다.

$sql = "select count(*) from $write_table where ";
$sql .= " wr_link1='".$url."'";
$row = sql_fetch($sql);

if($row['count(*)'] == 0) {

for($i=0, $j=0; $i<count($src_url); $i++) { 이 구문 바로 밑에 쪽에 if문으로
겹치는 링크가 있는지 조사를 해서 없으면 통과~ 로 작업하시면 될듯합니다.
적용시켰더니 하나도 불러오지를 못하네요.
주신 소스만 완전 다 붙이니 중복안되고 잘 불러옵니다만.
함수정의가 틀려서인지 링크도 못불러어고 이것저것 뒤죽박죽이 되서리 ^^;;
이미지 당겨오는 기능이 같이 있어 수정하기가 많이 벅차네요. ㅜ.ㅜ
전체 66,554 |RSS
그누4 질문답변 내용 검색

회원로그인

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