WordPress 데이터베이스에서 마지막으로 삽입 된 행 ID를 얻는 방법은 무엇입니까?


95

내 WordPress 플러그인에는 ID라는 AUTO_INCREMENT 기본 키 필드 가있는 테이블이 있습니다. 새 행이 테이블에 삽입되면 삽입의 ID 값을 얻고 싶습니다.

이 기능은 AJAX를 사용하여 데이터를 서버에 게시하여 DB에 삽입하는 것입니다. 클라이언트 상태를 업데이트하기 위해 새 행 ID가 AJAX 응답에 반환됩니다. 여러 클라이언트가 동시에 데이터를 서버에 게시 할 수 있습니다. 따라서 각 AJAX 요청이 응답으로 정확한 새 행 ID를 얻도록해야합니다.

PHP에는이 기능을위한 mysql_insert_id 라는 메소드가 있지만 , 마지막 작업의 link_identifier 인자가 있어야 경쟁 조건에 유효 합니다. 데이터베이스 작업은 $ wpdb에 있습니다. $ wpdb 에서 link_identifier 를 추출하여 mysql_insert_id가 작동하는지 확인 하는 방법은 무엇입니까? $ wpdb에서 마지막 삽입 행 ID를 얻는 다른 방법이 있습니까?

감사.


링크 | 리소스에 저장되어 $wpdb->dbh있지만 같이 정의된다 protected $dbh;... 당신이 :) 아래에 따라서, 사용하는 응답 직접 액세스 할 수 없습니다 소우
jave.web

답변:


191

$wpdb->insert()삽입이 끝나면 바로 다음 과 같이하십시오.

$lastid = $wpdb->insert_id;

WordPress 방식으로 작업하는 방법에 대한 자세한 내용은 WordPress 코덱에서 찾을 수 있습니다. 위의 세부 정보는 wpdb 클래스 페이지 에서 찾을 수 있습니다.


다음과 같 $lastid = $wpdb->$insert_id 습니까?
Francisco Corrales Morales

"이 함수는 행을 삽입 할 수 없으면 false를 반환합니다. 그렇지 않으면 영향을받는 행 수 (항상 1)를 반환합니다." 발신자 : codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
unbreak

1
@unbreak-잘못된 함수가 있습니다 ... wpdb-> insert ($ table, $ data, $ format);
jsnfwlr 2015

4
$ wpdb-> query를 사용하면 여전히 insert_id를 할당한다는 사실을 아는 것도 유용합니다.
Dave Scotese

2
필요하지는 않았지만 한 줄에 필요하지 않기 때문에 약간의 문장이 강조되고 들여 쓰기가 제거되었다고 생각합니다.
kamal pal 2016 년

14

이것이 내 코드에서 내가 한 방법입니다.

 ...
 global $wpdb;
 $query =  "INSERT INTO... VALUES(...)" ;
 $wpdb->query(
        $wpdb->prepare($query)
);
return $wpdb->insert_id;
...

더 많은 클래스 변수


1
"이 함수는 행을 삽입 할 수 없으면 false를 반환합니다. 그렇지 않으면 영향을받는 행 수 (항상 1)를 반환합니다." from : codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
unbreak

1
효과가있다. $wpdb->query는 영향을받은 행 의 길이를 반환하고 $wpdb->insert_id마지막으로 삽입 된 ID를 가지고 있습니다. 감사!
Fabio Montefuscolo 2015 년

고유 한 열의 중복 열 값으로 인해 오류를 반환하는 삽입을 캡처하고 싶기 때문에이 방법이 더 좋습니다. 할 수있는 방법이 없습니다 INSERT IGNORE$wpdb->insert불행하게도이.
Solomon Closson

@unbreak- insert_id영향을받은 행 수가 아니라 나에게 반환되는 것 같습니다 .
Solomon Closson

0

이와 같은 일도해야합니다.

$last = $wpdb->get_row("SHOW TABLE STATUS LIKE 'table_name'");
$lastid = $last->Auto_increment;

10
두 개의 레코드가 두 개의 서로 다른 프로세스에 의해 거의 똑같은 시간에 삽입 된 경우 이것이 문제를 일으키지 않을까요? 두 프로세스 모두 동시에 삽입 할 수 있으므로 (또는 거의 동시에) auto_increment가 두 프로세스에 대해 동일한 수를 반환합니다.
Michael Khalili 2013 년

0

삽입 후 마지막 아이디를 얻어야해서

$lastid = $wpdb->insert_id;

옵션이 아니 었습니다.

다음을 수행 했습니까?

global $wpdb;
$id = $wpdb->get_var( 'SELECT id FROM ' . $wpdb->prefix . 'table' . ' ORDER BY id DESC LIMIT 1');

-6

mysql_insert_id()트랜잭션 내부에 호출을 넣어야합니다.

mysql_query('BEGIN');
// Whatever code that does the insert here.
$id = mysql_insert_id();
mysql_query('COMMIT');
// Stuff with $id.

4
OP에서 언급 한 것처럼 $ wpdb 개체를 사용하는 것이 아닙니다.
jsnfwlr 2010 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.