stmt mysql_insert_id last insert_id php pdo lastinsertid

mysql_insert_id - select @@ identity as id php



PDO lastInsertId() siempre devuelve 0 (2)

Me encontré con un problema. Mi framework estaba funcionando bien con PHP 5.3.0. Actualicé mi versión de PHP a PHP 5.4.x y comencé a tener algunos problemas con algunas partes de mi marco.

Después de la actualización de la versión de PHP, PDO lastInsterId() siempre devuelve 0 .

Tengo el campo de autoincremento llamado id . Está agregando los datos a la base de datos sin ningún problema.

Por alguna razón, sigo recibiendo 0 como último id de inserción.

Aquí está mi código;

databaseobjects.php

public static function create () { global $db; $attributes = self::sanitize(static::$fields); $sql = "INSERT INTO ".PREFIX.static::$table_name." ("; $sql .= join(", ", array_keys($attributes)); $sql .= ") VALUE (:"; $sql .= join(", :", array_keys($attributes)); $sql .= ")"; return ($db->crudQuery($sql, $attributes)) ? true : false; } public static function lastInsertID () { global $db; return $db->handler->lastInsertId(); }

database.php

public function crudQuery($sql, $data) { $sth = $this->handler->prepare($sql); return $sth->execute($data); }

Se llama al primer método create() , luego se llama al método crudQuery() . Como mencioné antes, puedo agregar los datos con éxito a la base de datos MySQL. Lamentablemente, cuando llamo lastInsterID() método lastInsterID() , siempre devuelve 0.

Estaré muy contento de poder ayudarme con este problema antes de obtener la última identificación con SQL Query (:


Aparte de un error en php / PDO o su marco, hay dos posibilidades. O se lastInsertId() en una conexión MySQL diferente a la inserción, o bien se genera el ID en su aplicación / infraestructura y se inserta, en lugar de dejar que auto_increment lo genere por usted. ¿Qué columna de la tabla es la clave principal / auto_increment? ¿Esa columna está incluida en $attributes en tu función create() ?

Puede probar PDO para asegurarse de que esa parte está funcionando correctamente con este código (en un archivo nuevo):

// Replace the database connection information, username and password with your own. $conn = new PDO(''mysql:dbname=test;host=127.0.0.1'', ''user'', ''password''); $conn->exec(''CREATE TABLE testIncrement '' . ''(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50))''); $sth = $conn->prepare(''INSERT INTO testIncrement (name) VALUES (:name)''); $sth->execute(['':name'' => ''foo'']); var_dump($conn->lastInsertId()); $conn->exec(''DROP TABLE testIncrement'');

Cuando ejecuté este script, el resultado fue

string(1) "1"


Después de confirmar una transacción, PDO :: lastInsertID () devolverá 0, por lo que es mejor llamar a este método antes de confirmar la transacción.