채택완료

코드좀 봐주시면 감사하겠습니다

2017-09-18 (월) 18:58:53 2,224

제가 한번 누르면 추천 또 한번 누르면 취소 이걸 하려는 과정에서 

도움을 받은 코드인데요

그누보드를 하지 않는 분한테 도움을 받은거라서 

제가 잘 적용도 못하고 입으로 아예 밥을 다 넣어줘야되는 수준으로 알려줘야되는건지

도움받았는데 잘 안되네요 

혹시 문법적으로 오류만 있는지없는지좀 알려주시면 감사하겠습니다

저한테 너무 하드코드라서 도저히 알수가 없는데요 

good.php 에서 $count는 필요없어서 그거 뺀건데요 

-------------------------------------------------------------------------

and mb_id = '$member[mb_id]'

이게 회원 아이디로 필터링 하는 조건으로 보입니다.


추천 버튼 옆에 개수 표시를 아예 쓰실 생각이 없으시다면 저 count를 셀렉트 해 오는 로직을 삭제하셔도 될 것 같고요. 아래 로직을 추가해보세요.


$selected = false;

if (isset($member) && isset($member['mb_id'])) {

    $sql = " select count(1) as selected from {$g5['write_prefix']}{$bo_table} where wr_id = '$wr_id'  AND '{$member['mb_id']}'";

    $row = sql_fetch($sql);

    $selected = $row['selected'] > 0 ? true : false; // 내가 추천했는지 여부

}


그리고 결과를 아래와 같이 내보내세요.

print_result($error, $count, $selected); 

function print_result($error, $count, $selected) {

    json_encode(array(

        "error" => $error,

        "count" => $count,

        "selected" => $selected

    ));

}


그다음에 스크립트에서 아래와 같이 로직을 손보세요.

if (data.selected) {

    $el.toggleClass("selected", (data. selected)).find("strong");


    var type = $tx.attr("id").search("nogood") > 1 ? "비추천" : "찜";


var action = data.selected ? "" : " 취소";

    $tx.text("이 글을 " + type + action + "하셨습니다.");

    $tx.fadeIn(200).delay(2500).fadeOut(200);

}

Copy
if ($good == 'good' || $good == 'nogood')    { /* gggg  */         if (!$board['bo_use_good'] && $good == 'good') {            $error = '이 게시판은 추천 기능을 사용하지 않습니다.';            print_result($error, $count);        }        if (!$board['bo_use_nogood'] && $good == 'nogood') {            $error = '이 게시판은 비추천 기능을 사용하지 않습니다.';            print_result($error, $count);        }        $sql = " select bg_flag from {$g5['board_good_table']}                    where bo_table = '{$bo_table}'                    and wr_id = '{$wr_id}'                    and mb_id = '{$member['mb_id']}'                    and bg_flag in ('good', 'nogood') ";        $row = sql_fetch($sql);        if ($row['bg_flag'])        {            if ($row['bg_flag'] == 'good')                $status = '추천';            else                $status = '비추천';//update한 추천, 비추천 값 -1sql_query(" update {$g5['write_prefix']}{$bo_table} set wr_{$good} = wr_{$good} - 1 where wr_id = '{$wr_id}' ");//insert한 로그 중 해당 게시물, 아이디가 추천, 비추천한 로그 삭제sql_query(" delete from {$g5['board_good_table']} where wr_id = '{$wr_id}' and mb_id = '{$member['mb_id']}' order by bg_datetime desc limit 1 ");            $selected = false;if (isset($member) && isset($member['mb_id'])) {    $sql = " select count(1) as selected from {$g5['write_prefix']}{$bo_table} where wr_id = '$wr_id'  AND '{$member['mb_id']}'";    $row = sql_fetch($sql);    $selected = $row['selected'] > 0 ? true : false; // 내가 추천했는지 여부}print_result($error, $count, $selected);function print_result($error, $count, $selected) {    json_encode(array(        "error" => $error,        "count" => $count,        "selected" => $selected    ));}        }       else         {            // 추천(찬성), 비추천(반대) 카운트 증가            sql_query(" update {$g5['write_prefix']}{$bo_table} set wr_{$good} = wr_{$good} + 1 where wr_id = '{$wr_id}' ");            // 내역 삭제            sql_query(" insert {$g5['board_good_table']} set bo_table = '{$bo_table}', wr_id = '{$wr_id}', mb_id = '{$member['mb_id']}', bg_flag = '{$good}', bg_datetime = '".G5_TIME_YMDHIS."' ");            $selected = false;if (isset($member) && isset($member['mb_id'])) {    $sql = " select count(1) as selected from {$g5['write_prefix']}{$bo_table} where wr_id = '$wr_id'  AND '{$member['mb_id']}'";    $row = sql_fetch($sql);    $selected = $row['selected'] > 0 ? true : false; // 내가 추천했는지 여부}            print_result($error, $count, $selected);function print_result($error, $count, $selected) {    json_encode(array(        "error" => $error,        "count" => $count,        "selected" => $selected    ));}        }    } /* ggggg  */

제가 중간여 낑겨넣은거라서 코드는 정상적인걸까여?

|

답변 2개 / 댓글 3개

채택된 답변
+20 포인트
2017-09-18 (월) 19:46:20

* print_result() function 정의는 한번만 쓰는 것이 좋습니다.


good.php 상단에 보면 기존 function 정의가 있습니다. 그 function 정의를 수정하라는 이야기입니다.


* 기존에 추천 또는 비추천을 했는지 여부를 체크하는


if (isset($member) && isset($member['mb_id'])) {

...

}

문은, query 문도 잘못되었고,

이미 21라인의 $row['bg_flag'] 에서 얻어올 수 있는 값입니다.


즉 $selected = $row['bg_flag'] ? true : false; // 내가 추천했는지 여부 

가 됩니다.



전반적으로 이해가 조금은 안되시는 것 같기에..

그 분에게 소스를 직접 수정해 달라고 하는 것이 좋을 것 같습니다.


그 분이 보내준 내용도 전체 로직 흐름면에서는 맞는 얘기인데, 부분 부분 잘못된 코드가 있습니다.

그래서 그 코드로는 실제 정상 작동하지는 않을 것입니다.

실제 소스 수정을 통해 적용/확인해보면서 수정해야 되는 상황으로 보여집니다.

답변에 대한 댓글 3개

감사합니다 쿼리문 잘못된 부분이요
if (isset($member) && isset($member['mb_id']))

여기만 어떻게 수정을 하는게 더 나은지 봐주실수 있을까여?
2017-09-19 (화) 11:07:50
[code]
if (isset($member) && isset($member['mb_id'])) {
$sql = " select count(1) as selected from {$g5['write_prefix']}{$bo_table} where wr_id = '$wr_id' AND '{$member['mb_id']}'";
$row = sql_fetch($sql);
$selected = $row['selected'] > 0 ? true : false; // 내가 추천했는지 여부
}
[/code]

지인분이 보내주신 쿼리의 의미는,
해당 게시글에 추천을 한 적이 있는지 여부를 알아보는 것으로 추측됩니다.

그런데,
1) 뒷부분 AND '{$member['mb_id']}'"; 부분은 SQL 문법적으로 성립이 안되는 구문입니다.
굳이 고친다면 AND mb_id = '{$member['mb_id']}' 식으로 써야 됩니다.

=>

2) 그런데.. 이렇게 고쳐도 쿼리의 의미는, 해당 게시글에 자신이 추천을 한 적이 있는지 여부를 알아보는 쿼리가 아니라.. 추천을 하려는 글이 자신이 쓴 글인지를 알아보려는 쿼리가 됩니다.

3) 해당 게시글에 자신이 추천을 한적이 있는지 여부를 알아보는 쿼리는..
이미 기존의 /bbs/good.php 에 있습니다.

$sql = " select bg_flag from {$g5['board_good_table']}
where bo_table = '{$bo_table}'
and wr_id = '{$wr_id}'
and mb_id = '{$member['mb_id']}'
and bg_flag in ('good', 'nogood') ";

부분이 추천을 했는지 알아보는 쿼리이고, 테이블도 board_good_table 입니다.

혹, 자신이 쓴 글은 자신이 추천할 수 없다의 의미로 사용한 것이라 하더라도..

해당 로직 또한 기존의 /bbs/good.php 에 있습니다.

if($write['mb_id'] == $member['mb_id']) {
$error = '자신의 글에는 추천 또는 비추천 하실 수 없습니다.';
print_result($error, $count);
}

부분이 자신이 쓴글은 자신치 추천할 수 없다의 의미로 사용된 구문입니다.

그래서 지인분이 보낸 쿼리는 굳이 사용하지 않아도 되고

print_rusult() 펑션의 정의 수정구문 적용과 그에 맞춰 결과값을 받아와 처리해주는 부분만 수정해 주면 됩니다.

이런 등등의 전반적인 수정을 하려면, 전반적인 로직이나 구문적인 이해가 필요한데..

지인분은 충분히 직접 소스를 살펴보면서 적용해 보시면 아실 듯 하고,

작성자분이 직접 하시기에는 지금은 조금 어렵지 않을까 합니다.
친절한 답변 넘 감사합니다
일단 대략 눈으로 본 입장에서

눈에띄는건

$wr_id를 검사없이 쿼리에 대입하신것이 보이구요

function 선언의 위치가 if문 속이라 문제가 될듯 하구요
게다가 그 function이 동일한게 두개라서 분명 문제가 될것 같네요

코딩 습관일수도 있고 축약일수도 있지만
sql_query()에
쿼리를 직접 적으시는건 오류 확인이 어렵습니다
가급적 변수를 이용하시고 확인 가능하게 만드시는게
오류를 줄이는 방법입니다

답변을 작성하려면 로그인이 필요합니다.