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 문제나 중복호출 인 것 같은데 한번 봐 주시면 감사하겠습니다.
그리고 분류가 있는 링크도 분류가 없는 것으로 인식하는지 게시물의
자체 분류로 붙여지네요. ㅜ,,ㅜ
꾸벅
위에 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("<", "<", $img_content);
$img_content = str_replace(">", ">", $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' ";
음....
안된다면 다시 소스좀 뚫어져라 쳐다보겠습니다만...;;
거진 다 새로 만든거나 마찬가지라서 기억이 잘 안나지만
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문으로
겹치는 링크가 있는지 조사를 해서 없으면 통과~ 로 작업하시면 될듯합니다.
$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문으로
겹치는 링크가 있는지 조사를 해서 없으면 통과~ 로 작업하시면 될듯합니다.
적용시켰더니 하나도 불러오지를 못하네요.
주신 소스만 완전 다 붙이니 중복안되고 잘 불러옵니다만.
함수정의가 틀려서인지 링크도 못불러어고 이것저것 뒤죽박죽이 되서리 ^^;;
이미지 당겨오는 기능이 같이 있어 수정하기가 많이 벅차네요. ㅜ.ㅜ
주신 소스만 완전 다 붙이니 중복안되고 잘 불러옵니다만.
함수정의가 틀려서인지 링크도 못불러어고 이것저것 뒤죽박죽이 되서리 ^^;;
이미지 당겨오는 기능이 같이 있어 수정하기가 많이 벅차네요. ㅜ.ㅜ