sql 질문드립니다.

sql 질문드립니다.

QA

sql 질문드립니다.

본문

안녕하세요

 

게시글을 쓸때마다

회원가입자의  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

에러 나는 중입니다. ㅠ

 


<?php
// 필요한 데이터 설정
$wr_subject = "제목";
$wr_name = "이름";
$wr_1 = "데이터1";
$wr_2 = "데이터2";
$wr_3 = "데이터3";
$wr_4 = "데이터4";
$wr_5 = "데이터5";
$wr_6 = "데이터6";
$wr_7 = "데이터7";
$wr_8 = "데이터8";
$wr_9 = "데이터9";
$wr_10 = "";
$wr_content = "게시물 내용";
// 데이터베이스 연결 설정
    $db_host = 'localhost';
    $db_user = 'test';
    $db_password = '1234';
    $db_name = 'test';
$db = new mysqli($db_host, $db_user, $db_password, $db_name);
if ($db->connect_error) {
    die("데이터베이스 연결 실패: " . $db->connect_error);
}
// 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)
    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);
    if ($stmt->execute()) {
        $stmt->close();
        $db->close();
        echo '데이터가 성공적으로 입력되었습니다.';
    } else {
        echo '데이터 삽입 실패: ' . $stmt->error;
    }
} else {
    echo '쿼리 준비 실패: ' . $db->error;
}

이 질문에 댓글 쓰기 :

답변 2

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


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)

 

No data supplied for parameters in prepared statement 부분은

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

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

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


// 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;
}

답변정말 감사합니다.
해당 쿼리는
게시글 작성시 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'];

}

  

 

 

 

답변을 작성하시기 전에 로그인 해주세요.
전체 239
QA 내용 검색

회원로그인

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