Cómo convertir esta consulta SQL en una transacción PDO sin errores

Cómo convertir esta consulta SQL en una transacción PDO sin errores

Tengo esta consulta SQL:

BEGIN;
INSERT INTO users (username, password)
  VALUES('alpha', 'omega');
INSERT INTO profiles (userid, cv, website) 
  VALUES(LAST_INSERT_ID(),'some cv things', 'www.domain.com');
COMMIT;

Y quiero usar PDO en lugar de MYSQL Transcation para poder extraer el catched error porque no lo obtengo del MYSQL Transacción, lo que probé fue

$dbh->beginTransaction();
try {
 $stmt = $dbh->prepare("
  INSERT INTO users (username, password)
    VALUES('alpha', 'omega');
  INSERT INTO profiles (userid, cv, website) 
    VALUES(LAST_INSERT_ID(),'some cv things', 'www.domain.com');
 ");
 $stmt->execute();
 $dbh->commit();
} catch (PDOException $e) {
 $dbh->rollback();
 throw $e;
}

Pero seguí recibiendo este error

Uncaught PDOException: There is no active transaction . . . PDO->rollBack() #1 {main} thrown

Los registros fueron INSERTen la tabla, pero el error seguía mostrándose también.

Intenté usar $dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE); pero aún recibí el mensaje de error.

Luego intenté eliminar try-catch y conservé el Query con las transacciones PDO y obtuve este mensaje de error

Uncaught PDOException: There is no active transaction . . . PDO->commit() #1 {main} thrown
Mostrar la mejor respuesta

@Chris Intenté ambos pero no funcionó.

¿Qué significa "no funcionó"? Lea Cómo preguntar.

@Chris no ocultó el problema, que es el mensaje de error.

El problema radica en el hecho de que está ejecutando 2 consultas a través de prepare. Divídalo en dos llamadas a prepare o exec, o incluso query. Tus parámetros ya están limpios, no hay necesidad de preparar nada.

Si no está pasando ningún parámetro, hágalo así:

try {
    $stmt = $dbh->exec('
        INSERT INTO `users` (`username`, `password`)
        VALUES("alpha", "omega");
    ');

    $stmt_2 = $dbh->exec('
         INSERT INTO `profiles` (`userid`, `cv`, `website`) 
         VALUES(LAST_INSERT_ID(), "some cv things", "www.domain.com");
    ');
} catch (PDOException $e) {
    $dbh->rollback();
    throw $e;
}

esto ejecutará la consulta; no necesita prepararse porque ya está escapando de sus cadenas, por lo que un simple $dbh->exec hará el truco :)

Está throwing la excepción en su controlador de errores:

catch (PDOException $e) {
 $dbh->rollback();
 throw $e;  // <-- right here
}

Eso hará que la excepción continúe hasta que se maneje, y si no se maneja arrojará un error fatal:

Cuando se lanza una excepción, el código que sigue a la instrucción no se ejecutará y PHP intentará encontrar la primera coincidencia catch. Si no se detecta una excepción, se emitirá un error grave de PHP con el mensaje "Excepción no detectada...", a menos que se haya definido un controlador con set_exception_handler().

Si su controlador de excepciones está manejando completamente la excepción, debe eliminar esa línea.

¿Qué significa "eliminó todo el try-catch"? ¿Eliminó esos bloques completos, incluido el código dentro de ellos, por lo que todo lo que queda de la pregunta es $dbh->beginTransaction();? Entonces no puedo ayudarte porque no puedo ver ningún otro código.

eliminó try{} catch(PDOException $e){throw $e;} no hay nada más dentro.