BOARD

자료·레퍼런스

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

페이지 정보

profile_image
작성자 최고관리자
댓글 0건 조회 10회 작성일 26-10-07 17:38

본문

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

데이터를 입력한 직후 생성된 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_INCREMENT PK 값을 미리 확정할 수 없습니다. 단순히 테이블의 최대(MAX) ID 값을 조회하는 방식을 쓰면 동시 접속 환경이나 글 삭제 시 번호 꼬임 현상이 발생할 수 있으므로, 반드시 데이터를 입력하는 sql_query($sql) 실행을 완료한 직후에 함수를 호출하여 값을 확보해야 합니다.

함께 보면 좋은 글

참고자료

기타 참고자료

댓글목록

등록된 댓글이 없습니다.