php 고수님들 도와주세요.. > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

php 고수님들 도와주세요.. 정보

php 고수님들 도와주세요..

본문

php 워낙 초보라 함수도 잘 모르고 왜 이런 문제가 생기는지 도저히 모르겠네요

아래는 게시판 스킨중 (write.skin.php) 와 (wite_update.skin.php)의 중요부분입니다


#### write.skin.php ####

 $wr_body_1 = explode("|",substr($write[wr_101], 1));
 $wr_body_2 = explode("|",substr($write[wr_102], 1));
 $wr_body_3 = explode("|",substr($write[wr_103], 1));

for ($i = 0;  $i < count($wr_body_1); $i++) {
 <table width="800" cellpadding="0" cellspacing="0">  
<tr>
 <td><input  name=wr_body_1[]  value='<?=$wr_body_1[$i]?>'></td>
 <td><input  name=wr_body_2[]  value='<?=$wr_body_2[$i]?>'></td>
 <td><input  name=wr_body_3[]  value='<?=$wr_body_3[$i]?>'></td>
</tr>
}
######################


#### wite_update.skin.php ####
for ($i = 0;  $i < count($wr_body_1); $i++)
{
 $wr_101 = $wr_101."|".$wr_body_1[$i]; 
 $wr_102 = $wr_102."|".$wr_body_2[$i]; 
 $wr_103 = $wr_103."|".$wr_body_3[$i];
 }
##############################

소스는 많이 생략했습니다
용도는 글쓰기화면에서 '추가' 라는 버튼을 만들어 두고
버튼을 누를때마다 입력폼(위의 테이블부분)이 증가 하고 여기에 입력한 값을
" I " 로 구분하여 여분필드에 저장했다가
다시 불러와서 배열로 만들고 이를 보여주기도 하고 다시 추가하는 형태의
소스입니다
그래서 저장되어 있는 값이 있을때 저 for 문이 동작하면서
보여주게 되는데요

문제는 제목이나 내용은 입력하지만
추가 버튼을 전혀 누르지 않고 위에 폼에는 아무것도 입력하지 않은채
글쓰기를 완료하고  난 뒤 리스트로 빠져나와서
다시 해당 게시물 수정화면으로 들어가면 입력폼이 하나 늘어나 있습니다
물론 공백상태로요.

위의 count() 의 값이 왜 1 이 될까요. 아무것도 입력하지 않고 글쓰기를 했다면
글쓴 후 다시 해당게시물을 수정하는 화면에 들어갔을때
count() 값이 0 이니까 저 테이블이 보이지 않아야 되는거 아닌가요
왜 count() 값이 1이 되어서 폼은 보이는걸까요

글 수정화면이 아닌 최초 글쓸때에는 저 테이블이 보이지 않습니다
count 값이 0이란 말이죠..

저 곳에 사용된 함수나 방식에 문제점이 무엇인지 가르침 좀 주세요
긴 글 읽어주셔서 감사드립니다.

댓글 전체

급하게 보면 wr_101 / wr_102 / wr_103 이 추가된 게시판 스킨입니다.

1번째 확장필드 사용하기 방법 검색을 해보시길 권합니다.

2번째 계속해서 테이블 추가를 하면 안에 생성이 될듯 한데 </table> 로 닫아주는게 맞지 않을까 합니다.

그게 아니시라면 <tr> 부터 시작하는게 맞지 않을까 하구요 ;;

for ($i = 0;  $i < count($wr_body_1); $i++) {
 <table width="800" cellpadding="0" cellspacing="0"> 
<tr>
 <td><input  name=wr_body_1[]  value='<?=$wr_body_1[$i]?>'></td>
 <td><input  name=wr_body_2[]  value='<?=$wr_body_2[$i]?>'></td>
 <td><input  name=wr_body_3[]  value='<?=$wr_body_3[$i]?>'></td>
</tr>
}

이부분은

for ($i = 0;  $i < count($wr_body_1); $i++) {
 <table width="800" cellpadding="0" cellspacing="0"> 
<tr>
 <td><input  name=wr_body_1[]  value='<?=$wr_body_1[$i]?>'></td>
 <td><input  name=wr_body_2[]  value='<?=$wr_body_2[$i]?>'></td>
 <td><input  name=wr_body_3[]  value='<?=$wr_body_3[$i]?>'></td>
</tr>
</table>
}
으로 바뀌어야 하지 않을까 하구요... </table> 닫아줘야 할듯 합니다.


#### wite_update.skin.php ####
for ($i = 0;  $i < count($wr_body_1); $i++)
{
 $wr_101 = $wr_101."|".$wr_body_1[$i]; 
 $wr_102 = $wr_102."|".$wr_body_2[$i]; 
 $wr_103 = $wr_103."|".$wr_body_3[$i];
 }
##############################

이 부분도 보시면 wr_101 에 결국 $wr_101."|".$wr_body_1[$i];  하면서

구분자로 "|" 를 넣어서 내용을 추가하는 부분입니다.

이 부분을 생각해 보시면 bbs 방안에 확장 필드 사용하기 부분을 참조 하시면 답변이 될듯 합니다.

결론은 bbs/write_update.php 안에서 255번 라인과 354 번 라인 정도에 있는

$sql =  하는 구문에 wr_101 = '$wr_101' , 이런식으로 추가를 해주시거나

딴 방법으로는 안전하게 skin 방안에 write_update.skin.php 를 생성하신후에 ...

$sql = "update  테이블명 set  wr_101 = '$wr_101',wr_102 = '$wr_102', wr_103 = '$wr_102' where wr_id =  $wr_id";
$rst = sql_query($sql);

였던가 -_-;; 이걸 응용하시면 될듯 합니다.

더 자세한건 고수분들께서 답변 달아 주실겁니다.
방황하는중년  // 친절하신 답변 감사드립니다. 지적하신 부분은 소스상에 포함되어 있지만
                        문제점이 count() 가 아무런 값이 없을때도 0이 아닌 1을 반환한다는 것이기에
                        관계없는 소스를 생략한 뒤 제가 질문을 하였던 것입니다
                        오해하시게 한 점 죄송하네요.
                        관심 감사드립니다
explode를 이해하지 못하신 것 같은 생각이 드네요. 예로 $str='1|2'를 '|'로 explode하면 array('1', '2')가 되겠죠. 그런데 '|'이 없으면  무조건 단 한개의 array가 생성됩니다. 예로 $str = ''인 아무것도 없는 스트링을 '|'로 explode하면 array('')이 됩니다. 이해하셨는지 모르겠네요. 그래서 explode하고 count가 1값이라 할지라도 비어있는 값인지 확인하는 절차를 거칠 필요가 있을거 같네요.
letsgolee // 답변 감사드립니다.  저도 같은 생각을 하여 DB 에 해당 여분 필드 값의 변화를 지켜보면서
                  수정을 여러차레 해 보았습니다
                문제는 "I" 나 아예 아무런 값이 없을때도 count() 값이 1이 되어서 저 테이블 부분이 한번
                실행된다는 것입니다. count() 함수를 찾아보니 배열이 아닐시에는 null 값을 반환하지만
                배열이지만 아무런 값이 없을때는 1을 반환한다고 적혀 있더라구요
                그렇다면 위와 같은 방식으로 여분필드를 쪼개서 저장하고 불러올때 아무런 값이 없을때
                0을 반환하거나 소스를 수정하여 아무런 값이 없을때 저 for문이 한번도 실행안되게 할려면
                어떻게 해야 하는지 궁금합니다.
                감사합니다~
$wr_body_1 = explode("|",substr($write[wr_101], 1)); 다음에 이렇게 하면 해결이 될까요? 전체 소스를 모르기 때문에 대충 적어봅니다.

if (count($wr_body_1) == 1 && !strlen($wr_body_[0])) {
    $wr_body_1 = array();
}
if (strlen($wr_body_1[0])) { 

for ($i = 0;  $i < count($wr_body_1); $i++) {
 <table width="800" cellpadding="0" cellspacing="0"> 
<tr>
 <td><input  name=wr_body_1[]  value='<?=$wr_body_1[$i]?>'></td>
 <td><input  name=wr_body_2[]  value='<?=$wr_body_2[$i]?>'></td>
 <td><input  name=wr_body_3[]  value='<?=$wr_body_3[$i]?>'></td>
</tr>
</table>
}
}

이런식으로 테이블을 감싸주니까 해결되었어요 ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ
wr_body_1[0] 에만 아무것도 입력하지 않을경우니까 다른건 입력하고 저기만 입력안하면
안보이게 되지만. 그럴경우는 없으니까 저것만으로도 해결되네요

아 정말 감사드립니다.  아 속이 다 시원해요. 아우...........
감사드리구요~~ 즐거운 하루 되세요.
이런 보답으로 충분하지 않겠지만 포인트라도 쏘겠습니다!!!!!!!!!!!!!
전체 66,554 |RSS
그누4 질문답변 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT