PHP 및 그누보드에서 MySQL 마지막 PK(autoincrement) 값 획득 방법
페이지 정보

본문
데이터를 입력한 직후 생성된 PK 값을 가져오는 방법을 파악하여 그누보드 기능을 적용하거나 문제를 해결하려는 운영자·개발자에게 유용한 가이드를 제공합니다.
데이터 INSERT 직후 마지막 PK 값 획득 방법
데이터베이스에 INSERT 명령으로 데이터를 입력한 직후 AUTO_INCREMENT로 생성된 마지막 PK(Primary Key) 값을 가져오는 방법은 PHP 함수와 MySQL SQL 함수를 사용하는 방식이 있습니다.
1. PHP 함수 사용 방법
mysql_insert_id(): PHP 3, PHP 4, PHP 5 환경에서 최근INSERT작업으로 생성된 식별자 값을 반환합니다. 연결 식별자(link_identifier)를 지정하지 않으면 마지막에 열린 링크를 사용합니다.mysqli_insert_id(): PHP 5 및 PHP 7 등mysqli를 사용하는 환경에서 최근 쿼리에 사용된 자동 생성 ID를 반환합니다.
2. MySQL SQL 함수 사용 방법
LAST_INSERT_ID(): MySQL 내부 함수를 직접 쿼리로 실행하여 가져오는 방식입니다.BIGINT(64비트) 등mysql_insert_id()의 정수형 변환 과정에서 발생할 수 있는 오류를 방지하고자 할 때 유용하며,LAST_INSERT_ID()값은 가장 최근에 생성된AUTO_INCREMENT값을 보관하며 쿼리 사이에서 없어지지 않습니다.
3. 그누보드 5 환경에서의 활용
그누보드 5.1.3 이후 버전부터는 lib/common.lib.php 파일에 데이터베이스 연결 상태와 환경에 맞춰 함수를 분기해 주는 전용 함수가 추가되어 있습니다.
function sql_insert_id($link=null) {
global $g5;
if(!$link) $link = $g5['connect_db'];
if(function_exists('mysqli_insert_id') && G5_MYSQLI_USE)
return mysqli_insert_id($link);
else
return mysql_insert_id($link);
}
그누보드에서 sql_query()로 INSERT 쿼리를 실행한 직후 아래와 같이 호출하여 마지막으로 생성된 wr_id나 PK 값을 확보할 수 있습니다.
$sql = " insert into {$g5['board_new_table']}... ";
sql_query($sql);
$insert_id = sql_insert_id();
주의사항:
mysql_insert_id()계열 함수는 직전의INSERT질의에 의해 생성된 값을 반환하므로, 반드시 값을 생성하는 질의를 실행한 직후에 호출해야 합니다. 이전 질의가AUTO_INCREMENT값으로 생성된 것이 아니라면0을 반환합니다.
그누보드5 환경의 마지막 PK 값 획득 함수
그누보드 5.1.3 이후 버전부터는 데이터베이스에 INSERT 질의를 수행한 직후 생성된 AUTO_INCREMENT PK 값을 안전하게 가져올 수 있도록 내부 공통 함수인 sql_insert_id()를 제공하고 있습니다.
사용 방법 및 활용 예시
데이터를 등록하는 sql_query() 실행 직후에 $wr_id = sql_insert_id(); 형태와 같이 호출하여 마지막으로 생성된 ID 값을 변수에 담아 활용할 수 있습니다.
$sql = " insert into {$g5['write_table']} set... ";
sql_query($sql);
$wr_id = sql_insert_id();
그누보드 내부 함수 소스 및 호환성 조건
그누보드5의 /lib/common.lib.php에 정의된 sql_insert_id() 함수의 소스 코드는 다음과 같습니다.
function sql_insert_id($link=null) {
global $g5;
if(!$link) $link = $g5['connect_db'];
if(function_exists('mysqli_insert_id') && G5_MYSQLI_USE)
return mysqli_insert_id($link);
else
return mysql_insert_id($link);
}
이 함수는 config.php의 G5_MYSQLI_USE 설정값과 PHP 환경에 따라 mysqli_insert_id() 또는 mysql_insert_id()를 선택적으로 실행하여 버전 호환성을 지원합니다.
sqlinsertid() 함수 호출 시 0 반환 또는 오류 발생 원인과 대처 방법
그누보드 환경에서 데이터를 입력한 직후 sql_insert_id() 함수를 호출할 때 0이 반환되거나 500 오류 등이 발생하는 원인과 대처 방법은 다음과 같다.
1. 주요 원인
- INSERT 직후 호출 누락 또는 순서 문제:
sql_insert_id()함수는 직전의 INSERT 질의로AUTO_INCREMENT컬럼에 생성된 값을 가져오는 함수이므로, 다른 쿼리가 중간에 실행되었거나 올바른 위치에서 호출되지 않으면 0이 반환될 수 있다. - 유효하지 않은 데이터베이스 연결 객체: PHP 버전 변경(예: PHP 5.3에서 PHP 8.2로 업그레이드 등) 환경에서
$g5['connect_db']연결 객체가 올바르게 유지되지 않거나,mysqli_insert_id()대신 구버전mysql_insert_id()함수 호출이 충돌을 일으켜 오류가 발생할 수 있다.
2. 대처 및 확인 방법
- 호출 위치 확인: 데이터베이스에 데이터를 추가하는
sql_query($sql)실행 직후 바로$wr_id = sql_insert_id();코드가 위치하고 있는지 확인한다. - 연결 객체 및 함수 점검: 그누보드 5.1.3 이후 버전의 라이브러리(
lib/common.lib.php)에 정의된sql_insert_id($link=null)함수가 활성화된G5_MYSQLI_USE설정에 맞춰mysqli_insert_id($link)를 정상적으로 호출하고 있는지 확인한다.
상황별 마지막 PK 값 획득 방법
| 내 상황 | 우선할 판단 | 다음 행동 |
|---|---|---|
| 그누보드5 운영 중<br>(PHP 5.3 ~ PHP 8.2) | sql_query() 실행 직후 sql_insert_id() 함수 호출 | 별도의 추가 쿼리 없이 $wr_id = sql_insert_id(); 코드를 바로 이어 배치 |
| 순수 PHP 환경<br>(PHP 5.5 이상 또는 PHP 7/8) | mysqli_insert_id() 사용 또는 MySQL LAST_INSERT_ID() 활용 | mysql_insert_id()는 지원 중단되었으므로 mysqli 확장 함수나 SQL 함수로 전환 |
| BIGINT(64비트) PK 사용<br>(대규모 데이터 환경) | PHP 정수형 변환 오차 방지를 위해 MySQL 구문 검토 | mysqli_insert_id() 대신 SQL 내장 함수 LAST_INSERT_ID()를 직접 쿼리로 실행하여 확보 |
실전 FAQ
Q. sql_insert_id()를 호출했는데 자꾸 0이 반환됩니다.
- 원인 및 대처:
sql_insert_id()는 직전의INSERT질의로AUTO_INCREMENT값이 생성된 경우에만 유효합니다.sql_query()로 데이터를 입력한 직후에 호출하지 않고 중간에 다른 쿼리가 실행되었거나,INSERT가 아닌 다른 방식의 쿼리가 수행되었는지 확인해야 합니다. 또한 그누보드 5.1.3 이후 버전의lib/common.lib.php에 정의된 함수가 현재 서버의G5_MYSQLI_USE설정과 연결 객체($g5['connect_db'])를 올바르게 참조하고 있는지 점검해야 합니다.
Q. 글을 쓰기 전에 미리 wr_id(PK) 값을 알아낼 수 있나요?
- 원인 및 대처: 데이터베이스에 실제
INSERT가 일어나기 전에는AUTO_INCREMENTPK 값을 미리 확정할 수 없습니다. 단순히 테이블의 최대(MAX) ID 값을 조회하는 방식을 쓰면 동시 접속 환경이나 글 삭제 시 번호 꼬임 현상이 발생할 수 있으므로, 반드시 데이터를 입력하는sql_query($sql)실행을 완료한 직후에 함수를 호출하여 값을 확보해야 합니다.
함께 보면 좋은 글
- PHP 에러 제어 연산자(@) 사용법과 MySQL 에러 메시지 숨기기
- PHP MySQL 데이터 패치 함수 비교: mysqlfetchrow와 mysqlfetcharray 차이점과 올바른 사용법
- PHP MySQL 데이터 삭제 로직 구현 가이드
참고자료
기타 참고자료
- php.net — PHP: mysqlinsertid - Manual
- sir.kr — sqlinsertid() 질문좀요 - SIR - 개발자 커뮤니티
- sir.kr — 그누보드 sqlinsertid() 에러 도와주세요 - SIR - 개발자 커뮤니티
- sir.kr — sqlinsertid() 함수 질문이요. - SIR - 개발자 커뮤니티
- m.blog.naver.com — PHP의 mysqlinsertid() 와 MySQL의 lastinsertid() : 네이버 블로그
- happyjung.com — MySQL의 마지막 PK값 획득.. mysqlinsertid() 와 lastinsertid() > 기술자료 | 해피정닷컴
- 이전글MySQL과 PHP 환경에서의 비밀번호 해시 함수 취약점 분석 및 보안 강화 가이드 26.10.08
- 다음글그누보드 회원 탈퇴와 삭제 처리 메커니즘 분석 26.10.06
댓글목록
등록된 댓글이 없습니다.