Tipo de base de datos: MariaDB
Motor de tabla: InnoDB
Tengo una tabla donde dentro tiene una columna con un valor que se está incrementando (no automático, no se inserta en esta tabla)
Cuando ejecuto la siguiente consulta SQL en phpMyAdmin, funciona bien como debería:
UPDATE `my_table` SET `my_column` = LAST_INSERT_ID(`my_column` + 1) WHERE `my_column2` = 'abc'; SELECT LAST_INSERT_ID(); Lo anterior me devuelve el último valor de la tabla my_column cuando ocurrió la consulta. Esta consulta se tomó directamente de los documentos de mysql sobre el bloqueo: https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html (hacia abajo) y esta parece ser la forma recomendada de trabajar con contadores cuando no quieres que se vea afectado por otras conexiones.
Mi DOP:
try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // set the PDO error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "UPDATE `my_table` SET `my_column` = LAST_INSERT_ID(`my_column` + 1) WHERE `my_column2` = 'abc'; SELECT LAST_INSERT_ID();"; // Prepare statement $stmt = $conn->prepare($sql); // execute the query $stmt->execute(); $result = $stmt->fetchColumn(); // causes general error $result = $stmt->fetch(PDO::FETCH_ASSOC);// causes general error // echo a message to say the UPDATE succeeded echo $stmt->rowCount() . " records UPDATED successfully"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; Error exacto SQLSTATE[HY000]: General error , si elimino las líneas donde intento obtener el resultado, actualiza la columna, pero aún no tengo un resultado de retorno... ¿cómo realizo esa consulta de actualización y obtengo el seleccione el resultado todo de una vez como lo hago cuando lo ejecuto en phpMyAdmin? Todo esto debe suceder de una vez según lo especificado en los documentos de MySQL, por lo que no tengo problemas en los que dos conexiones puedan obtener el mismo contador.
No es necesario realizar SELECT LAST_INSERT_ID(); . PDO guardará ese valor automáticamente para usted y podrá sacarlo de PDO.
Simplemente haz esto:
$conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8mb4", $username, $password, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]); $sql = "UPDATE `my_table` SET `my_column` = LAST_INSERT_ID(`my_column` + 1) WHERE `my_column2` = 'abc'"; // Prepare statement $stmt = $conn->prepare($sql); // execute the query $stmt->execute(); $newID = $conn->lastInsertId(); lastInsertId() le dará el valor del argumento evaluado por LAST_INSERT_ID() .