그누보드 튜닝 (list.php - notice)

불당   
   조회 7577   추천 0    

코드가 좀 지저분 합니다. ㅠ..ㅠ.... 수정 가능하신 분의 도움 부탁드립니다. 
이부분은 푸름아빠님께서 많이 도움을 주셨습니다. 감사를 드립니다.
---

/bbs/list.php 에서 공지사항을 찾기 위해서 각각의 공지사항에 대해서 한번의
sql query를 보냅니다. 만일 공지사항이 5개 걸려 있으면 5건의 query가 날아가죠.

이것을 1번으로 줄 일 수 있으면??? 그 결과는 상당할 것 입니다.

(원본)

if (!$sca && !$stx)
{
    $arr_notice = split("\n", trim($board[bo_notice]));
    for ($k=0; $k<count($arr_notice); $k++)
    {
        if (trim($arr_notice[$k])=='') continue;

        $row = sql_fetch(" select * from $write_table where wr_id = '$arr_notice[$k]' ");

        if (!$row[wr_id]) continue;

        $list[$i] = get_list($row, $board, $board_skin_path, $board[bo_subject_len]);
        $list[$i][is_notice] = true;

        $i++;
    }
}

(수정본)
if (!$sca && !$stx)
{
    $arr_notice = split("\n", trim($board[bo_notice]));
    $arr_notice_count = count($arr_notice);

    if ($arr_notice_count > 0) { // 공지사항이 있는 경우

        $sql_case = " ";
        $j = 0;
        for ($k=0; $k<$arr_notice_count; $k++)
        {
            if (trim($arr_notice[$k]) == '')
              continue;
         
            $sql_case .= " when " . $arr_notice[$k] . " then " . $k ;
            if ($j == 0)
              $sql_where = " wr_id = " . $arr_notice[$k] . " ";
            else
              $sql_where .= " or wr_id = " . $arr_notice[$k] . " ";
            $j++;
        } // end of for
   
        if ($j > 0) {
            $sql = " select *, case wr_id $sql_case else 10000 end as fsort from $write_table where $sql_where order by fsort,wr_num, wr_reply ";
            $result_notice = sql_query($sql);
   
            while ($row_notice = sql_fetch_array($result_notice))
            {
                if (!$row_notice['wr_id']) continue;

                $list[$i] = get_list($row_notice, $board, $board_skin_path, $board[bo_subject_len]);
                $list[$i][is_notice] = true;

                $i++;
            } // end of while
        } // end of if $j > 0
   
    } // end of if $arr_notice_count > 0
}

- opencode.co.kr -
Ricky 2008-05
if (!$sca && !$stx)
{   
    if (trim($board[bo_notice])) {
      $arr_notice = str_replace("\n",",",trim($board[bo_notice]));
      $row_notice_result=sql_query("select * from $write_table where wr_id in ($arr_notice)");
      while ($row = sql_fetch_array($row_notice_result)) {
        if (!$row['wr_id']) continue;
        $list[$i] = get_list($row, $board, $board_skin_path, $board[bo_subject_len]);
        $list[$i][is_notice] = true;
        $i++;
      }
    }
}

이렇게 하면 더 짧죠..

select * from aaa where no in (1,2,3,4,5)
원래 sql 은 이런게 됩니다~
     
불당 2008-05
와우~ 감사합니다. 그런데 in을 쓰지 않은 것은 in을 썼을 경우에 공지사항의 순서가
원하는대로 나오지 않기 때문입니다. 아시겠지만 select *의 정렬에 대한 언급이 전혀
없어서 공지가 섞여버리더라구요.

그래서, 푸름아빠님께서 case를 쓰면 된다고 해주셔서 그것으로 변경한 것 입니다.
Rino 2008-05
불당님 Ricky님께서 주신소스가 공지가 석여 버린다면요...

음 sort() 하면 되지 않을까요??

그런데 궁금한게 윈도우 서버에서는 sort() 와 rsort() 가 에러가 나나요???
     
불당 2008-05
공지를 게시글 순서가 아닌 올리는 순서대로 (필드에 있는 그대로) 유지를 하려구 하니까 그런거에요.
윈도는 안써봐서 몰라욤~!!!
Rino 2008-05
좀 길어지긴 했지만...

if (!$sca && !$stx)
{   
    if (trim($board[bo_notice])) {
  $arr_notice = explode("\n",trim($board[bo_notice]));
  for($nc=0; $nc<count($arr_notice); $nc++){
  $arr_no_name[$nc] = $arr_notice[$nc];
$arr_no_count[$nc] = $nc;
  }

      $arr_notice = str_replace("\n",",",trim($board[bo_notice]));
 
      $row_notice_result=sql_query("select * from $write_table where wr_id in ($arr_notice)");
      while ($row = sql_fetch_array($row_notice_result)) {
        if (!$row['wr_id']) continue;
for($sn=0; $sn<$nc; $sn++){
if($row['wr_id'] == $arr_no_name[$sn]){
$i_num = $arr_no_count[$sn];
break;
}
}
        $list[$i_num] = get_list($row, $board, $board_skin_path, $board[bo_subject_len]);
        $list[$i_num][is_notice] = true;
        $i++;
      }
    }
}
     
불당 2008-05
일단 찾아서 array를 정렬하는 것도 테스트를 했었어요^^

그리고 공지에서는 아래가 빠지면 안되요. 가끔 이런 case가 있거든요.

          if (trim($arr_notice[$k]) == '')
              continue;
Rino 2008-05
그런데 궁금 한점 ...?

아래와 같이 하면 암것두 없는 공지 생기는거 는 없어지는데요.

그럼 불당님꺼와  어떤 차이점이 있나요??

if (!$sca && !$stx)
{   
    if (trim($board[bo_notice])) {
  $arr_notice = split("\n",trim($board[bo_notice]));
  $na=0;
  for($nc=0; $nc<count($arr_notice); $nc++){
  if (trim($arr_notice[$nc]) == ' ')
              continue;
  $arr_no_name[$na] = trim($arr_notice[$na]);
$arr_no_count[$na] = $na;
$na++;
  }
 
      $arr_notice = str_replace("\n",",",trim($board[bo_notice]));
      $row_notice_result=sql_query("select * from $write_table where wr_id in ($arr_notice)");
      while ($row = sql_fetch_array($row_notice_result)) {
        if (!$row['wr_id']) continue;
for($sn=0; $sn<$nc; $sn++){
if($row['wr_id'] == $arr_no_name[$sn]){
$i_num = $arr_no_count[$sn];
break;
}
}
        $list[$i_num] = get_list($row, $board, $board_skin_path, $board[bo_subject_len]);
        $list[$i_num][is_notice] = true;
        $i++;
      }
    }
}
     
불당 2008-05
ㅎㅎ... 프로그램 스탈의 차이라고 생각하시면 되지 않을까요???


제목Page 1/4
2013-05   14637   불당
2011-01   16668   불당
2016-08   47658   불당
2008-09   7674   불당
2013-01   15895   불당
2013-06   13073   불당
2008-04   7596   불당
2008-04   8245   불당
2008-04   7179   불당
2008-04   7578   불당
2008-04   5820   불당
2008-04   7931   불당
2008-04   7224   불당
2008-04   7939   불당
2008-04   15238   불당
2008-04   8674   불당
2008-04   6014   불당
2008-04   6332   불당
2008-04   8012   불당
2008-04   8067   불당
2008-04   7220   불당
2008-04   6911   불당
2008-05   5971   불당