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.