묻고답하기
db에서 data 불러오기 중에 문법 오류가 있나해서 조언을 구해봅니다.
2016.05.19 17:34
xe초보라 고전 중입니다. 전체적인 로직은 이해가 가는데 문법에서 많이 딸리네요. mysql 인라인편집에서는 잘 작동하는 쿼리들이 여기서는 안통하는 경우도 있고해서... 조언을 구해봅니다. 벌써 3시간째 이러고 있네요. 개발자 설명서를 보긴 했는데 이런 부분에 관한 얘기는 없는 듯 해서요... 다른 분들의 QNA보고 조금씩 감을 잡아가고 있습니다.
db 데이터를 로딩해서 html페이지 안에 뿌려주려 하고 있습니다. 일단 데이터가 잘 있나 가져와서 count를 하고 있는데요...
따옴표 등에 상당히 민감하네요 이게... 아래 성공 코드도 FROM 'xe_privilege_grants' 이렇게 따옴표 쓰면 안나오고 따옴표 없애면 결과가 잘 나옵니다. 제가 뭘 잘못하고 있는 건 아닌지... 다른 분들 예제에서는 잘 작동하는 것 같던데요..
아래 코드는 성공적입니다.
{@
$oDB=&DB::getInstance();
$query1=$oDB->_query("SELECT count(*) as total_count FROM xe_privilege_grants");
$result1=$oDB->_fetch($query1);
$count=(int)$result1->total_count;
}
아래 코드는 에러는 없으나 데이터가 count가 0으로 나옵니다. where을 넣은 것이 위와의 차이이구요
분명히 db에는 있는 것을 확인하고 코드를 짜고 있는데도요... 이름이나 철자도 틀린 것은 없습니다.
혹시 제가 모르는 문법 오류가 있나 해서요.. mysql에서 직접 inline실행하면 잘 나옵니다. 하지만 xe에서는 안되네요.
2726자리에 '2726'도 시도해 보았습니다.
{@
$oDB=&DB::getInstance();
$query1=$oDB->_query("SELECT count(*) as total_count FROM xe_privilege_grants WHERE grant_srl=2726");
$result1=$oDB->_fetch($query1);
$count=(int)$result1->total_count;
}
댓글 3
-
sejin7940
2016.05.19 21:01
-
이진샘
2016.05.21 10:56
덕분에 해결에 실마리를 잡게되었네요. 감사^^ 경험을 간단히 요약해서 댓글로 하나 더 남김니다. 또 다른 분들께 도움이 될지도요. 좋은 하루요~
-
이진샘
2016.05.21 10:55
저처럼 혼란에 빠져서 한 참 고민하실 분들이 또 계실 것 같아서 간단하게 아래처럼 제가 겪은 일과 해결하게 된 과정을 글로 남겨 보았습니다. 큰 흐름은 DB를 object형식으로 불러오는가 아닌가에서 $result->columnname를 쓸 것인가 ['columnname']을 쓸 것인가가 차이라 볼 수 있겠습니다.
저는 DB에 있는 xe_privilege_grants라는 테이블에서 사용자번호 3120번님의 자료를 받아와 그 중 expire_date를 출력해 보려하였습니다. 게시판마다 사용권한을 주고 만료날짜를 정해놓는 방식으로 게시판을 만들고 있었습니다.
{@
$oDB=&DB::getInstance();
$query=$oDB->_query("SELECT * FROM xe_privilege_grants WHERE member_srl='3120'");
$result=$oDB->_fetch($query);// 데이터가 있는지 확인하기 위해 아래 두 줄은 썼구요. 아래 두 줄 중 첫째줄이 잘못되어 sejin7940님께서 힌트주셨던 부분입니다.
$count=count($result);
echo $count."개 ";//foreach로 result에 불러온 결과를 하나씩 추출할 때 ->를 쓰는 것을 주의하셔야 합니다. 이건 object형태로 불러온 것이기에 ->로 접근하셔야 하구요 그렇지 않을 땐 늘 하시던 것처럼 $result['expire_date']처럼 쓰셔야 합니다. 여기서 좀 헤맸어요. 실제로는 데이터가 많이 나오는데 모두 expire_date가 같아서 그냥 아래처럼 대충 코딩했는데요 만일 그렇지 않으시다면 좀 변형을 하여 쓰셔야 합니다. 막코딩은 참고하지 마시구요 큰 흐름만 봐주세여 죄송 귀차니즘이 ^^;;;
foreach($result as $result):
$rawdate=$result->expire_date." ";
endforeach;//xe의 경우 expire_date를 201605130000 이런 형태로 db에 저장하더군요. 그래서 아래처럼 년월일 자리에 스페이스를 하나씩 추가한 후 explode로 쪼갰습니다. 그러면 마지막 $arr에는 쪼개는 년,월,일이 배열 형태로 저장됩니다. 그리고는 echo로 화면에 하나씩 출력해 주었습니다.
$rawdate1 = substr_replace($rawdate, " ", 4, 0);
$rawdate2 = substr_replace($rawdate1, " ", 7, 0);
$rawdate3 = substr_replace($rawdate2, " ", 10, 0);
$arr=explode(" ",$rawdate3);echo "<div style='float:left;margin-left:170px'>";
echo "만료기간: ";
echo $arr[0]."년 ";
echo $arr[1]."월 ";
echo $arr[2]."일";
echo "</div>";
}
$count=(int)$result1->total_count;
이 부분이 작동이 안 되는거에요. ->total_count 이건 XE 내부 query 형식을 썼을때
함수에서 따로 구해서 그냥 return 시켜주는 값이지 $oDB 문법에서 지원해주는 값이 아니예요
$count = count($result1);
로 하시면 될거예요