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

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

· 15년 전 · 2811 · 4
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 문제나 중복호출 인 것 같은데 한번 봐 주시면 감사하겠습니다.

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

꾸벅

[code]
<?
//작업중
$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);
?>

[/code]

댓글 작성

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

로그인하기

댓글 4개

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

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' ";

음....
안된다면 다시 소스좀 뚫어져라 쳐다보겠습니다만...;;
15년 전
바로 적용해 봤습니다.
여전히 중복해서 불러옵니다. ^^;

분류문제는 제가 구분자를 잘못 써서 그렇더군요.
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문으로
겹치는 링크가 있는지 조사를 해서 없으면 통과~ 로 작업하시면 될듯합니다.
15년 전
적용시켰더니 하나도 불러오지를 못하네요.
주신 소스만 완전 다 붙이니 중복안되고 잘 불러옵니다만.
함수정의가 틀려서인지 링크도 못불러어고 이것저것 뒤죽박죽이 되서리 ^^;;
이미지 당겨오는 기능이 같이 있어 수정하기가 많이 벅차네요. ㅜ.ㅜ

게시글 목록

번호 제목
284508
284499
284492
284490
284484
284481
284478
284476
284474
284472
284470
284458
284457
284454
284453
284447
284446
284444
284441
284440