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;
}
서브쿼리로 순서대로 반복해서 아이디를 찾아오는 것은 위와 같은 코드로 될지 의문입니다
또한 게시판의 글을 질문의 코드처럼 등록해서는 사용할 수 없습니다
그리고 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'];
}