2026, 새로운 도약을 시작합니다.

sql 질문드립니다. 채택완료

2년 전 조회 2,098

안녕하세요

게시글을 쓸때마다

회원가입자의  mb_no 순서대로

게시판 여분필드 wr_10에 mb_id 를 기입하려고 합니다.

mb_no 1번 id test1

mb_no 2번 id test2

mb_no 3번 id test3

mb_no 6번 id test6 (가끔 번호를 건너띄더라구요...삭제해서그런가..)

게시글이 작성되면 wr_10 에 test1 입력

다음 게시글이 작성되면 wr_10 에 test2 입력

다음 게시글이 작성되면 wr_10 에 test3 입력

다음 게시글이 작성되면 wr_10 에 test6 입력

다음 게시글이 작성되면 wr_10 에 test1 입력

이런식으로 반복되게 하려 합니다. (admin ID는 제외하구요)

구글링하면서 해보고있는데

잘안되서 여기에 도움요청드려봅니다...ㅠ

전체소스는 아래와같습니다.

현재 

데이터 삽입 실패: No data supplied for parameters in prepared statement

에러 나는 중입니다. ㅠ

Copy

답변 2개

채택된 답변
+20 포인트

다음 서브쿼리가 의미하는 바를 정확히 파악할수 없었기 때문에

Copy


WHERE mb_no = (SELECT IFNULL(MAX(mb_no), 0) % (SELECT MAX(mb_no) FROM g5_member) + 1)

성공 동작 확인을 위해 간단한 쿼리문으로 임시 대체되었고

Copy


WHERE mb_no = (SELECT IFNULL(MAX(mb_no), 0) FROM g5_member)

No data supplied for parameters in prepared statement 부분은

쿼리의 바인딩 홀더와 바인딩 파라미터 개수가 일치하지 않기 때문에 발생합니다.

INSERT 에 사용되는 컬럼 13개 중 1개는 서브쿼리에 의한 할당이므로

실질적 바인딩 파라미터는 12개이며 역시 서브쿼리에 의한 할당부를 제거해야 합니다.

Copy


// SQL 문 실행

$sql = "INSERT INTO g5_write_test (wr_subject, wr_name, wr_1, wr_2, wr_3, wr_4, wr_5, wr_6, wr_7, wr_8, wr_9, wr_10, wr_content)

VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,

    (SELECT IFNULL(mb_id, '') FROM g5_member 

    -- WHERE mb_no = (SELECT IFNULL(MAX(mb_no), 0) % (SELECT MAX(mb_no) FROM g5_member) + 1)

    WHERE mb_no = (SELECT IFNULL(MAX(mb_no), 0) FROM g5_member)

    AND mb_id != 'admin'

    ), ?)";

$stmt = $db->prepare($sql);

if ($stmt) {

    //$stmt->bind_param("sssssssssssss", $wr_subject, $wr_name, $wr_1, $wr_2, $wr_3, $wr_4, $wr_5, $wr_6, $wr_7, $wr_8, $wr_9, $wr_10, $wr_content);

    $stmt->bind_param("ssssssssssss", $wr_subject, $wr_name, $wr_1, $wr_2, $wr_3, $wr_4, $wr_5, $wr_6, $wr_7, $wr_8, $wr_9, $wr_content);

    if ($stmt->execute()) {

        $stmt->close();

        $db->close();

        echo '데이터가 성공적으로 입력되었습니다.';

    } else {

        echo '데이터 삽입 실패: ' . $stmt->error;

    }   

} else {

    echo '쿼리 준비 실패: ' . $db->error;

}

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

답변정말 감사합니다.
해당 쿼리는
게시글 작성시 wr_10에 회원아이디를 mb_no 순서대로 입력이 되게 하려고한것입니다.

구글링하다보니 저런 서브쿼리가 나온것이구요 ㅠㅠ


알려주신 소스로 적용을 해보니
데이터는 정상적으로 들어옵니다.
근데 회원아이디는 마지막 가입한 id만 입력되고 다시 처음 id로 입력되는 반복이 안됩니다.

제가 더 열심히 한번 해보도록 하겠습니다.
감사합니다.

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

서브쿼리로 순서대로 반복해서 아이디를 찾아오는 것은 위와 같은 코드로 될지 의문입니다

또한 게시판의 글을 질문의 코드처럼 등록해서는 사용할 수 없습니다

그리고 mb_no를 아이디와 동시에 기록해두면 편리하겟습니다

분류를 사용하지않는다면 ca_name필드 이용

아니면 wr_link2, wr_homepage등 사용하지않는 필드에 기록

모두 사용한다면 필드를 하나 추가해서 사용

사용스킨폴더에 write_update.head.php화일을 생성하여 다음 내용으로 구성

<?php //ca_name에 mb_no기록할 경우

if(!$w){ //---글을 신규 등록시만 적용

$mb_no =0;

$row=sql_fetch("select ca_name, wr_1 from $write_table where mb_id !='admin' and wr_is_comment=0 order by wr_num limit 0,1"); //마지막 등록된 아이디 찾기

if($row['wr_1']){

  if(!$row['ca_name']){ //아이디가 한번 등록된 이후는 필요없는 코드임

   $row2=sql_fetch("select mb_no from {$g5['member_table']} where mb_id='{$row['wr_1']}' ");

   $mb_no = $row2['mb_no'];

 }else $mb_no = $row['ca_name'];

}

$row3 = sql_fetch("select mb_no, mb_id from {$g5['member_table']} where mb_id !='admin' and mb_no > $mb_no limit 0,1");  

if(!$row3['mb_id'])

$row3 = sql_fetch("select mb_no, mb_id from {$g5['member_table']} where mb_id !='admin' order by mb_no limit 0,1 ");

$ca_name = $row3['mb_no']; $wr_1= $row3['mb_id'];

}else{ //게시글 수정시

 $ca_name = $write['ca_name']; $wr_1= $write['wr_1'];

}

로그인 후 평가할 수 있습니다

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

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

로그인
🐛 버그신고