2009-10-16 19 views
62

Mi complemento de WordPress tiene una tabla con un campo de clave principal AUTO_INCREMENT llamado ID. Cuando se inserta una nueva fila en la tabla, me gustaría obtener el valor ID de la inserción.¿Cómo obtener la última fila de ID de la base de datos de WordPress?

La característica es usar AJAX para publicar datos en el servidor para insertarlos en DB. La nueva ID de fila se devuelve en la respuesta de 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 de AJAX obtenga la nueva ID de fila EXACTA en respuesta.

En PHP, hay un método llamado mysql_insert_id para este feature.But, es válido para la condición de carrera sólo si el argumento es id_enlace de la última operación. Mi operación con la base de datos está en $ wpdb. Cómo extraer el link_identifier desde $ wpdb para asegurarse de que mysql_insert_id funcione? ¿Hay alguna otra forma de obtener la identificación de la última inserción insertada desde $ wpdb?

Gracias.

+0

El link | resource se almacena en '$ wpdb-> dbh', pero se define como' protected $ dbh; '... sou no se puede acceder directamente, por lo tanto, use la respuesta a continuación :) –

Respuesta

128

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

$lastid = $wpdb->insert_id; 

Más información acerca de cómo hacer las cosas la forma wordpress se puede encontrar en wordpress codex. Los datos anteriores se encuentran aquí en el Algo wpdb class page

+0

¿Es así: '$ lastid = $ wpdb -> $ insert_id'? –

+0

"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: http://codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows – unbreak

+1

@unbreak - función incorrecta allí ... estás leyendo acerca de wpdb-> insert ($ table, $ data, $ format); – jsnfwlr

-2

deja una llamada a mysql_insert_id() dentro de una transacción, debe hacerlo:

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

Eso es n no hacerlo usando el objeto $ wpdb como se mencionó en el PO. – jsnfwlr

0

como esto debería hacerlo también:

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

¿No sería esto un problema si dos procesos diferentes insertaran dos registros casi al mismo tiempo? Ambos procesos podrían insertarse al mismo tiempo (o lo suficientemente cerca de la misma hora) para que auto_increment devuelva el mismo número para ambos procesos. –

7

Ésta es la forma en que lo hice, en mi código

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

More Class Variables

+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)". desde: http://codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows – unbreak

+1

Funciona. La '$ wpdb-> query' devuelve la len de las filas afectadas y' $ wpdb-> insert_id' tiene la última identificación insertada. ¡Gracias! –

+0

Esto es mejor para mí, porque quiero capturar inserciones que de lo contrario devolverán un error debido a los valores de columna duplicados en una columna única. No hay forma de 'INSERTAR IGNORAR' con' $ wpdb-> insert' por desgracia. –

Cuestiones relacionadas