¿Cómo obtener la última ID de fila insertada de la base de datos de WordPress?

95

Mi complemento de WordPress tiene una tabla con un campo de clave primaria AUTO_INCREMENT llamado ID. Cuando se inserta una nueva fila en la tabla, me gustaría obtener el valor de ID de la inserción.

La característica es usar AJAX para publicar datos en el servidor para insertarlos en la base de datos. La nueva ID de fila se devuelve en la respuesta AJAX para actualizar el estado del cliente. Es posible que varios clientes estén publicando datos en el servidor al mismo tiempo. Por lo tanto, tengo que asegurarme de que cada solicitud AJAX obtenga la nueva ID de fila EXACTA en respuesta.

En PHP, existe un método llamado mysql_insert_id para esta característica, pero es válido para condición de carrera solo si el argumento es link_identifier de la última operación. Mi operación con la base de datos está en $ wpdb. ¿Cómo extraer el identificador de enlace de $ wpdb para asegurarse de que mysql_insert_id funcione? ¿Hay alguna otra forma de obtener la identificación de la última fila insertada de $ wpdb?

Gracias.

Morgan Cheng
fuente
El enlace | recurso está almacenado $wpdb->dbh, pero se define como protected $dbh;... pero no puede acceder a él directamente, por lo tanto, use la respuesta a continuación :)
jave.web

Respuestas:

191

Inmediatamente después de $wpdb->insert()que hace la inserción, haga esto:

$lastid = $wpdb->insert_id;

Puede encontrar más información sobre cómo hacer las cosas a la manera de WordPress en el códice de WordPress. Los detalles anteriores se encontraron aquí en la página de la clase wpdb

jsnfwlr
fuente
¿Es así $lastid = $wpdb->$insert_id :?
Francisco Corrales Morales
"Esta función devuelve falso si la fila no se pudo insertar. De lo contrario, devuelve el número de filas afectadas (que siempre será 1)". De: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
unbreak el
1
@unbreak - función incorrecta allí ... estás leyendo sobre wpdb-> insert ($ tabla, $ datos, $ formato);
jsnfwlr
4
También es útil saber que si usa $ wpdb-> query, aún asignará insert_id.
Dave Scotese
2
no era necesario, pero creo que mejora un poco, se resalta la declaración y se elimina la sangría, ya que no es necesario para una sola línea.
kamal pal
14

Así es como lo hice, en mi código

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

Más variables de clase

Francisco Corrales Morales
fuente
1
"Esta función devuelve falso si la fila no se pudo insertar. De lo contrario, devuelve el número de filas afectadas (que siempre será 1)". from: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
unbreak el
1
Funciona. Las $wpdb->querydeclaraciones de la len de filas afectadas y $wpdb->insert_idtiene el último ID insertado. ¡Gracias!
Fabio Montefuscolo
Esto es mejor para mí, porque quiero capturar inserciones que, de lo contrario, devolverán un error debido a valores de columna duplicados en una columna única. No hay ninguna manera de INSERT IGNOREla $wpdb->insertdesgracia.
Solomon Closson
@unbreak: parece que me devuelve el insert_id, no el número de filas afectadas.
Solomon Closson
0

Algo como esto también debería hacerlo:

$last = $wpdb->get_row("SHOW TABLE STATUS LIKE 'table_name'");
$lastid = $last->Auto_increment;
Martín
fuente
10
¿No causaría esto un problema si dos registros fueran insertados casi al mismo tiempo por dos procesos diferentes? Ambos procesos podrían insertarse al mismo tiempo (o lo suficientemente cerca del mismo tiempo) para que el auto_increment devuelva el mismo número para ambos procesos.
Michael Khalili
0

Necesitaba obtener la última forma de identificación después de insertarla, así que

$lastid = $wpdb->insert_id;

No era una opción.

Hizo lo siguiente:

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

Poniendo la llamada mysql_insert_id()dentro de una transacción, debería hacerlo:

mysql_query('BEGIN');
// Whatever code that does the insert here.
$id = mysql_insert_id();
mysql_query('COMMIT');
// Stuff with $id.
Ollie Saunders
fuente
4
Eso no es hacerlo usando el objeto $ wpdb como se mencionó en el OP.
jsnfwlr