2010-08-06 15 views
7

Cuando ejecuto el siguiente en la consola de MySQL, que funciona bien:Usando LAST_INSERT_ID() via PHP?

INSERT INTO videos (embed_code) VALUES ('test code here'); 
SELECT LAST_INSERT_ID(); 

Pero, cuando yo haga las consultas anteriores a través de PHP, el resultado está vacía.

En la abstracción de datos, estoy usando una clase de acceso a la base de datos llamada DB. Así es como he tratado de las consultas anteriores a través de PHP:

$embedCode = htmlentities($_POST['embed_code']); 

//Insert video in database **WORKS** 
DB::query("INSERT INTO videos (embed_code) VALUES ('$embedCode');"); 

//Retrieve id **DOES NOT WORK** 
$row = DB::getSingleRow("SELECT LAST_INSERT_ID();"); 
$videoId = $row[0]; 

No es fiable para que seleccione la nueva identificación por el embed_code, como el embed_code podría repetirse.

Gracias!

Respuesta

4

¿Su clase de base de datos no contiene una función para capturar la última ID de inserción? Pruebe mysql_insert_id() de lo contrario en su lugar.

http://nl.php.net/mysql_insert_id

+0

Sí, estás en lo correcto. ¡Estoy usando PDO y tiene un método 'lastInsertId()'! No pensé en eso. ¡Gracias! –

1

PHP tiene una función llamada mysql_insert_id que le dará el mismo resultado que la consulta SELECT LAST_INSERT_ID();.

0

Hay algunas funciones dedicadas para esto - no se debe utilizar la versión de SQL, ya que no funciona.

En la biblioteca MySQL debe usar la función mysql_insert_id, mientras que el objeto mysqli tiene una propiedad insert-id. Esto, por supuesto, ya puede estar expuesto en cualquier clase DB que esté utilizando.

+0

¿Por qué no funciona? – iX3

0

Puede probar con la función mysql_insert_id de PHP.

Creo que lo que está sucediendo es que cada llamada DB::query está en una transacción diferente, por lo tanto, $row está vacío. Tal vez pueda leer la documentación DB:query para intentar ejecutar ambas llamadas dentro de la misma transacción.

0

mysql_insert_id está en desuso. Entonces creo que este hilo debe ser actualizado.

0

mysql_insert_id está marcado como obsoleto desde PHP 5.5.0.

En este ejemplo, uid es la clave principal de los videos de la tabla.

$row = DB::getMultipleRows("SELECT uid FROM videos WHERE uid=LAST_INSERT_ID();"); 
if (
    isset($row) && 
    is_array($row) && 
    isset($row['0']) && 
    is_array($row['0']) && 
    isset($row['0']['uid']) 
) { 
    $videoId = $row['0']['uid']; 
} 
0

debe devolver lastInsertId of PDO al exterior de su clase. ejemplo:

class DB 
{ 
    public $last_insert_id; 
    function x() 
    { 
     $stmt = $db->prepare($Query); 
     $stmt->execute(); 
     $this->last_insert_id = $db->lastInsertId(); 
    }  
}